Eski Commit Düzenleme

git-rebase

Önceki git makalemde yeni bir commit çıkmadan son commit üzerinde değişiklik yapmayı göstermiştim. Şimdi versiyon geçmişindeki herhangi bir commit’te rebase komutu ile nasıl değişiklik yaparız birlikte göreceğiz.

Böyle bir commit versiyon geçmişinizin olduğunu hayal edin ve üçüncü commit’i yani sondan bir önceki commit’i editlemek istiyoruz. Bu commit içeriğini, mesajını author’unu, tarih ve saatini aklınıza ne geliyorsa istedğiniz basit değişikliği yapabilirsiniz. Farklı türlerde yapılabilecek diğer makalelerde paylaşacağım.

Üzerinde işlem yapacağım git reposunun versiyon geçmişi şu şekilde:

nurettin@pc:~/PycharmProjects/gitAmend$ git tree
* ee3705b (HEAD -> master) fifth
* c9fbc1f fourth
* 5898da8 third
* 826eb40 second
* c5c75a1 first

Aşağıdaki dosyamın içeriğinden ise “-1” yazısını kaldırmak istiyorum:

# first commit line
# second commit line
# third commit line - 1
# fourth commit line
# fifth commit line

Komut olarak “git rebase –interactive” komutunu kullanacağız.

Ben üçüncü commit’in içeriğini ve commit mesajını değiştirmek istiyorum. Komutu çalıştırırken üçüncü commit’in parent commit’ini yani ikinici commit’in hash’ini kullanacağız.
Veya head’e göre relative konumunu da kullanabilirsiniz, burda HEAD~3 ikinci commit’i işaret etmektedir.

Yani aşağıdaki iki komut da aynı işi yapacaktır.

git rebase --interactive 826eb40
git rebase --interactive HEAD~3

Komutu çalıştırdıktan sonra text editörü açılarak karşınıza şöyle bir text belirecek:

pick 5898da8 third
pick c9fbc1f fourth
pick ee3705b fifth

# Rebase 826eb40..ee3705b onto 826eb40 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# ...

Biz üçüncü commit’te değişiklik yapacağımız için pick yerine aşağıdaki gibi edit yazıp kaydediyoruz ve rebase işlemi başlamış oluyor.

edit 5898da8 third
pick c9fbc1f fourth
pick ee3705b fifth

# Rebase 826eb40..ee3705b onto 826eb40 (3 commands)
#
# Commands:
# ...
nurettin@pc:~/PycharmProjects/gitAmend$ git rebase --interactive HEAD~3
Stopped at 5898da8...  third
You can amend the commit now, with

  git commit --amend 

Once you are satisfied with your changes, run

  git rebase --continue

Bundan sonra dosyalarda yapmanız gereken bir değişiklik varsa yapıyoruz ve ardından amend yapıyoruz.

git add main.py 
git commit --amend

Ben -1 yazısını silip komutları çalıştırdım. Burada tekrar text editörü açılacak, commit mesajını değiştirmek istiyorsanız mesajı değiştirip kaydedebilirsiniz. Yoksa düz ilerleyin.

nurettin@pc:~/PycharmProjects/gitAmend$ git commit --amend
[detached HEAD 5f5fead] third - amended
 Date: Sun Aug 14 15:46:00 2022 +0300
 1 file changed, 2 insertions(+), 1 deletion(-)

Üçüncü commit ile işimiz tamam. Rebase işlemine devam etmek için aşağıdaki komutu çalıştırıyoruz. Geriye kalan 4 ve 5. commitlerde işimiz olmadığı için üçüncünün üstüne şu komutla teker teker merge edeceğiz.

Not: Rebase komutuyla üstünde işlem yaptığımız her bir commit’in hash değeri değişecektir.

git rebase --continue

Burda conflict çıkacak:

nurettin@pc:~/PycharmProjects/gitAmend$ git rebase --continue
Auto-merging main.py
CONFLICT (content): Merge conflict in main.py
error: could not apply c9fbc1f... fourth
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply c9fbc1f... fourth

Conflict olduğundan dolayı dördüncü commit’i henüz merge edemedi.

# first commit line
# second commit line
<<<<<<< HEAD
# third commit line
=======
# third commit line - 1
# fourth commit line
>>>>>>> c9fbc1f... fourth

Conflicti çözdükten sonra şu komutları çalıştırarak ilerliyoruz.

git add main.py
git commit

Editör ekranı gelecek, commit mesajını kaydederek ilerliyoruz ve tekrar rebase komutunu çalıştırıyoruz.

nurettin@pc:~/PycharmProjects/gitAmend$ git commit
[detached HEAD 411c468] fourth
 1 file changed, 2 insertions(+), 1 deletion(-)

Artık rebase’e sonraki commit için devam edebiliriz.

git rebase --continue

Burada dördüncü commit artık üçüncünün üstüne merge edilmiş olacak.

Beşinciye geçiyoruz. Beşinci commit’imiz versiyon geçmişimizdeki son commit. Dördüncüde yaptığımızın aynısını beşinci için de yapıyoruz. Commit ettikten hemen sonra (rebase komutunu çalıştırmadan önce) versiyon geçmişinin son aşağıdaki gibi gözükecektir.

Görüldüğü üzere yeni commit’ler oluştu ama HEAD hâla eski “fifth” commit üzerinde. Son komutumuzu çalıştırdığımızda versiyon geçmişi yeni oluşturduğumuz commitlerle üzerine yazılmış olacak.

Beşinci için de conflict’i çözüp commit ettikten sonra son kez rebase ediyoruz.

git rebase --continue
nurettin@pc:~/PycharmProjects/gitAmend$ git rebase --continue
Successfully rebased and updated refs/heads/master.

Özetle burada yaptığımız tek şey üçüncü commit’e gidip gerekli değişiklikleri yapmak, ardından 4 ve 5. commitlerde herhangi bi değişiklik yapmadan üstüne merge ettik.

nurettin@pc:~/PycharmProjects/gitAmend$ git tree
* ee3705b (HEAD -> master) fifth
* c9fbc1f fourth
* 5898da8 third
* 826eb40 second
* c5c75a1 first
===================
nurettin@pc:~/PycharmProjects/gitAmend$ git tree
* 747dc5a (HEAD -> master) fifth
* 411c468 fourth
* e947732 third - amended
* 826eb40 second
* c5c75a1 first

Bu arada yukarda farkettiyseniz ilk ve son hâli arasında 3. 4. ve 5. commitlerin hash değeri değişti. Ben üçüncü committe mesajı da değiştirdiğim için versiyon geçmişi son hâliyle böyle gözüküyor.

Sonraki makalede görüşmek üzere : )

Kaynak