2016-04-20 40 views
6

Używam ciężko Git przez około 7 lat. Kilka dni temu znalazłem zachowanie, które mnie zaskoczyło. Zauważyłem, że git log, git blame i git bisect wykazują dziwne zachowanie. A friend daj mi znać o --full-history flagie do git log, która rozwiązała mój problem. Chcę wiedzieć, dla mojej własnej edukacji, czy istnieje równoważna poprawka dla git blame i git bisect.Git: Odpowiednik `--full-history` for` git bisect` oraz `git winame`

Zapraszam widzi ten problem dla siebie z tego repo: https://dl.dropboxusercontent.com/u/1927707/problematic_repo.7z

Oto jego dziennika:

$ git log --graph 
* commit b7a8d7aa001d06eb7491ab5fb447a8dd3aa421a8 
| Author: Ram Rachum <[email protected]> 
| Date: Tue Apr 19 17:45:01 2016 +0300 
| 
|  adding more to some-file 
| 
* commit 0aa833916e908ea93902a6c4c227f9a884a1bcef 
|\ Merge: 2413945 3068c7d 
| | Author: Ram Rachum <[email protected]> 
| | Date: Tue Apr 19 17:44:31 2016 +0300 
| | 
| |  Merge branch 'master' into development 
| | 
| * commit 3068c7d2548f1798b6840f73b13a649937339f28 
| | Author: Ram Rachum <[email protected]> 
| | Date: Tue Apr 19 16:02:27 2016 +0300 
| | 
| |  Adding sugar to coffee 
| | 
* | commit 24139451ab954b1f0a9ef616775a3dba0ac81669 
|/ Author: Ram Rachum <[email protected]> 
| Date: Tue Apr 19 16:01:28 2016 +0300 
| 
|  Creating some-file 
| 
* commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661 
    Author: Ram Rachum <[email protected]> 
    Date: Tue Apr 19 16:00:47 2016 +0300 

     Create coffee 

w pierwszym popełnienia plik coffee dodano. W zatwierdzeniu 3068c7d dodałem wiersz "cukier" do pliku coffee. Ale potem scaliłem tę gałąź w gałąź development iw tym scaleniu popełniono błąd i usunięto linię "cukru", pozostawiając pustą coffee. Następnie dodano inne zatwierdzenie b7a8d7a, dokonując niepowiązanej zmiany, dla dobrej miary.

Teraz patrzę na moją kawę i stwierdzam, że nie ma w niej cukru. Pamiętam, że dodawałem cukru do kawy. Uruchomę git log coffee i otrzymam wynik:

$ git log coffee 
commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661 
Author: Ram Rachum <[email protected]> 
Date: Tue Apr 19 16:00:47 2016 +0300 

    Create coffee 

To wszystko. git log nie pokazuje ani mojego oryginalnego zatwierdzenia, które dodało cukru, ani scalenia, które go usunęło. Dwie bardzo istotne poprawki, których brakuje.

Byłem sfrustrowany przez około godzinę przez ten problem, ponieważ zdarzyło się to w dużym repozytorium przedsiębiorstw, w którym zatwierdzenia są znacznie trudniejsze do znalezienia ręcznie.

Próbowałem również użyć git bisect i git blame, aby potwierdzić oba zatwierdzenia, ale oba te narzędzia zignorowały dwa zatwierdzenia. git bisect wskazał mi nieprawidłowe zatwierdzenie po zakończeniu wszystkich akcji git bisect bad i git bisect good.

Potem, jak powiedziałem na początku, przyjaciel wskazał mi w kierunku --full-history flag

$ git log --full-history --graph coffee     
* commit 0aa833916e908ea93902a6c4c227f9a884a1bcef  
|\ Merge: cf02fbb 3068c7d        
| | Author: Ram Rachum <[email protected]>     
| | Date: Tue Apr 19 17:44:31 2016 +0300    
| |              
| |  Merge branch 'master' into development   
| |              
| * commit 3068c7d2548f1798b6840f73b13a649937339f28  
|/ Author: Ram Rachum <[email protected]>     
| Date: Tue Apr 19 16:02:27 2016 +0300    
|              
|  Adding sugar to coffee       
|              
* commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661  
    Author: Ram Rachum <[email protected]>     
    Date: Tue Apr 19 16:00:47 2016 +0300    

     Create coffee          

To sprawia, że ​​jestem szczęśliwy, ponieważ pokazuje dwie istotne rewizje, jeden cukier Dodawanie i scalanie że usunięte to. Mój problem został rozwiązany. Ale naprawdę chciałbym wiedzieć, jak sprawić, aby również git bisect i git blame zachowywały się tak samo. Czy ktoś się dowie?

+0

'git blame' może również pozwolić' --full-history 'bezpośrednio tutaj (chciałbym wypróbować to na twoim repo, ale nie mogę rozpakować pliku 7zip). Bisect może nie chcieć dotykać scaleń, ponieważ sam je obsługuje. W ogóle tego nie widzisz, ponieważ 'git rev-list' pomija wiele scaleń: zobacz dyskusję dokumentacji na temat TREESAME i obsługi korespondencji seryjnej (i jak zmienia to historia -full). – torek

+0

@torek Próbowałem już teraz, "wina" wydaje się akceptować flagę, ale wygląda na to, że nic nie zmienia. Próba zarówno "git win - pełna historia" i "git win - pełna historia - zwrot" nie przyniosła żadnych rezultatów. Jeśli chodzi o niemożność otwierania archiwów 7z, tutaj jest to w archiwum ZIP: https://dl.dropboxusercontent.com/u/1927707/foo.zip –

+0

@torek Próbowano również 'git blame --reverse HEAD ^^^ .. HEAD - kawa pełna historii, wciąż nic nie dostaje. –

Odpowiedz

0

Interesujące. Ponieważ linia nie jest dostępna, git blame zaczyna się zupełnie niepomyślnie. Jak dokumentacji git blame Uwagi:

Raport nie powiedzieć nic o liniach, które zostały usunięte lub zastąpione ; musisz użyć narzędzia, takiego jak git diff lub interfejsu kilofa krótko wspomnianego w następnym akapicie.

W tym przypadku możemy uruchomić git log -SSugar dowiedzieć się, gdzie to poszło w:

$ git log --pretty=oneline -SSugar 
3068c7d2548f1798b6840f73b13a649937339f28 Adding sugar to coffee 

ale git blame nie od razu pomoże nam dowiedzieć się, gdzie to wyszedł. (Jak już odkryłeś, jeśli chcemy znaleźć tę linię podczas wymieniania plików, możemy potrzebować --full-history, ponieważ dodawanie ścieżek do ograniczenia błędów, które rozważa git log, powoduje również uproszczenie historii poprzez przycięcie drzewa każdego zatwierdzenia, aby zawierało tylko . wspomniane pliki, a następnie przy użyciu tego TREESAME code)

Począwszy od znany-dobry rev, możemy teraz spróbować --reverse [edit: zauważyłem 3068c7d2548f1798b6840f73b13a649937339f28 == master i faktycznie wykorzystywane master tutaj, prawdopodobnie powinien używany SHA-1 bezpośrednio]:

$ git blame --reverse master..HEAD coffee 
^3068c7d (Ram Rachum 2016-04-19 16:02:27 +0300 1) Sugar 

To zdaje się sugerować, że 3068c7d jest ostatnim rev, w których istnieje linia, więc musi on być usunięty w niektórych lub wszystkich dzieci wzdłuż tej konkretnej ścieżki, co jest prawdziwe:

$ git log --oneline --graph --decorate --all 
* b7a8d7a (HEAD -> development) adding more to some-file 
* 0aa8339 Merge branch 'master' into development 
|\ 
| * 3068c7d (master) Adding sugar to coffee 
* | 2413945 Creating some-file 
|/ 
* cf02fbb Create coffee 

Jest tylko jeden commit że jest dzieckiem 3068c7d tu mianowicie 0aa8339, więc:

$ git show -m 0aa8339 
commit 0aa833916e908ea93902a6c4c227f9a884a1bcef (from 3068c7d2548f1798b6840f73b1 
Merge: 2413945 3068c7d 
Author: Ram Rachum <[email protected]> 
Date: Tue Apr 19 17:44:31 2016 +0300 

    Merge branch 'master' into development 

diff --git a/coffee b/coffee 
index 4d0f160..e69de29 100644 
--- a/coffee 
+++ b/coffee 
@@ -1 +0,0 @@ 
-Sugar 
diff --git a/some-file b/some-file 
new file mode 100644 
index 0000000..e69de29 

(musimy -m uzyskać git porównać scalanie wobec obojga rodziców). I to znajduje to w nieco okrężny sposób.


(Tymczasem wydaje się, że nie ma lekarstwa na emisję przepoławiać. Dobrze, inne niż "uniknąć złych scala" ...)

+0

Dzięki za odpowiedź! Mój błąd z '--reverse' nie używał poprawnego lewego zatwierdzenia. –

+0

Aktualizacja: Próbowałem użyć 'winy 'teraz dla podobnego przypadku, ale gdzie stary commit usunął linie, które istniały wcześniej, a scalenie omyłkowo ponownie je dodało. "winę" nie udało się pokazać scalenia, które błędnie ponownie dodało linie, nawet jeśli użyłem '--full-history' oraz' --full-history --reverse branch..other_branch'. Każdy pomysł, dlaczego? –

+0

Nie jestem do końca pewien: sam nie używam "git win". Ogólnie jednak, niezależnie od tego, czy dzieje się to w przód czy w tył, po prostu porównuje (linie pliku) przed zatwierdzeniem i po zatwierdzeniu, parami, aby sprawdzić, czy linia została zmieniona lub usunięta. Następnie linia otrzymuje identyfikator odpowiedniego zatwierdzenia pary.Ta metoda nie działa (i nie może) działać bardzo dobrze w przypadku łączenia, ponieważ istnieje wiele powiązań. – torek