เลิกทำการดึงคอมไพล์วิธีนำ repos กลับสู่สถานะเดิม


1006

มีวิธีใดที่จะเปลี่ยนหรือยกเลิกการดึง git เพื่อให้แหล่งที่มา / repos ของฉันจะเข้าสู่สถานะเดิมที่เคยทำ git pull หรือไม่? ฉันต้องการทำเช่นนี้เพราะมันรวมไฟล์บางไฟล์ที่ฉันไม่ต้องการให้ทำ แต่รวมไฟล์ที่เหลือเท่านั้น ดังนั้นฉันต้องการเอาไฟล์เหล่านั้นกลับมาเป็นไปได้ไหม?

แก้ไข: ฉันต้องการยกเลิกการคอมไพล์เพื่อชี้แจง หลังจากเห็นคำตอบบางอย่างฉันก็ทำอย่างนี้

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

ตอนนี้ฉันควรทำอย่างไร กำลังทำอะไรgit reset --hard อยู่ ฉันไม่ต้องการขันมันอีกครั้งดังนั้นขอขั้นตอนอย่างละเอียดหรือ


23
ดูเหมือนว่าคุณมีสองสิ่งเท่านั้นในประวัติศาสตร์ของคุณ: โคลนและการดึงข้อมูล เพิ่งรีเซ็ตเป็นโคลน: git reset --hard 01b34faในกรณีนี้คุณสามารถทำได้git reset --hard HEAD^ซึ่งรีเซ็ตเป็นค่าคอมมิชชันหนึ่งก่อนหน้า HEAD
jkp

2
- ฮาร์ดเป็นสิ่งจำเป็นหากคุณต้องการแก้ไขไฟล์ในรุ่นที่ใช้งานได้
William Pursell

3
@ seg.server.fault: ถ้ามันทำงานคุณก็สามารถยอมรับคำตอบ;)
JKP

7
git reset
ฮาร์ด

7
git reflogจะแสดงทุกสิ่งที่ทำด้วยคอมไพล์ มีข้อกังวลที่git reset --hard [sha1 of something from reflog]จะคืนค่าทุกสิ่งที่ปรากฏreflogซึ่งบางครั้งไม่ใช่เป้าหมายเช่น คุณต้องการยกเลิกการรวมในสาขาหลักที่ดึงมาจากต้นกำเนิดด้วยข้อมูลที่ไม่ดี (เกิดขึ้น) และหลังจากการผสานนั้นคุณได้ทำงานในสาขาอื่น reflogจะแสดงทุกการสนทนาในสาขาอื่น แต่git checkout masterและgit reset --hard [SH1 of commit on master branch just before merge]จะรีเซ็ตเฉพาะสาขาต้นแบบปัจจุบันเท่านั้นที่นำการผสานแบบดึงออกจากจุดเริ่มต้น
Vladimir Vukanac

คำตอบ:


1427

การรันจะgit pullดำเนินการงานต่อไปนี้ตามลำดับ:

  1. git fetch
  2. git merge

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

ในการเลิกทำการผสานให้ใช้git reset --hardเพื่อรีเซ็ตที่เก็บภายในเครื่องไปเป็นสถานะก่อนหน้า ใช้git-reflogเพื่อค้นหา SHA-1 ของสถานะก่อนหน้าจากนั้นรีเซ็ตเป็น

คำเตือน

คำสั่งที่ระบุไว้ในส่วนนี้จะลบการเปลี่ยนแปลงที่ไม่ได้รับการยอมรับซึ่งอาจนำไปสู่การสูญเสียงาน

git reset --hard

อีกทางหนึ่งให้รีเซ็ตเป็นเวลาเฉพาะเช่น:

git reset --hard master@{"10 minutes ago"}

325
เป็นวิธีที่ดีที่จะเลือกสถานะก่อนหน้าแทนการใช้ Git-reflog และ hashes คัดลอกคือการใช้ทางลัดเช่นmaster@{1}ซึ่งเป็นตำแหน่งเดิมของmaster, หรือmaster@{"5 minutes ago"} master@{14:30}รายละเอียดทั้งหมดเกี่ยวกับการระบุการแก้ไขด้วยวิธีนี้สามารถพบได้ในman git-rev-parseส่วนที่เรียกว่า "การระบุการแก้ไข"
Cascabel

38
ในกรณีนี้ ORIG_HEAD ก็ควรใช้งานได้เช่นกัน ("การรีเซ็ต git - ฮาร์ด ORIG_HEAD")
Jakub

@Jelfromi: ขอบคุณสำหรับเคล็ดลับที่ฉันไม่ทราบว่าคุณอาจจะ verbose เกี่ยวกับการแก้ไข ฉันรู้เกี่ยวกับการเลือกการแก้ไขที่เกี่ยวข้องกับ HEAD แต่เมื่อคำถามถูกโพสต์ฉันไม่ทราบเลยว่าเขาต้องการย้อนกลับไปอีกนานแค่ไหน
jkp

Updating d2c90a3..035ac4dเมื่อผมดึงมันบอกว่า ที่นี่คุณสามารถใช้d2c90a3เป็นพารามิเตอร์ในการรีเซ็ต
Thai

คุณไม่จำเป็นต้องพิมพ์แฮชเมื่อคุณใช้ reflog คุณยังสามารถใช้ HEAD @ {1} หรือหมายเลขก่อนหน้าตามที่กำหนดไว้ใน reflog
Simon The Cat

338

เหมือนกับคำตอบของ jkp แต่นี่คือคำสั่งแบบเต็ม:

git reset --hard a0d3fe6

โดยที่ a0d3fe6 พบได้จากการทำ

git reflog

และดูจุดที่คุณต้องการเลิกทำ


git reset HEAD --hardยกตัวอย่างเช่นทำไมฉันถึงทำไม่ได้?
Sung Cho

9
@MikeC วิธีการนี้จะช่วยให้คุณไปดึงกลับไปหลายตัวอย่างเช่น
xji

2
ผมไม่สามารถที่จะใช้รหัสด้านซ้าย แต่git reset --hard HEAD@{n}ทำงาน
อีซันดิน

1
คุณควรแนะนำให้แก้ไขคำตอบของ jkp แทนที่จะทำซ้ำที่นี่หลังจากผ่านไปหลายปี
Abhishek Anand

หากฉันมีสิ่งนี้git reflog: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} และ bbbbbbb HEAD @ {2} ถ้าฉันทำgit reset --hard bbbbbbbฉันจะสูญเสีย HEAD 0 และ 1 หรือไม่
pmiranda

115

วิธีที่ทันสมัยกว่าในการยกเลิกการผสานคือ:

git merge --abort

และวิธีที่เก่ากว่าเล็กน้อย:

git reset --merge

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

git reset --hard

แต่ที่จริงแล้วมันก็คุ้มค่าที่จะสังเกตเห็นว่าgit merge --abortเทียบเท่ากับgit reset --mergeที่MERGE_HEADมีอยู่ในปัจจุบันเท่านั้น สามารถอ่านได้ในวิธีใช้ git สำหรับคำสั่งผสาน

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

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


20
git merge --abortทำงานในระหว่างการผสานไม่ใช่หลังจากgit pullเสร็จสิ้น ดังนั้นคำตอบนี้ดูเหมือนจะไม่ตรงกับคำถาม
Abhishek Anand

1
git reset --mergeลบการเปลี่ยนแปลงทั้งหมดที่ไม่ได้จัดเตรียมไว้สำหรับคอมมิชชัน พบสิ่งนี้ด้วยวิธีที่ยากลำบาก
theadriangreen

62

มันใช้งานได้ครั้งแรก: git reflog

ค้นหา SHA ของคุณในสถานะ previus และสร้าง (HEAD @ {1} เป็นตัวอย่าง)

git reset --hard HEAD@{1}

40

หากคุณมี gitk (ลองใช้ "gitk - ทั้งหมดจากบรรทัดคำสั่ง git ของคุณ") มันง่าย เพียงเปิดใช้งานเลือกการคอมมิชชันที่คุณต้องการย้อนกลับไป (คลิกขวา) และเลือก "รีเซ็ตสาขาหลักเป็นที่นี่" หากคุณไม่มีการเปลี่ยนแปลงที่ไม่ได้รับการยอมรับให้เลือกตัวเลือก "ยาก"


8
นี่คือการทำงานที่คุ้มค่าถ้าคุณไม่ได้เห็นมัน มันปรากฏขึ้น GUI บ้า
Evan Moran

35

สมมติว่าเป็นรหัสสุดท้ายกระทำก่อนที่จะดำเนินการ$COMMIT git pullสิ่งที่คุณต้องเลิกทำการดึงครั้งสุดท้ายคือ

git reset --hard $COMMIT

.

โบนัส:

ในการพูดเรื่องดึงฉันอยากจะแบ่งปันเคล็ดลับที่น่าสนใจ

git pull --rebase

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

ก่อนที่จะส่งการกระทำไปยังเซิร์ฟเวอร์ของคุณลองคำสั่งนี้และมันจะซิงค์การเปลี่ยนแปลงเซิร์ฟเวอร์ล่าสุดโดยอัตโนมัติ (ด้วยการดึงข้อมูล + ผสาน) และจะทำการส่งคำสั่งของคุณที่ด้านบนในบันทึกการคอมไพล์ ไม่จำเป็นต้องกังวลเกี่ยวกับการดึง / ผสานด้วยตนเอง

ค้นหารายละเอียดได้ที่: http://gitolite.com/git-pull--rebase


17

นี่เป็นวิธีที่ง่ายที่สุดในการคืนค่าการเปลี่ยนแปลง

** Warning **

โปรดสำรองข้อมูลของไฟล์การเปลี่ยนแปลงของคุณเพราะมันจะลบไฟล์ที่สร้างขึ้นใหม่และโฟลเดอร์

git reset --hard 9573e3e0

9573e3e0{Commit id} ของคุณอยู่ที่ไหน


การตอบสนองนี้มีประโยชน์มากเพราะถ้าเราทำกิ่งต้นกำเนิดดึงคอมไพล์ wi ได้อะไรเช่นนี้Updating ffce65bd..e929e884ทำgit reset --hard ffce65bd
เออร์เนสโตอัลฟองโซ

15

คุณทำได้ git reset --hard ORIG_HEAD

เนื่องจาก "pull" หรือ "merge" ตั้งค่า ORIG_HEAD เป็นสถานะปัจจุบันก่อนที่จะทำการกระทำเหล่านั้น


5

git pullทำด้านล่างการดำเนินการ

ผม. git fetch

ii git merge

หากต้องการยกเลิกการดึงให้ดำเนินการใด ๆ :

ผม. git reset --hard --- มันย้อนกลับการเปลี่ยนแปลงในท้องถิ่นทั้งหมดด้วย

หรือ

ii git reset --hard master@{5.days.ago} (เช่น10.minutes.ago, 1.hours.ago, 1.days.ago.. ) ที่จะได้รับการเปลี่ยนแปลงในท้องถิ่น

หรือ

สาม. git reset --hard commitid

ปรับปรุง:

ครั้งต่อไปใช้git pull --rebaseแทนgit pull.. เซิร์ฟเวอร์การซิงค์เปลี่ยนโดยทำ (ดึงข้อมูล & ผสาน)


4

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

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