Git Pull ขณะที่เพิกเฉยต่อการเปลี่ยนแปลงในท้องถิ่น?


489

มีวิธีการgit pullที่จะเพิกเฉยต่อการเปลี่ยนแปลงไฟล์ใด ๆ ในเครื่องโดยไม่ทำให้ไดเรคทอรีหายไปและต้องทำgit clone?


17
โดย "ไม่สนใจ" คุณหมายถึง "overwrites" หรือไม่
Cascabel

@Cascabel มันหมายถึงการที่จะเปลี่ยนทุกการเปลี่ยนแปลงท้องถิ่น uncommit ทั้งหมดที่กระทำท้องถิ่นลบทุกไฟล์ใหม่ในประเทศและไดเรกทอรียกเลิกการลบไฟล์ทั้งหมดที่ถูกลบทั้งในประเทศและไดเรกทอรี ฯลฯ rm -rf local_repo && git clone remote_urlในระยะสั้นเพียงแค่เรียกใช้คำสั่งเช่นถ้า
Victor

คำตอบ:


820

ถ้าคุณหมายถึงคุณต้องการให้ pull เขียนทับการเปลี่ยนแปลงในท้องถิ่นให้ทำการผสานราวกับว่าแผนผังการทำงานนั้นสะอาดดีให้ทำความสะอาดแผนผังการทำงาน:

git reset --hard
git pull

หากมีไฟล์โลคัลที่ไม่ได้ติดตามคุณสามารถใช้git cleanเพื่อลบออก ใช้git clean -fเพื่อลบไฟล์ที่ไม่ได้-dfติดตามและลบไฟล์และไดเรกทอรี-xdfที่ไม่ได้ติดตามและเพื่อลบไฟล์หรือไดเรกทอรีที่ไม่ได้ติดตามหรือไม่สนใจ

หากในอีกทางหนึ่งที่คุณต้องการให้การแก้ไขในพื้นที่อยู่อย่างใดคุณควรใช้ที่ซ่อนเพื่อซ่อนไว้ก่อนที่จะดึงแล้วนำไปใช้ใหม่ในภายหลัง:

git stash
git pull
git stash pop

ฉันไม่คิดว่ามันสมเหตุสมผลที่จะเพิกเฉยต่อการเปลี่ยนแปลง แต่อย่างใด - การดึงครึ่งหนึ่งเป็นการรวมเข้าด้วยกันและจำเป็นต้องรวมเนื้อหาเวอร์ชันที่คอมมิทเข้ากับเวอร์ชั่นที่ดึงมา


4
หากหลังจากgit resetไฟล์ของคุณยังคงแตกต่างจากรีโมทให้อ่าน stackoverflow.com/questions/1257592/…
Colonel Panic

3
Git เป็นสิ่งที่แปลกประหลาดที่สุดเท่าที่เคยมีมา รีเซ็ต Git - สำเร็จแล้ว จากนั้นสถานะ git: สาขาของคุณอยู่ข้างหน้า 2 คอมมิชชัน
Shailen

21
@shailenTJ "การเปลี่ยนแปลงในท้องที่" ที่นี่หมายถึงการเปลี่ยนแปลงที่ไม่ผูกมัดไม่ใช่การกระทำในท้องถิ่น git reset --hardส่งผลกระทบต่ออดีตไม่ใช่อย่างหลัง หากคุณต้องการรีเซ็ตเป็นสถานะของรีโมตอย่างสมบูรณ์git reset --hard origin/<branch>- แต่บ่อยครั้งและในกรณีนี้ทั้งสองยอมรับว่าคุณทำงานก่อนหน้านี้โดยเป็นงานที่คุณทำไม่ใช่สิ่งที่คุณต้องการทิ้ง
Cascabel

2
ดังนั้นนี่เป็นสิ่งเดียวกับการทำลายที่เก็บข้อมูลในเครื่องและดาวน์โหลดซ้ำใช่ไหม ฉันแค่ต้องการที่จะสามารถบังคับให้ดึงและเขียนทับการเปลี่ยนแปลงเพื่อความสะดวก 99% ของเวลาที่ฉันได้รับข้อความแสดงข้อผิดพลาดนี้เมื่อฉันตั้งใจทำบางสิ่งบางอย่างที่เกิดขึ้นในท้องถิ่นและเพียงต้องการที่จะเริ่มต้นจาก repo
sudo

ถ้าคุณไม่สามารถเปลี่ยนหัวได้ เช่น repo นั้นถูกสร้างขึ้นบนระบบไฟล์ case และถูกโคลนบนระบบไฟล์ case case และมี 2 ไฟล์ที่มีชื่อเหมือนกัน
xster

305

สำหรับฉันทำงานต่อไปนี้:

(1) เรียกการเปลี่ยนแปลงทั้งหมดก่อน:

$ git fetch --all

(2) รีเซ็ตต้นแบบ:

$ git reset --hard origin/master

(3) ดึง / อัปเดต:

$ git pull

22
ทำงานได้ดีสำหรับฉันเมื่อมีปัญหามากมายกับคำตอบที่ดีที่สุด ขอบคุณ!
0x0

6
สิ่งนี้ยังใช้งานได้เมื่อคุณ
กำหนดการ

16
นี้ควรจะเป็นคำตอบด้านบน :)
Purus

5
@Marco Servetto: คุณเรียกการเปลี่ยนแปลง git ทั้งหมดของคุณก่อน แต่ยังไม่ได้ใช้ จากนั้นคุณรีเซ็ตต้นแบบเป็นสถานะสุดท้าย (อัปเดต) หากคุณข้ามขั้นตอนแรกคุณจะคืนค่าการเปลี่ยนแปลงเป็นเจ้านายเก่า (ในระบบ) จากประสบการณ์ของฉันวิธีที่ฉันอธิบายไม่เคยทำให้เกิดปัญหา ความพยายามอื่น ๆ ทั้งหมดทำในตอนท้าย
Artur Barseghyan

1
สิ่งนี้ใช้งานได้สำหรับฉันฉันต้องการเพิกเฉยต่อการเปลี่ยนแปลงในเครื่องของฉันทั้งหมดรวมถึงการกู้คืนไฟล์ที่ถูกลบ
Neri

28

คุณแค่ต้องการคำสั่งที่ให้ผลลัพธ์เหมือนrm -rf local_repo && git clone remote_urlกันใช่ไหม? ฉันต้องการคุณสมบัตินี้ด้วย ฉันสงสัยว่าทำไมคอมไพล์ไม่ได้ให้คำสั่งดังกล่าว (เช่นgit recloneหรือgit sync) และทั้ง svn ไม่ให้คำสั่งดังกล่าว (เช่นsvn recheckoutหรือsvn sync)

ลองคำสั่งต่อไปนี้:

git reset --hard origin/master
git clean -fxd
git pull

นั่นคือสิ่งที่ใช้งานได้จริงแม้ว่าคุณจะมีข้อผูกพันในท้องถิ่นที่คุณต้องการลบ
Yuri Ghensev

5
เตือนพวก !! git clean -fxdลบไฟล์จาก.gitignoreยัง
Ramesh Navi

@RameshNavi แน่นอน ตรงนี้เป็นสิ่งที่ต้องการ สิ่งที่ต้องการคือมีวิธีที่เร็วกว่าในการโคลนซ้ำอีกครั้งนั่นคือการลบ repo ในเครื่องทั้งหมดแล้วจึงทำการโคลน
วิกเตอร์

27

คำสั่งร้องเคยชินทำงานเสมอ ถ้าคุณทำเพียง:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

และอื่น ๆ ...

หากต้องการเริ่มต้นใหม่จริงๆให้ดาวน์โหลดการกู้คืนและเขียนทับการเปลี่ยนแปลงในเครื่องทั้งหมดของคุณเพียงทำ:


$ git checkout thebranch
$ git reset --hard origin/thebranch

นี้จะทำงานได้ดี

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'

4
ใช่. นี่คือสิ่งที่ฉันต้องการสำหรับสุดยอด "อย่าให้เอฟเกี่ยวกับสิ่งที่อยู่ในท้องถิ่น" ขอบคุณ :)
Adambean


8

ดูที่git stashเพื่อทำให้การเปลี่ยนแปลงในพื้นที่ทั้งหมดของคุณเป็น "stash file" และเปลี่ยนกลับไปเป็นคอมมิทล่าสุด ณ จุดนี้คุณสามารถใช้การเปลี่ยนแปลงที่ถูกเก็บถาวรหรือทิ้งได้


8

หากคุณอยู่บน Linux:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

สำหรับวงจะลบไฟล์ที่ถูกติดตามทั้งหมดซึ่งมีการเปลี่ยนแปลงใน repo ท้องถิ่นดังนั้นgit pullจะทำงานได้โดยไม่มีปัญหาใด ๆ
สิ่งที่ดีที่สุดเกี่ยวกับเรื่องนี้คือมีเพียงไฟล์ที่ถูกติดตามเท่านั้นที่จะถูกเขียนทับโดยไฟล์ใน repo ไฟล์อื่น ๆ ทั้งหมดจะไม่ถูกแตะต้อง


ฉันคิดว่าคุณหมายถึง "ไฟล์ที่ถูกติดตาม" ซึ่งเป็นสิ่งที่ฉันต้องการขอบคุณ
อาลี

มีอะไรเทียบเท่า Powershell บ้าง?
Earlee

8

วิธีที่สั้นที่สุดที่จะทำคือ:

git pull --rebase --autostash

ไม่เคยรู้--autostashมาก่อนขอบคุณ!
shiro

7

สิ่งนี้ใช้ได้สำหรับฉัน

git fetch --all
git reset --hard origin/master
git pull origin master

ด้วยคำตอบที่ยอมรับฉันได้รับข้อผิดพลาดความขัดแย้ง


มันคล้ายกับคำตอบของ Artur Barseghyan ในปี 2015 แต่ฉันก็ยังอยากจะรู้ว่าจุดประสงค์ของคำสั่งที่ 3 คืออะไรไฟล์การทำงานเปลี่ยนไปหลังจากคำสั่งที่ 2 และคำสั่งที่ 3 บอกว่า "ทันสมัยแล้ว "
ไมค์หนู

นั่นเป็นชุดค่าผสมเดียวที่ทำงานกับสภาพแวดล้อมของฉันบางทีคุณอาจเห็นสิ่งที่แตกต่างกันสำหรับฉันฉันต้องการสามคำสั่ง
Pablo Pazos

น่าสนใจ อาจเป็นสิ่งที่รุ่น ฉันใช้คอมไพล์ 2.7.4 แต่ฉันเพิ่งเห็นความคิดเห็นใหม่จาก Artur Barseghyan: "มิฉะนั้นคุณอาจพบว่าตัวเองกำลังทำงานกับเจ้านายที่ล้าสมัยโดยไม่ได้ตั้งใจ"
ไมค์หนู

อาจจะ แต่สิ่งเดียวที่ฉันสามารถพูดได้คือ "สิ่งนี้ได้ผลสำหรับฉันเมื่อไม่มีวิธีแก้ไขปัญหาอื่น" ดังนั้นมันอาจช่วยคนอื่นได้
Pablo Pazos


2

สิ่งนี้จะดึงข้อมูลสาขาปัจจุบันและพยายามที่จะส่งต่ออย่างรวดเร็วไปยังต้นแบบ:

git fetch && git merge --ff-only origin/master

0

.gitignore

"การเพิ่มไฟล์ที่ไม่ต้องการลงใน. gitignore สามารถทำงานได้ตราบใดที่คุณยังไม่ได้กำหนดให้กับทุกสาขา"

นอกจากนี้คุณสามารถเรียกใช้:

git update-index --assume-unchanged filename

https://chamindac.blogspot.com/2017/07/ignoring-visual-studio-2017-created.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.