git rebase --interactive
Jul 6, 2016 · 3 minute read · Commentsgitprogramming
Git’in guzel ozelliklerinden biride git rebase
. Bu yazimda sizlere interactif rebase’den bahsedecegim(git rebase --interactive
).
Peki ne yapabiliyoruz bu interaktif rebase ile:
Interaktif rebase ile; deponun commit historysinde(gecmisinde) degisiklik yapabilir, commitleri birlestirebilir, commitleri silebilir veya commitlerin sirasini degistirebilirsiniz.
Not: Eger commitleri depoya push ettiyseniz ve depo uzerinde sizden baskalarida calisiyorsa commit history uzerinde degisiklik yapmak hicde iyi olmayacaktir.
Simdi interaktif rebase ile neler yapabilecegimiz hakkinda biraz daha detayli sekilde anlatayim.
Ben denemeleri gostermek icin bir git deposu olusturdum ve bir kac commit yaptim. Simdi ise bu depodaki commitler uzerinden anlatacagim.
Commit loglarimizda ne var bir bakalim:
$ git log --oneline
f7edff3 Logging confs updated
d1ff06d Base templates created
490dd3c Catalogue app created
077c05c confs updated
81ea1c6 Customer app created
c869e5c Initial commit
git rebase -i HEAD~3
komutunu verdigimde git e yapmis oldugum son 3 commit uzerinde degisiklik yapmak istedigimi belirtiyorum.
Karsima uzerinde degisiklik yapmak istedigimiz commitlerin listelendigi bir dosya acilir:
pick 490dd3c Catalogue app created
pick d1ff06d Base templates created
pick f7edff3 Logging confs updated
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
Yukarida goruldugu gibi git rebase ile kullanabilecegimiz komutlari ve kisaca bu komutlar ile ne yapabilecegimiz kisaca yaziyor. Simdi bu komutlari ve ne ise ne yapmak icin kullanildigini gorelim.
Interktif rebase komutlari
- pick
Yukaridaki ciktida da goruldugu uzere rebase ciktisinda commit sirasi eskiden yeniye dogru gidiyor. Eger sadece commitlerin sirasini degistirmek istiyorsaniz acilan editorde commitlerin sirasini degistirin ve dosyadan cikin. Commitlerin sirasi degisecek ve rebase islemi bitmis olacaktir.
Mesela editorde satirlarin sirasini su sekilde degistirirsem commitlerin sirasida degisir:
pick 490dd3c Catalogue app created
pick f7edff3 Logging confs updated
pick d1ff06d Base templates created
- reword
Sadece commit mesajini degistirmek istiyorsaniz; mesajini degistirmek istediginiz commitin basindaki pick
kelimesini reword
ile degilstirin.
- edit
Rebase’i durdurur ve commit uzerinde degisiklik yapabilmenizi saglar. Istediginiz degisikligi yapip rebase islemine devam ederseniz (git rebase --continue
) o commitin icerigi degisecektir.
Ayrica eger rebase yaptiginiz commit birbiriyle veya commit mesaji ile alakasiz degisiklikler iceriyorsa ve siz bu commit ile alakasiz olan degisikligi farkli bir commit olarak kaydetmek istiyorsaniz rebase’den cikmadan commitleri yapip rebase islemini sonlandirdiginizda degisikliklerin farkli commitlere ayrildigini goreceksiniz.
- squash
Commitleri birlestirmek icin kullanilir.
git rebase -i HEAD~3
komutunu calistirdigimizda gelen ekranda su sekilde degisiklik yapalim:
pick 490dd3c Catalogue app created
s f7edff3 Logging confs updated
pick d1ff06d Base templates created
Degisikligi yapip kaydettikten sonra:
f7edff3
hashli commit 490dd3c
hashli commit(kendinden onceki commit) ile birlesecektir ve karsimiza yeni commit mesajini belirtebilecegimiz editor ekrani gelecektir. Bunuda kaydedip cikinca commit logumuz suna benzer birsey olacaktir.
$ git log --oneline
d1ff06d Base templates created
aabbccd Iki commit bir olunca samanlik seyran olur
077c05c confs updated
81ea1c6 Customer app created
c869e5c Initial commit
Burda dikkat edilecek nokra birlestirmek icin isaretledigimiz commit[ler] rebase ekraninda bir ust satirda yazan commit ile birlesti.
- fixup
squash
gibi commit’i kendinden once yapilan commit ile birlestirir. Tek farki commit mesaji olarak fixup olarak isaretlenen committen once yapilan commitin mesajini kullanir.
- drop
Belirtilen commitleri siler.