git bisect ve cherry-pick: hataları bulmak ve commit’leri devralmak
Kısaca: git bisect ile bir hatayı getiren commit’i yarılayarak bulursunuz; git cherry-pick ile tekil commit’leri başka bir dala alırsınız.
Biraz daha ayrıntılı: Günlük işte çok zaman kazandıran iki ileri Git komutu. İkisi de geçmişin temiz biçimde mantıklı, küçük commit’lere bölündüğünü varsayar.
Ayrıntılı
git bisect: ikili aramayla hata arama
Bilirsiniz: üç hafta önce çalışıyordu, şimdi çalışmıyor ve arada 200 commit var. git bisect aralığı tekrar tekrar yarılar (ikili arama) ve yaklaşık sekiz adımdan sonra suçluyu bilirsiniz.
git bisect start
git bisect bad # mevcut durum hatalı
git bisect good v1.4.0 # bu durum sorunsuzdu
git bisect good # veya: git bisect bad
git bisect reset # başlangıç durumuna dön
Bir test betiğiyle otomatik çalışır: git bisect run npm test (çıkış kodu 0 = iyi, 1 ila 127 = kötü, 125 = atla).
git cherry-pick: tekil commit’leri devralmak
Normalde tüm dalları birleştirirsiniz. cherry-pick ise bir veya birkaç commit’i geçerli dala kopyalar:
git switch release/1.2
git cherry-pick 3f4a2b1 # bir commit'i devral
git cherry-pick A..B # bir aralık
git cherry-pick -x 3f4a2b1 # kaynağı iletide belirt
Tipik durum: Ana dalda bir hata düzeltildi ama sürüm dalına da girmeli. Seçilen commit yeni bir özet (hash) kimliği alır, çünkü farklı bir ebeveynin üzerinde durur.
Çakışmalar ve tuzaklar
Çakışmalarda Git durur: çakışmayı çözün, git add, sonra git cherry-pick --continue (veya --abort). Commit’leri tekrar tekrar seçen, geçmişte sonraki birleştirmeleri karıştırabilecek kopyalar yaratır. Cherry-pick temiz bir dal iş akışının yerini tutmaz. Bisect’te sınanan durumlar derlenebilir ve test edilebilir olmalıdır; git bisect skip ile bozuk ara durumları atlarsınız.
Bağlantı
Küçük, temiz commit’ler (bkz. Conventional Commits) her iki aracı da ilk etapta etkili kılar: dev bir “her şeyi değiştirdim” commit’i ne hedefli bulunabilir ne de hedefli devralınabilir. git blame ve git log -S de aramada yardımcı olur.
Ayrıca bak: Git, Git rebase, Birleştirme çakışmaları, Conventional Commits