ฉันเพิ่งทำดีมุ่งมั่นที่จะผิดสาขา ฉันจะยกเลิกการคอมมิชชันล่าสุดในสาขาหลักของฉันจากนั้นทำการเปลี่ยนแปลงเหล่านั้นและนำพวกเขาไปสู่การอัพเกรดสาขาของฉันได้อย่างไร
ฉันเพิ่งทำดีมุ่งมั่นที่จะผิดสาขา ฉันจะยกเลิกการคอมมิชชันล่าสุดในสาขาหลักของฉันจากนั้นทำการเปลี่ยนแปลงเหล่านั้นและนำพวกเขาไปสู่การอัพเกรดสาขาของฉันได้อย่างไร
คำตอบ:
หากคุณยังไม่ได้ทำการเปลี่ยนแปลงคุณสามารถทำการรีเซ็ตแบบซอฟต์:
git reset --soft HEAD^
การดำเนินการนี้จะคืนค่าการส่งมอบ แต่นำการเปลี่ยนแปลงที่กำหนดไว้กลับไปไว้ในดัชนีของคุณ สมมติว่าสาขาต่าง ๆ เป็นปัจจุบันเกี่ยวกับกัน git จะช่วยให้คุณชำระเงินในสาขาอื่น ๆ ซึ่งคุณสามารถกระทำ:
git checkout branch
git commit
ข้อเสียคือคุณต้องป้อนข้อความยืนยันของคุณอีกครั้ง
git reset --soft HEAD\^
4 ปีในหัวข้อ แต่อาจเป็นประโยชน์กับใครบางคน
หากคุณลืมที่จะสร้างสาขาใหม่ก่อนที่จะกระทำและมุ่งมั่นกับอาจารย์ทุกคนไม่ว่าคุณจะทำไปมากเพียงใดวิธีการต่อไปนี้ง่ายกว่า:
git stash # skip if all changes are committed
git branch my_feature
git reset --hard origin/master
git checkout my_feature
git stash pop # skip if all changes were committed
ตอนนี้คุณมีสาขาหลักของคุณเท่ากับและใหม่กระทำทั้งหมดที่อยู่บนorigin/master
my_feature
โปรดทราบว่าmy_feature
เป็นสาขาท้องถิ่นไม่ใช่สาขาระยะไกล
master
แล้วรีเซ็ตไปmaster
origin/master
origin/master
อยู่ในคอมมิทที่คุณต้องการรีเซ็ตที่! เครดิตสำหรับคำแนะนำอยู่ที่หน้านี้: github.com/blog/…
วิธีย้อนกลับการคอมมิท (ให้แน่ใจว่าคุณบันทึกแฮชการคอมมิชชันสำหรับขั้นตอนถัดไป):
git reset --hard HEAD^
ในการดึงสิ่งนั้นเข้าสู่สาขาอื่น:
git checkout other-branch
git cherry-pick COMMIT-HASH
นอกจากนี้โปรดทราบว่าgit reset --hard
จะฆ่าการเปลี่ยนแปลงที่ไม่ได้ติดตามและแก้ไขใด ๆ ที่คุณอาจมีดังนั้นหากคุณมีสิ่งที่คุณต้องการ:
git reset HEAD^
git checkout .
git rev-parse BRANCH_NAME
เพื่อรับ Sha
git reflog show <branch>
!
git stash
รีเซ็ตและใช้ในgit stash pop
ภายหลังเพื่อกู้คืนดังนั้นจึงไม่ต้องกลัวชิ้น--hard
ส่วน
หากคุณผลักดันการเปลี่ยนแปลงของคุณแล้วคุณจะต้องบังคับให้กดครั้งต่อไปหลังจากรีเซ็ต HEAD
git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force
คำเตือน:การฮาร์ดรีเซ็ตจะยกเลิกการแก้ไขใด ๆ ที่ไม่มีข้อผูกมัดในสำเนาการทำงานของคุณในขณะที่แรงกดจะเขียนทับสถานะของสาขาระยะไกลอย่างสมบูรณ์ด้วยสถานะปัจจุบันของสาขาท้องถิ่น
ในกรณีบน Windows (ใช้บรรทัดคำสั่งของ Windows ไม่ใช่ Bash) จริงๆแล้วมันคือสี่^^^^
แทนหนึ่งดังนั้นจึงเป็น
git reset --hard HEAD^^^^
git reset --hard COMMIT_HASH
git push --force
เมื่อเร็ว ๆ นี้ฉันได้ทำสิ่งเดียวกันโดยที่ฉันตั้งใจจะเปลี่ยนเป็นนายเมื่อฉันควรผูกมัดกับสาขาอื่น แต่ฉันไม่ได้ผลักดันอะไรเลย
หากคุณเพียงแค่มุ่งมั่นที่จะผิดสาขาและไม่ได้เปลี่ยนแปลงอะไรเลยตั้งแต่และไม่ได้ผลักไปที่ repo คุณสามารถทำสิ่งต่อไปนี้:
// rewind master to point to the commit just before your most recent commit.
// this takes all changes in your most recent commit, and turns them into unstaged changes.
git reset HEAD~1
// temporarily save your unstaged changes as a commit that's not attached to any branch using git stash
// all temporary commits created with git stash are put into a stack of temporary commits.
git stash
// create other-branch (if the other branch doesn't already exist)
git branch other-branch
// checkout the other branch you should have committed to.
git checkout other-branch
// take the temporary commit you created, and apply all of those changes to the new branch.
//This also deletes the temporary commit from the stack of temp commits.
git stash pop
// add the changes you want with git add...
// re-commit your changes onto other-branch
git commit -m "some message..."
หมายเหตุ: ในตัวอย่างข้างต้นฉันกำลังกรอกซ้ำ 1 คอมมิตด้วย git reset HEAD ~ 1 แต่ถ้าคุณต้องการกรอ n ทำซ้ำคุณสามารถทำการรีเซ็ต HEAD ~ n ได้
นอกจากนี้หากคุณจบลงด้วยการยอมรับผิดสาขาและจบลงด้วยการเขียนรหัสเพิ่มเติมก่อนที่จะตระหนักว่าคุณมุ่งมั่นที่จะผิดสาขาคุณสามารถใช้ git stash เพื่อบันทึกงานที่กำลังดำเนินการอยู่:
// save the not-ready-to-commit work you're in the middle of
git stash
// rewind n commits
git reset HEAD~n
// stash the committed changes as a single temp commit onto the stack.
git stash
// create other-branch (if it doesn't already exist)
git branch other-branch
// checkout the other branch you should have committed to.
git checkout other-branch
// apply all the committed changes to the new branch
git stash pop
// add the changes you want with git add...
// re-commit your changes onto the new branch as a single commit.
git commit -m "some message..."
// pop the changes you were in the middle of and continue coding
git stash pop
หมายเหตุ: ฉันใช้เว็บไซต์นี้เป็นข้อมูลอ้างอิง https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/
git checkout -b new_branch
ถูกต้องจากที่นั่นมุ่งมั่นเหมือนเดิมผลักดันและสร้าง PR ทำไม่ได้ ' ไม่ต้องทำอีก
ดังนั้นหากสถานการณ์ของคุณคือการที่คุณมุ่งมั่นที่จะmaster
แต่มุ่งมั่นที่จะanother-branch
(ซึ่งอาจหรือไม่อาจไม่ได้อยู่) แต่คุณยังไม่ได้ผลักมันเป็นเรื่องง่ายที่จะแก้ไข
// if your branch doesn't exist, then add the -b argument
git checkout -b another-branch
git branch --force master origin/master
ตอนนี้สิ่งที่กระทำของคุณเพื่อจะอยู่ในmaster
another-branch
แหล่งข่าวด้วยความรักจาก: http://haacked.com/archive/2015/06/29/git-migrate/
another-branch
มีอยู่แล้ว another-branch
ในกรณีนี้มันเป็นเพียงแค่อบกระทำที่ฉันต้องการทำจะโทและไม่ได้นำพวกเขาใน
หากต้องการคำอธิบายนี้อย่างละเอียดในกรณีที่คุณมีหลายข้อผูกมัดที่จะย้ายจากตัวอย่างเช่นdevelop
ไปที่new_branch
:
git checkout develop # You're probably there already
git reflog # Find LAST_GOOD, FIRST_NEW, LAST_NEW hashes
git checkout new_branch
git cherry-pick FIRST_NEW^..LAST_NEW # ^.. includes FIRST_NEW
git reflog # Confirm that your commits are safely home in their new branch!
git checkout develop
git reset --hard LAST_GOOD # develop is now back where it started
หากคุณพบปัญหานี้และคุณมี Visual Studio คุณสามารถทำสิ่งต่อไปนี้:
คลิกขวาที่สาขาของคุณและเลือกView History
:
คลิกขวาที่คอมมิทที่คุณต้องการกลับไป และย้อนกลับหรือรีเซ็ตตามต้องการ
หากคุณเป็นเพียงแค่ประมาณ 1 กระทำแล้วมีโซลูชั่นการตั้งค่าที่ง่ายขึ้นมากมาย สำหรับฉันฉันมีประมาณ 10 คอมมิทที่ทำขึ้นโดยไม่ตั้งใจmaster
แทนที่จะเรียกมันbranch_xyz
มาและฉันไม่ต้องการที่จะสูญเสียประวัติการกระทำ
สิ่งที่คุณสามารถทำได้และสิ่งที่ช่วยให้ฉันได้ใช้คำตอบนี้เป็นข้อมูลอ้างอิงโดยใช้กระบวนการ 4 ขั้นตอนคือ -
master
branch_xyz
master
นี่คือขั้นตอนข้างต้นในรายละเอียด -
สร้างสาขาใหม่จากmaster
(ซึ่งฉันได้กระทำการเปลี่ยนแปลงจำนวนมากโดยไม่ได้ตั้งใจ)
git checkout -b temp_branch_xyz
หมายเหตุ: การ-b
ตั้งค่าสถานะใช้เพื่อสร้างสาขาใหม่
เพียงเพื่อตรวจสอบว่าเรามีสิทธิ์นี้หรือไม่ฉันจะทำอย่างรวดเร็วgit branch
เพื่อให้แน่ใจว่าเราอยู่ในtemp_branch_xyz
สาขาและ a git log
เพื่อตรวจสอบว่าเราได้รับสิทธิ์หรือไม่
branch_xyz
ผสานสาขาชั่วคราวลงในสาขาเดิมตั้งใจสำหรับการกระทำคือ
ก่อนอื่นให้เปลี่ยนเป็นสาขาเดิมbranch_xyz
(คุณอาจจำเป็นต้องใช้git fetch
หากยังไม่ได้)
git checkout branch_xyz
หมายเหตุ: ไม่ได้ใช้-b
แฟล็ก
ตอนนี้ให้รวมสาขาชั่วคราวเข้ากับสาขาที่เราได้ชำระเงินตอนนี้branch_xyz
git merge temp_branch_xyz
คุณอาจต้องดูแลความขัดแย้งบางอย่างที่นี่ถ้ามี คุณสามารถผลักดัน (ฉันต้องการ) หรือไปยังขั้นตอนถัดไปหลังจากรวมสำเร็จแล้ว
เลิกทำโดยไม่ตั้งใจmaster
โดยใช้คำตอบนี้เป็นข้อมูลอ้างอิงก่อนอื่นให้เปลี่ยนเป็นmaster
git checkout master
จากนั้นเลิกทำการย้อนกลับเพื่อจับคู่รีโมต (หรือเฉพาะการกระทำหากคุณต้องการ)
git reset --hard origin/master
อีกครั้งฉันจะทำgit log
ก่อนและหลังเพียงเพื่อให้แน่ใจว่าการเปลี่ยนแปลงที่ตั้งใจมีผลบังคับใช้
การลบหลักฐานที่เป็นการลบสาขาชั่วคราว สำหรับสิ่งนี้ก่อนอื่นคุณต้องทำการเช็คเอาท์สาขาที่ temp ถูกรวมเข้าไว้นั่นคือbranch_xyz
(หากคุณยังคงอยู่master
และดำเนินการคำสั่งด้านล่างคุณอาจได้รับ a error: The branch 'temp_branch_xyz' is not fully merged
) ดังนั้นลองมา
git checkout branch_xyz
แล้วลบหลักฐานของอุบัติเหตุนี้
git branch -d temp_branch_xyz
ไปแล้ว
หากสาขาที่คุณต้องการใช้การเปลี่ยนแปลงของคุณมีอยู่แล้ว ( ตัวอย่างเช่นการพัฒนาสาขา) ให้ทำตามคำแนะนำของfotanusด้านล่างจากนั้น:
git checkout develop
git rebase develop my_feature # applies changes to correct branch
git checkout develop # 'cuz rebasing will leave you on my_feature
git merge develop my_feature # will be a fast-forward
git branch -d my_feature
และแน่นอนคุณสามารถใช้tempbranchหรือชื่อสาขาอื่นแทนmy_featureหากคุณต้องการ
นอกจากนี้หากทำได้ให้ชะลอการสะสมป๊อป (นำไปใช้) จนกระทั่งหลังจากที่คุณรวมเข้ากับสาขาเป้าหมายของคุณ
สำหรับฉันนี่คือการแก้ไขโดยการคืนความมุ่งมั่นที่ฉันผลักแล้วเชอร์รี่หยิบที่กระทำกับสาขาอื่น
git checkout branch_that_had_the_commit_originally
git revert COMMIT-HASH
git checkout branch_that_was_supposed_to_have_the_commit
git cherry pick COMMIT-HASH
คุณสามารถใช้git log
เพื่อค้นหาแฮชที่ถูกต้องและคุณสามารถผลักดันการเปลี่ยนแปลงเหล่านี้ได้ทุกเมื่อที่คุณต้องการ!