วิธียกเลิกการรวมการกระทำที่ผลักไปยังสาขาระยะไกลแล้ว


961

git revert <commit_hash>เพียงอย่างเดียวจะไม่ทำงาน -mต้องระบุและฉันค่อนข้างสับสนเกี่ยวกับมัน

ใครเคยมีประสบการณ์นี้มาก่อนหรือไม่


3
ดูคำตอบสำหรับคำถามนี้: stackoverflow.com/questions/2318777/…
eugen

2
ที่เกี่ยวข้อง: เลิกทำการผสาน Git หรือไม่ .

ลิงค์ที่นี่เป็นตัวอย่างที่ดีที่สุดซึ่งแสดงให้เห็นถึงการคืนค่าคอมมิชชันที่ผสาน: christianengvall.se/undo-pushed-merge-git
SK Venkat

นี่คือตัวอย่างของการออกแบบที่gitไม่ตรงกับgit-flowเวิร์กโฟลว์ที่ทุกคนใช้ หากคุณได้developตรวจสอบแล้วแน่นอนว่าคุณต้องการเปลี่ยนสาขาฟีเจอร์ 2 คอมมิตที่แนะนำบั๊กและไม่ใช่สาขา dev ที่แชร์กันนานหลายปี -m 1รู้สึกไร้สาระที่จำเป็นต้องได้รับมันด้วย
pkamb

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

คำตอบ:


1153

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

เมื่อคุณดูการคอมมิชชันรวมในผลลัพธ์ของgit logคุณจะเห็นรายการของผู้ปกครองในบรรทัดที่ขึ้นต้นด้วยMerge:

commit 8f937c683929b08379097828c8a04350b9b8e183
Merge: 8989ee0 7c6b236
Author: Ben James <ben@example.com>
Date:   Wed Aug 17 22:49:41 2011 +0100

Merge branch 'gh-pages'

Conflicts:
    README

ในสถานการณ์เช่นนี้git revert 8f937c6 -m 1คุณจะได้รับต้นไม้ที่มันเป็นใน8989ee0และจะคืนสิทธิ์ต้นไม้ที่มันเป็นในgit revert -m 27c6b236

เพื่อให้เข้าใจถึงรหัสหลักได้ดีขึ้นคุณสามารถเรียกใช้:

git log 8989ee0 

และ

git log 7c6b236

127
จากตัวเลขสอง8989ee0, 7c6b236ที่หนึ่งที่จะไป ฉันจะเข้าใจได้อย่างไร
Arup Rakshit

12
หลังจากเปลี่ยนกลับฉันไม่คิดว่าจะมีใครสามารถแก้ไขรหัสในสาขาที่มาได้อย่างง่ายดายและผสานอีกครั้งหรือไม่ kernel.org/pub/software/scm/git/docs/howto/…
IsmailS

10
ในขณะที่ Google กำลังค้นหาคำอธิบายที่ดีกว่าฉันพบบทความนี้ซึ่งฉันคิดว่าทำงานได้ดีในการอ่านรายละเอียด ฉันค้นพบหลังจากอ่านว่าสิ่งที่ฉันกำลังมองหาจริงๆคือคำสั่ง RESET ตามด้วยแรงผลักดัน บางทีมันอาจช่วยคนอื่นได้ atlassian.com/git/tutorials/...
Funktr0n

46
@ArupRakshit ถ้าคุณเรียกใช้git log 8989ee0และgit log 7c6b236คุณควรรู้คำตอบ
BMW

4
บันทึกการคอมไพล์ - บันทึกเพื่อดูการรวมและบันทึกการคอมไพล์ - ไม่มีการรวมกันเพื่อดูประวัติการเข้าชม การรวมสาขาทำให้เกิดประวัติศาสตร์สาขาที่ผสานเข้าด้วยกันและทำให้ยากต่อการสร้างโดยใช้บันทึกคอมไพล์ธรรมดา
Alex Punnen

369

นี่เป็นตัวอย่างที่สมบูรณ์แบบโดยหวังว่าจะช่วยใครบางคน:

git revert -m 1 <commit-hash> 
git push -u origin master

ในกรณีที่<commit-hash>มีการกระทำกัญชาของการผสานที่คุณต้องการที่จะเปลี่ยนและตามที่ระบุไว้ในคำอธิบายของคำตอบนี้ , -m 1แสดงให้เห็นว่าคุณต้องการที่จะกลับไปใช้ต้นไม้ของพ่อแม่เป็นครั้งแรกก่อนที่จะมีการผสาน

git revert ...สายหลักมุ่งมั่นที่การเปลี่ยนแปลงของคุณในขณะที่สายที่สองทำให้เกิดการเปลี่ยนแปลงของประชาชนโดยการผลักดันพวกเขาไปยังสาขาที่ห่างไกล


21
ฉันเชื่อว่า git revertคำสั่งกระทำการยอมรับวัตถุที่สร้างไว้แล้ว เพื่อที่จะไม่เกิดขึ้นคุณจะต้องป้อน--no-commitธง
Delfic

2
ตามที่ @Delfic ที่กล่าวถึงการกระทำได้รับการจัดการโดยบรรทัดแรกแล้ว (ฉันต้องการ: wq เพื่อตรวจสอบ) ดังนั้นบรรทัดที่สองจึงไม่จำเป็น
eka808

1
นี่คือความสับสน มีเพียง 2 บรรทัดและไม่มีคอมไพล์ ... คนที่สามารถแก้ไขได้
Jay Random

176

เบ็นได้บอกคุณถึงวิธีการคืนค่าผสาน แต่สิ่งสำคัญคือคุณต้องตระหนักว่าในการทำเช่นนั้น

"... ประกาศว่าคุณจะไม่ต้องการให้มีการเปลี่ยนแปลงทรีโดยการผสานดังนั้นการผสานในภายหลังจะนำการเปลี่ยนแปลงทรีที่แนะนำโดยการกระทำที่ไม่ได้เป็นบรรพบุรุษของการผสานที่ย้อนกลับก่อนหน้านี้อาจเป็นหรือไม่ก็ได้ สิ่งที่คุณต้องการ. " (หน้าคนคอมไพล์ผสาน)

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


81
แต่คุณสามารถเปลี่ยนกลับเพื่อนำกลับคืนมาได้หากจำเป็นจริงๆ
dalore

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

3
หากคุณเป็นเหมือนฉันและต่อมาต้องการรวมคุณสามารถย้อนกลับหรือเปลี่ยนเชอร์รี่เลือกการเปลี่ยนแปลงที่คุณเปลี่ยนกลับ
UnitasBrooks

ในสถานการณ์ของฉันฉันกดปุ่ม 'ย้อนกลับ' เพื่อรับการเปลี่ยนแปลงย้อนกลับ การเก็บเชอร์รี่อาจจะเป็นวิธีสุดท้าย ฉันจะลองครั้งต่อไป ...
สตีเวนเดอร์สัน

79

คุณสามารถทำตามขั้นตอนเหล่านี้เพื่อยกเลิกการกระทำที่ไม่ถูกต้องหรือรีเซ็ตสาขาระยะไกลของคุณกลับไปเป็น HEAD / state ที่ถูกต้อง

  1. ชำระเงินสาขาระยะไกลเพื่อซื้อคืนในท้องถิ่น
    git checkout development
  2. คัดลอกแฮชการกระทำ (เช่นรหัสของการกระทำทันทีก่อนการคอมมิทที่ผิด) จากบันทึก git git log -n5

    เอาท์พุท:

    กระทำ 7cd42475d6f95f5896b6f02e902efab0b70e8038 "รวมสาขา
    กระทำผิดพลาด"
    7794d7fcfffcfc7a7ffffcfc7a7ff5f0f37fc0a "การกระทำที่ผิด"

  3. รีเซ็ตสาขาเป็นแฮชการกระทำที่คัดลอกในขั้นตอนก่อนหน้า
    git reset <commit-hash> (i.e. 3779ab50e72908da92d2cfcd72256d7a09f446ba)

  4. เรียกใช้ git statusเพื่อแสดงการเปลี่ยนแปลงทั้งหมดที่เป็นส่วนหนึ่งของการกระทำผิด
  5. เพียงแค่เรียกใช้ git reset --hardเพื่อย้อนกลับการเปลี่ยนแปลงเหล่านั้นทั้งหมด
  6. บังคับให้ผลักดันให้สาขาในพื้นที่ของคุณอยู่ในที่ห่างไกลและสังเกตว่าประวัติการกระทำของคุณนั้นสะอาดเหมือนเดิมก่อนที่จะเกิดมลพิษ
    git push -f origin development

4
เกิดอะไรขึ้นถ้าในระหว่างนี้นักพัฒนา 20 คนดึง dev dev ที่รวมเข้ามาล่าสุด
Ewoks

2
ฉันจะไม่ผลักดันสาขาการพัฒนาเมื่อมีนักพัฒนา 20 คนในทีมที่ใช้สาขานั้น :) ในกรณีนี้ก็ควรที่จะเพียงแค่ย้อนกลับการกระทำ
ssasi

4
นี่เป็นวิธีแก้ปัญหาที่ดีมากเมื่อคุณทำงานด้วยตัวเองหรือคุณมั่นใจว่าไม่มี devs อื่นที่ดึงความมุ่งมั่นของคุณขึ้นมา
Kyle B


30

เพื่อรักษาบันทึกให้สะอาดเหมือนไม่มีอะไรเกิดขึ้น (โดยมีข้อเสียด้วยวิธีนี้ (เนื่องจาก push -f)):

git checkout <branch>
git reset --hard <commit-hash-before-merge>
git push -f origin HEAD:<remote-branch>

'commit-hash-before-merge' มาจากบันทึก (บันทึก git) หลังการรวม


คำแนะนำ: หากคุณกำลังทำสิ่งนี้ที่ บริษัท ของคุณคุณอาจไม่ได้รับอนุญาต
eneski

3
ไม่เคยทำpush -fธุรกรรมซื้อคืนที่แชร์
Baptiste Mille-Mathias

17

บางครั้งวิธีที่มีประสิทธิภาพที่สุดในการย้อนกลับคือการถอยกลับและแทนที่

git log

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

git checkout -b newbranch <HASH>

จากนั้นลบสาขาเก่าคัดลอกสาขาใหม่แทนที่และรีสตาร์ทจากที่นั่น

git branch -D oldbranch
git checkout -b oldbranch newbranch

ถ้ามันออกอากาศแล้วลบสาขาเก่าจากที่เก็บทั้งหมดผลักสาขาซ้ำไปที่ส่วนกลางที่สุดและดึงมันกลับลงมาที่ทั้งหมด


4
คำเตือนเกี่ยวกับการออกอากาศควรชัดเจนยิ่งขึ้นเกี่ยวกับความคิดที่น่ากลัวนี้ สิ่งนี้จะทำให้รุ่นของทุกคนในสาขานั้นเสียหายและจะมีประโยชน์จริงๆถ้าคุณทำงานกับที่เก็บระยะไกล (github / bitbucket) ที่คุณเท่านั้นที่สามารถเข้าถึงได้
RobbyD

ไม่เลวเท่าการผลักไฟล์ปรับแต่งลงไปที่การผลิต มันจะไม่เสียหายมันเป็นเพียงการสร้างใหม่จากการกระทำก่อนหน้านี้ดังนั้นวิธีการปัดเศษเพื่อย้ายตัวชี้ Branch ไปเป็นเวอร์ชันก่อนหน้า หวังว่าจะมีผลกับที่เก็บในเครื่องเท่านั้น
ppostma1

5

หากคุณต้องการคืนความmergeมุ่งมั่นนี่คือสิ่งที่คุณต้องทำ

  1. ก่อนอื่นให้ตรวจสอบgit logเพื่อค้นหารหัสประจำตัวที่ผสานของคุณ คุณจะพบรหัสผู้ปกครองหลายรายการที่เกี่ยวข้องกับการผสาน (ดูภาพด้านล่าง)

ป้อนคำอธิบายรูปภาพที่นี่

จดบันทึกรหัสการรวมที่แสดงเป็นสีเหลือง รหัสหลักคือรหัสที่เขียนในบรรทัดถัดไปMerge: parent1 parent2ดังนี้ ตอนนี้ ...

เรื่องสั้น:

  1. สลับไปยังสาขาที่ทำการผสาน จากนั้นทำสิ่งgit revert <merge commit id> -m 1ที่จะเปิดviคอนโซลสำหรับการป้อนข้อความยืนยัน เขียนบันทึกออกทำ!

เรื่องยาว:

  1. สลับไปยังสาขาที่ทำการผสาน ในกรณีของฉันมันเป็นtestสาขาและฉันพยายามที่จะลบfeature/analytics-v3สาขาจากมัน

  2. git revertเป็นคำสั่งที่ย้อนกลับการกระทำใด ๆ แต่มีเคล็ดลับที่น่ารังเกียจเมื่อคืนค่าคอมmergeมิชชัน คุณต้องป้อนการ-mตั้งค่าสถานะมิฉะนั้นจะล้มเหลว จากนี้ไปคุณจะต้องตัดสินใจว่าคุณต้องการที่จะกลับสาขาของคุณและทำให้มันดูเหมือนว่ามันเป็นบนparent1หรือparent2ผ่าน:

git revert <merge commit id> -m 1(เปลี่ยนกลับเป็นparent2)

git revert <merge commit id> -m 2(เปลี่ยนกลับเป็นparent1)

คุณสามารถคอมไพล์บันทึกผู้ปกครองเหล่านี้เพื่อค้นหาว่าคุณต้องการไปทางไหนและนั่นคือรากฐานของความสับสนทั้งหมด


5

คำตอบทั้งหมดได้กล่าวถึงส่วนใหญ่แล้ว แต่ฉันจะเพิ่ม 5 เซนต์ของฉัน การคืนค่าการรวมคำสั่งสั้น ๆ นั้นค่อนข้างง่าย:

git revert -m 1 <commit-hash>

หากคุณมีสิทธิ์คุณสามารถส่งโดยตรงไปยังสาขา "มาสเตอร์" มิฉะนั้นเพียงแค่กดไปที่สาขา "เปลี่ยนกลับ" ของคุณและสร้างคำขอดึง

คุณอาจพบข้อมูลที่เป็นประโยชน์เพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่นี่: https://itcodehub.blogspot.com/2019/06/how-to-revert-merge-in-git.html https://itcodehub.blogspot.com/2019


1

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

สมมติว่ารหัสสาขาที่คุณรวมเข้ากับมาสเตอร์คือ mycodebranch

  1. ชำระเงินหลัก
  2. สร้างแพทช์กลับไบนารีเต็มรูปแบบระหว่างหลักและการสำรองข้อมูลของคุณ git diff --binary master..master_bk_01012017 > ~/myrevert.patch
  3. ตรวจสอบแพทช์ของคุณ git apply --check myrevert.patch
  4. ใช้โปรแกรมปะแก้กับการลงชื่อออก git am --signoff < myrevert.patch
  5. หากคุณจะต้องนำรหัสนี้มาอีกครั้งเมื่อมีการแก้ไขแล้วคุณจะต้องทำการปิดมาสเตอร์ที่เปลี่ยนกลับแล้วและเช็คเอาต์สาขาการแก้ไข git branch mycodebranch_fix git checkout mycodebranch_fix
  6. ที่นี่คุณจำเป็นต้องค้นหาคีย์ SHA สำหรับการย้อนกลับและเปลี่ยนกลับ git revert [SHA]
  7. ตอนนี้คุณสามารถใช้ mycodebranch_fix ของคุณเพื่อแก้ไขปัญหายอมรับและรวมเข้ากับมาสเตอร์อีกครั้งเมื่อเสร็จแล้ว

1

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

ช่วยบอกว่าเราได้สาขา A และ B .. คุณรวมสาขา A เข้ากับสาขา B และผลักสาขา B ไปสู่ตัวเองดังนั้นตอนนี้การผสานก็เป็นส่วนหนึ่งของมัน .. แต่คุณต้องการย้อนกลับไปที่การกระทำครั้งสุดท้ายก่อนที่จะผสาน .. คุณทำ?

  1. ไปที่โฟลเดอร์ราก git ของคุณ (โดยปกติจะเป็นโฟลเดอร์โครงการ) และใช้งาน git log
  2. คุณจะเห็นประวัติของการคอมมิทล่าสุด - คอมมิทมีคุณสมบัติการกระทำ / ผู้แต่ง / วันที่ในขณะที่การรวมยังมีคุณสมบัติการรวม - ดังนั้นคุณจะเห็นพวกเขาเช่นนี้:

    commit: <commitHash> Merge: <parentHashA> <parentHashB> Author: <author> Date: <date>

  3. ใช้git log <parentHashA>และgit log <parentHashB>- คุณจะเห็นประวัติการกระทำของสาขาแม่เหล่านั้น - การกระทำแรกในรายการเป็นคนล่าสุด

  4. ใช้ความ<commitHash>มุ่งมั่นที่คุณต้องการไปที่โฟลเดอร์รากของคอมไพล์และใช้งานgit checkout -b <newBranchName> <commitHash>- ที่จะสร้างสาขาใหม่โดยเริ่มจากการคอมมิทครั้งสุดท้ายที่คุณเลือกก่อนทำการผสาน .. Voila พร้อม!


0

ฉันยังประสบปัญหานี้ในการประชาสัมพันธ์ที่ถูกรวมเข้ากับสาขาหลักของ repo GitHub

ตั้งแต่ฉันแค่อยากจะปรับเปลี่ยนแก้ไขไฟล์บางอย่าง แต่ไม่ได้มีการเปลี่ยนแปลงทั้งประชาสัมพันธ์นำผมต้องกับamendmerge commitgit commit --am

ขั้นตอน:

  1. ไปที่สาขาที่คุณต้องการเปลี่ยน / ย้อนกลับไฟล์ที่ถูกดัดแปลงบางส่วน
  2. ทำการเปลี่ยนแปลงที่คุณต้องการตามไฟล์ที่ถูกแก้ไข
  3. วิ่งgit add *หรือgit add <file>
  4. เรียกใช้git commit --amและตรวจสอบความถูกต้อง
  5. วิ่ง git push -f

ทำไมมันน่าสนใจ:

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

0

ฉันพบคำอธิบายที่ดีเกี่ยวกับวิธีการเปลี่ยนกลับผสานจากลิงก์นี้และฉันคัดลอกวางคำอธิบายด้านล่างและจะเป็นประโยชน์ในกรณีที่ลิงก์ด้านล่างใช้งานไม่ได้

วิธีเปลี่ยนกลับการผสานที่ผิดพลาด Alan (alan@clueserver.org) กล่าวว่า:

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

ประวัติทันทีหลังจาก "การคืนค่าการผสาน" จะมีลักษณะเช่นนี้:

---o---o---o---M---x---x---W
              /
      ---A---B

ที่ A และ B อยู่ด้านการพัฒนาที่ไม่ดี M คือการรวมที่นำการเปลี่ยนแปลงก่อนกำหนดเหล่านี้เข้าสู่การฉีด, x คือการเปลี่ยนแปลงที่ไม่เกี่ยวข้องกับสิ่งที่สาขาด้านข้างได้ทำและทำการฉีดแล้วและ W คือ " การคืนค่าการผสาน M "(จะไม่ดู W M คว่ำหรือไม่) IOW "diff W ^ .. W" คล้ายกับ "diff -RM ^ .. M"

"ย้อนกลับ" ของการรวมสามารถทำได้ด้วย:

$ git revert -m 1 M หลังจากผู้พัฒนาสาขาแก้ไขความผิดพลาดประวัติอาจมีลักษณะเช่นนี้:

---o---o---o---M---x---x---W---x
              /
      ---A---B-------------------C---D

โดยที่ C และ D จะต้องแก้ไขสิ่งที่เสียหายใน A และ B และคุณอาจมีการเปลี่ยนแปลงอื่น ๆ ในการฉีดหลังจาก W.

หากคุณรวมสาขาด้านที่อัปเดต (ด้วย D ที่ส่วนปลาย) การเปลี่ยนแปลงใด ๆ ที่ทำใน A หรือ B จะไม่เกิดขึ้นเพราะพวกเขาถูกคืนค่าโดย W. นั่นคือสิ่งที่ Alan เห็น

Linus อธิบายสถานการณ์:

การคืนค่าการกระทำปกติเพียงแค่ยกเลิกสิ่งที่กระทำได้อย่างมีประสิทธิภาพและค่อนข้างตรงไปตรงมา แต่การคืนค่าการรวมจะกระทำเพื่อยกเลิกข้อมูลที่กระทำการเปลี่ยนแปลง แต่มันไม่มีผลใด ๆ กับผลกระทบต่อประวัติศาสตร์ที่ผสาน ดังนั้นการผสานจะยังคงอยู่และจะยังคงถูกมองว่าเป็นการรวมสาขาทั้งสองเข้าด้วยกันและการรวมในอนาคตจะเห็นว่าการผสานนั้นเป็นสถานะที่ใช้ร่วมกันครั้งสุดท้าย - และการคืนค่าที่การคืนค่าการผสานที่นำมาใช้ ดังนั้น "ย้อนกลับ" จะยกเลิกการเปลี่ยนแปลงข้อมูล แต่ก็เป็นอย่างมากไม่"เลิกทำ" ในแง่ที่ว่ามันจะไม่เลิกทำการเอฟเฟ็กต์การคอมมิทบนประวัติของที่เก็บ ดังนั้นหากคุณคิดว่า "เปลี่ยนกลับ" เป็น "เลิกทำ" คุณจะพลาดการแปลงกลับเป็นส่วนหนึ่งเสมอ ใช่มันเลิกทำข้อมูล แต่ไม่ใช่มันไม่ได้เลิกทำประวัติ ในสถานการณ์เช่นนี้คุณจะต้องการคืนค่าการย้อนกลับก่อนหน้านี้ก่อนซึ่งจะทำให้ประวัติมีลักษณะดังนี้:

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

โดยที่ Y คือการเปลี่ยนกลับของ W. การ "ย้อนกลับของการเปลี่ยนกลับ" เช่นนี้สามารถทำได้ด้วย:

$ git revert W ประวัตินี้จะ (ไม่สนใจความขัดแย้งที่เป็นไปได้ระหว่างสิ่งที่ W และ W..Y เปลี่ยนแปลง) เทียบเท่ากับการไม่มี W หรือ Y เลยในประวัติศาสตร์:

---o---o---o---M---x---x-------x----
              /
      ---A---B-------------------C---D

และการรวมสาขาอีกครั้งจะไม่มีความขัดแย้งเกิดขึ้นจากการย้อนกลับและเปลี่ยนกลับ

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D

แน่นอนการเปลี่ยนแปลงใน C และ D ยังคงสามารถขัดแย้งกับสิ่งที่ทำโดย x ใด ๆ แต่นั่นเป็นเพียงความขัดแย้งผสานปกติ


-2

ดังที่ Ryan กล่าวถึงgit revertอาจทำให้การรวมกลุ่มเป็นไปได้ยากดังนั้นgit revertอาจไม่ใช่สิ่งที่คุณต้องการ ฉันพบว่าการใช้git reset --hard <commit-hash-prior-to-merge>คำสั่งมีประโยชน์มากกว่าที่นี่

เมื่อคุณได้กระทำส่วนฮาร์ดรีเซ็ตแล้วคุณสามารถบังคับให้ผลักดันไปยังสาขาที่ห่างไกลเช่นgit push -f <remote-name> <remote-branch-name>ที่มักจะตั้งชื่อ<remote-name> originจากจุดนั้นคุณสามารถรวมใหม่หากคุณต้องการ


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