İlk İYİ taahhüdü bulmak için git bisect'i nasıl kullanabilirim?


96

Şu problemim var:

  • sürüm masteriyi çalışıyor
  • master(diyelim ki last) önceki son etiketin sürümünde bir hata var
  • bir meslektaşın lastbelirli bir hata için revizyonu için bir yamaya ihtiyacı var

Tamam. Arkadaşımıza git bisecthatayı düzelten revizyonu soralım :

git bisect start
git bisect bad last
git bisect good master

Ama bu işe yaramayacak:

Bazı iyi devirler, kötü devrin atası değildir.
git bisect bu durumda düzgün çalışamaz.
Belki iyi ve kötü devirlerde hata yaparsınız?

Bunun üstesinden gelmek için herhangi bir ipucu var mı? Belgelerde bir şey mi özledim?


1
git bisect run ...İkiye ayırmayı otomatikleştirmek için koşuyorum . Bu yüzden sadece kelimeleri değiş tokuş etme şansım yok goodve bad(bu çok açıktı). runİlk iyi revizyonu bulmak için nasıl kullanılır ?
Daniel Böhmer

@ DanielBöhmer: Çalıştırılan komut dosyanızın içindeki terimleri değiştirmelisiniz , değil mi?
eckes

Tarafından çalıştırılan komut dosyası , bir dizge olarak değil, çıkış kodu olarak iyi veya kötügit bisect run döndürür . Az önce yayınladığım cevabıma bakın.
Daniel Böhmer

@ DanielBöhmer: peki, bu durumda dönüş kodunu ters çevirmeniz gerekecek, değil mi?
eckes

Doğru, cevabımda anlatılan bu.
Daniel Böhmer

Yanıtlar:


101

Git 2.7'den itibaren --term-old ve --term-new argümanlarını kullanabilirsiniz.

Örneğin, bir problem çözme taahhüdünü şu şekilde tanımlayabilirsiniz:

git bisect start --term-new=fixed --term-old=unfixed
git bisect fixed master
git bisect unfixed $some-old-sha1

Test ederken, söyleyin git bisect fixedveya git bisect unfixeduygun şekilde.

Git'in 2.7'den önceki sürümleri için eski yanıt

Kendinizi geçici olarak kötüün iyi, iyinin kötü olduğunu düşünecek şekilde eğitmek yerine, neden bazı takma adlar oluşturmayasınız?

Aşağıdakileri ~/.gitconfigekleyin:

[alias]
        bisect-fixed = bisect bad
        bisect-unfixed = bisect good

Bir problem çözme taahhüdünü şu şekilde tanımlamaya başlayabilirsiniz:

$ git bisect start
$ git bisect-fixed master
$ git bisect-unfixed $some-old-sha1

Test ederken, söyleyin git bisect-fixedveya git bisect-unfixeduygun şekilde.


5
Bir kenara, git alt komutların takma adlarını yapmanıza izin vermez. Dolayısıyla çizgiler. Eğer gerçekten mümkünse (veya yapılmışsa), umarım birisi cevabı günceller.
Michael Wolf

3
Takma adlar kullansanız bile git'in çıktısı kullanılmayacaktır, bu yüzden yine de foo bildirecektir is the first bad commit, bu yüzden geçici eğitim hala gerekli gibi görünüyor, değil mi?
ThomasW

2
Doğru tespit. (Yorumunuza olumlu oy verdik.) Yine de umarız ki başa çıkmak için en azından biraz daha az bilişsel yük vardır ve programcılar olarak zaten bol miktarda var.
Michael Wolf

1
Takma adları 'önce' ve 'sonra' kullanmanızı öneririm. Bu şekilde, ters çevirme yapmanın bilişsel ek yüküne sahip olmazsınız "hatayı gördüğümde," iyi "yazmalıyım; bunun yerine, bir hatanın ortaya çıkmasını / ortadan kalkmasını aradığınızı hatırlama ek yüküne sahipsiniz (yani, ne tür bir değişiklik aradığınızı hatırlamak - "neyden önce?").
Jonas Kölker

1
@ JonasKölker, bu harika bir fikir. Yanıtta önerilen takma adları kullandım ve önerinize göre bisect-after = bisect badve bisect-before = bisect good. Artık her iki takma ad kümesini de kullanabilirim. Birkaç kullanımdan sonra hangisini daha çok tercih ettiğimi göreceğiz.
Gabriel Staples

47

Sadece "hile" yapardım ve iyi <=> kötü anlamlarını değiştirirdim.

Başka bir deyişle, "kötü" ü problemi sergilemeyen bir şey olarak düşünün, bu nedenle bu, yamanızı temel alacağınız "iyi" sürüm değildir.

İyi ve kötü zaten oldukça öznel kavramlardır, değil mi? :)

git bisect start
git bisect good last
git bisect bad master

2
Pekala, eğer düşünürseniz, neyin iyi neyin kötü olduğunun (muhtemelen dinde bile) genel bir anlamı yoktur .. bu sadece amaçlarınıza bağlıdır. Bu şekilde gerçekten aldatma değil - ama belki Git'in Günahı (dini konu üzerinde kalmak için: D, daha tarafsız bir "hedef" / "köken" yerine böyle tartışmalı bir terim seçmektir .. Ama evet, felsefe akıl olabilir- boggling ;-)
inger

Böceklerin "iyi" olabileceğini ilk kez duyuyorum.
MarcH

1
Bu soruyu bulmadan önce yaptığım buydu. Bunu artık yapmayacağım. Unutma, tüm ikiye bölme ters gitmeden önce sadece bir yanlış cevap alır. Aklınızı karıştırmayın.
proski

22

Eğer kullanıyorsanız git bisect runben Perl ile yapıyor gibi prove(otomatik testler çalışır) komutu sadece takas şansı olmayan goodve bad. Testlerin başarısı çıkış kodu olarak rapor edilecektir.

Aşağıdakiler tarafından çalıştırılan programın çıkış kodunu geçersiz kılmak için geçerli bir Bash sözdizimi buldum git bisect run:

git bisect start
git bisect bad HEAD                 # last revision known to PASS the tests
git bisect good $LAST_FAIL_REVISION # last revision known to FAIL the tests
git bisect run bash -c "! prove"

Bu bana, çalıştırılan testleri geçen ilk revizyonu verdi prove.


1
Kabul ediyorum, test durumumu değiştirmemeyi tercih ederim, bu yüzden bu mükemmel.
seanlinsley

8

Git şimdi bunları kullanmanıza izin veriyor oldve newbunları önce tanımlamadan. Daha git bisect startfazla argüman olarak kaydetmeden çağırmalı , sonra ikiye bölmeyi arayarak düzgün şekilde başlatmalısınız.

git bisect old <rev>
git bisect new <rev>

https://git-scm.com/docs/git-bisect#_alternate_terms

Bu aslında @MarcH'nin uygulanması gerektiğini önerdiği şeydi.


1
Bu en alakalı cevaptır (modern git için). Ve başlatma komutu (paylaştığınız bağlantıya göre) şöyle olmalıdır:git bisect start --term-new fixed --term-old broken
Sam Protsenko

Doğru. Bu seçenekler ne zaman tanıtıldı? Cevabımı güncellemek istiyorum.
Michael Wolf

@MichaelWolf 2.7.0 sürümünde çıktılar .
GKFX

6

Git takma adları iyi bir fikirdir, ancak terimler fixedve unfixedaynı soruna sahiptir goodve bad: bunların hem regresyonlar hem de ilerlemeler ile uyumlu olması mümkün değildir . Her iki şekilde de işe yarayan kelimeleri bulmak kolaydır: neyin iyi neyin kötü olduğuna dair hiçbir önyargı olmaksızın doğası gereği nötr olan orijinal ikili arama terminolojisinden basitçe alın. Örneğin:

git config --global alias.bisect-high 'bisect bad'
git config --global alias.bisect-low  'bisect good'

Bunun gibi tarafsız terimlerle , ister regresyon ister düzeltme arıyor olun, her zaman şunu yazabilirsiniz: git bisect-high(veya git bisect-upper, veya git-bisect max, ... seçiminiz!) .

Git bisect geliştiricilerinin mevcut terimlerden herhangi birini basitçe yeniden kullanamamaları çok kötü. Kullanıcı arayüzü genel olarak git'in endişesi değil: http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.