Buradaki diğer cevaplardan, nasıl bir şekilde kafam karıştı git rebase -i
bir taahhüdü kaldırmak için kullanılabileceğiyle , bu yüzden test davamı (OP'ye çok benzer) not etmekte sorun yok.
Klasörde bash
bir test havuzu oluşturmak için yapıştırabileceğiniz bir komut dosyası /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"
Bu noktada, file.txt
şu içeriğe sahip bir a var :
aaaa
bbbb
cccc
dddd
eeee
Bu noktada, HEAD 5. taahhütte, HEAD ~ 1 4. olur ve HEAD ~ 4 1. taahhüt olur (yani HEAD ~ 5 mevcut olmaz). Diyelim ki 3. taahhüdü kaldırmak istiyoruz - myrepo_git
dizinde bu komutu verebiliriz :
git rebase -i HEAD~4
( "Ölümcül: Tek bir düzeltme gerekiyor; geçersiz akış yukarı HEAD ~ 5" ile sonuçlandığını unutmayın git rebase -i HEAD~5
. ) Bir metin düzenleyici ( @Dennis'in cevabındaki ekran görüntüsüne bakın ) şu içeriklerle açılacaktır:
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
# ...
Bu yüzden talep edilen KAFA ~ 4'ten beri (ancak dahil değil ) tüm taahhütleri alıyoruz. Satırı silin pick 448c212 3rd git commit
ve dosyayı kaydedin; bu yanıtı alacaksınız 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
Bu noktada myrepo_git / dosyasını folder/file.txt
bir metin düzenleyicide açın; değiştirildiğini göreceksiniz:
aaaa
bbbb
<<<<<<< HEAD
=======
cccc
dddd
>>>>>>> b50213c... 4th git commit
Temel olarak, git
HEAD 2. taahhüdüne geldiğinde, aaaa
+ içeriğinin olduğunu görür bbbb
; ve ardından mevcut içeriğe nasıl ekleneceğini bilmediği bir cccc
+ eki eki vardır dddd
.
Yani burada git
sizin için karar veremezsiniz - bir karar vermek zorunda olan sizsiniz : 3. taahhüdü kaldırarak ya onun getirdiği değişiklikleri (burada, çizgi cccc
) tutarsınız - ya da yapmazsınız. Dahil - Eğer yoksa, sadece ekstra satırları kaldırmak cccc
içinde - folder/file.txt
: Bu gibi görünüyor, bu yüzden bir metin düzenleyicisi kullanarak
aaaa
bbbb
dddd
... ve sonra kaydet folder/file.txt
. Şimdi myrepo_git
dizinde aşağıdaki komutları verebilirsiniz :
$ 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 - bu yüzden çatışma çözdük bu işareti amacıyla, biz gerekir , önce göreceğiniz :git add
folder/file.txt
git rebase --continue
$ git add folder/file.txt
$ git rebase --continue
Burada bir metin editörü tekrar açılır ve satırı gösterir 4th git commit
- burada taahhüt mesajını değiştirme şansımız var (bu durumda anlamlı bir şekilde değiştirilebilir 4th (and removed 3rd) commit
veya benzer olabilir). Diyelim ki istemiyorsunuz - bu yüzden kaydetmeden metin düzenleyicisinden çıkın; bunu yaptıktan sonra şunları elde edersiniz:
$ git rebase --continue
[detached HEAD b8275fc] 4th git commit
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/master.
Bu noktada, şimdi (örneğin , orijinal taahhütlerin değişmemiş zaman damgalarıyla gitk .
) içeriğinin ( örneğin, sözde veya diğer araçlarla da inceleyebilirsiniz) böyle bir geçmişiniz var 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
Ve daha önce, çizgiyi tutmaya karar verdiysek cccc
(kaldırdığımız 3. git taahhüdünün içeriği):
1st git commit | +aaaa
----------------------------------------------
2nd git commit | aaaa
| +bbbb
----------------------------------------------
4th git commit | aaaa
| bbbb
| +cccc
| +dddd
----------------------------------------------
5th git commit | aaaa
| bbbb
| cccc
| dddd
| +eeee
Bu, bulabileceğimi umduğum türden bir okuma, git rebase
taahhütleri / revizyonları silme açısından nasıl çalıştığını başlatmak içindi ; umarım başkalarına da yardımcı olabilir ...