จากคำตอบอื่น ๆ ที่นี่ฉันรู้สึกสับสนกับวิธีที่git rebase -i
สามารถนำการลบออกได้ดังนั้นฉันหวังว่ามันจะดีกว่าที่จะเขียนกรณีทดสอบที่นี่ (คล้ายกับ OP)
นี่คือbash
สคริปต์ที่คุณสามารถวางเพื่อสร้างที่เก็บการทดสอบใน/tmp
โฟลเดอร์:
set -x
rm -rf /tmp/myrepo*
cd /tmp
mkdir myrepo_git
cd myrepo_git
git init
git config user.name me
git config user.email me@myself.com
mkdir folder
echo aaaa >> folder/file.txt
git add folder/file.txt
git commit -m "1st git commit"
echo bbbb >> folder/file.txt
git add folder/file.txt
git commit -m "2nd git commit"
echo cccc >> folder/file.txt
git add folder/file.txt
git commit -m "3rd git commit"
echo dddd >> folder/file.txt
git add folder/file.txt
git commit -m "4th git commit"
echo eeee >> folder/file.txt
git add folder/file.txt
git commit -m "5th git commit"
ณ จุดนี้เรามีfile.txt
เนื้อหาเหล่านี้:
aaaa
bbbb
cccc
dddd
eeee
ณ จุดนี้ HEAD อยู่ในอันดับที่ 5, HEAD ~ 1 จะเป็นอันดับที่ 4 และ HEAD ~ 4 จะเป็นอันดับที่ 1 (ดังนั้น HEAD ~ 5 จะไม่มีอยู่) สมมติว่าเราต้องการลบการคอมมิท 3 - เราสามารถออกคำสั่งนี้ในmyrepo_git
ไดเรกทอรี:
git rebase -i HEAD~4
( โปรดทราบว่าgit rebase -i HEAD~5
ผลลัพธ์ที่มี "ร้ายแรง: จำเป็นต้องมีการแก้ไขครั้งเดียว; HEAD upstream HEAD ~ 5" ที่ไม่ถูกต้อง ) ตัวแก้ไขข้อความ (ดูภาพหน้าจอใน@Dennis 'คำตอบ ) จะเปิดขึ้นพร้อมเนื้อหาเหล่านี้:
pick 5978582 2nd git commit
pick 448c212 3rd git commit
pick b50213c 4th git commit
pick a9c8fa1 5th git commit
# Rebase b916e7f..a9c8fa1 onto b916e7f
# ...
ดังนั้นเราจึงได้รับทั้งหมดตั้งแต่ (แต่ไม่รวม ) HEAD ที่เราร้องขอ ~ 4 ลบบรรทัดpick 448c212 3rd git commit
และบันทึกไฟล์ คุณจะได้รับคำตอบนี้จากgit rebase
:
error: could not apply b50213c... 4th git commit
When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".
Could not apply b50213c... 4th git commit
ณ จุดนี้เปิด myrepo_git / folder/file.txt
ในโปรแกรมแก้ไขข้อความ คุณจะเห็นว่ามันได้รับการแก้ไข:
aaaa
bbbb
<<<<<<< HEAD
=======
cccc
dddd
>>>>>>> b50213c... 4th git commit
โดยพื้นฐานแล้วgit
เห็นว่าเมื่อ HEAD ไปถึงการคอมมิชชันที่ 2 มีเนื้อหาของaaaa
+ bbbb
; และจากนั้นมีการเพิ่มcccc
+ dddd
ซึ่งไม่รู้วิธีผนวกเข้ากับเนื้อหาที่มีอยู่
ดังนั้นที่นี่git
ไม่สามารถตัดสินใจสำหรับคุณ - มันเป็นคุณที่มีการตัดสินใจ: โดยการเอาที่ 3 กระทำคุณทั้งสองให้การเปลี่ยนแปลงที่นำโดยมัน (ที่นี่บรรทัดcccc
) - หรือคุณไม่ได้ หากคุณไม่ต้องการเพียงแค่ลบบรรทัดพิเศษ - รวมถึงcccc
- ใน - folder/file.txt
โดยใช้โปรแกรมแก้ไขข้อความเพื่อให้ดูเหมือนว่า
aaaa
bbbb
dddd
... folder/file.txt
แล้วบันทึก ตอนนี้คุณสามารถออกคำสั่งต่อไปนี้ในmyrepo_git
ไดเรกทอรี:
$ nano folder/file.txt # text editor - edit, save
$ git rebase --continue
folder/file.txt: needs merge
You must edit all merge conflicts and then
mark them as resolved using git add
AH - ดังนั้นเพื่อที่จะทำเครื่องหมายว่าเราได้รับการแก้ไขความขัดแย้งที่เราต้อง , ก่อนที่จะทำ:git add
folder/file.txt
git rebase --continue
$ git add folder/file.txt
$ git rebase --continue
ที่นี่โปรแกรมแก้ไขข้อความจะเปิดขึ้นอีกครั้งแสดงบรรทัด4th git commit
- ที่นี่เรามีโอกาสที่จะเปลี่ยนข้อความกระทำ (ซึ่งในกรณีนี้อาจมีความหมายเปลี่ยนเป็น4th (and removed 3rd) commit
หรือคล้ายกัน) สมมติว่าคุณไม่ต้องการ - เพียงออกจากโปรแกรมแก้ไขข้อความโดยไม่บันทึก เมื่อคุณทำเช่นนั้นคุณจะได้รับ:
$ git rebase --continue
[detached HEAD b8275fc] 4th git commit
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/master.
ณ จุดนี้ตอนนี้คุณมีประวัติเช่นนี้ (ซึ่งคุณสามารถตรวจสอบด้วยคำพูดgitk .
หรือเครื่องมืออื่น ๆ ) ของเนื้อหาของfolder/file.txt
(ด้วย, เห็นได้ชัดว่าการประทับเวลาไม่เปลี่ยนแปลงของคอมมิชชันดั้งเดิม):
1st git commit | +aaaa
----------------------------------------------
2nd git commit | aaaa
| +bbbb
----------------------------------------------
4th git commit | aaaa
| bbbb
| +dddd
----------------------------------------------
5th git commit | aaaa
| bbbb
| dddd
| +eeee
และถ้าก่อนหน้านี้เราตัดสินใจที่จะรักษาสายcccc
(เนื้อหาของคอมไพล์ที่ 3 กระทำที่เราลบ) เราจะได้:
1st git commit | +aaaa
----------------------------------------------
2nd git commit | aaaa
| +bbbb
----------------------------------------------
4th git commit | aaaa
| bbbb
| +cccc
| +dddd
----------------------------------------------
5th git commit | aaaa
| bbbb
| cccc
| dddd
| +eeee
นี่คือประเภทของการอ่านที่ฉันหวังว่าฉันจะได้พบเพื่อเริ่มต้นวิธีการgit rebase
ทำงานในแง่ของการลบการกระทำ / การแก้ไข; หวังว่ามันจะช่วยคนอื่นด้วย ...