2016-04-20 2 views
6

Я использую Git в течение примерно 7 лет. Несколько дней назад я нашел поведение, которое меня удивило. Я нашел git log, git blame и git bisect, чтобы показать это странное поведение. A friend Сообщите мне о --full-history флагом git log, который решил мою проблему. Я хочу знать, для моего собственного образования, есть ли эквивалентное исправление для git blame и git bisect.Git: Эквивалент `--full-history` для` git bisect` и `git blame`

Вы можете увидеть проблему для себя с этим репо: https://dl.dropboxusercontent.com/u/1927707/problematic_repo.7z

Вот его журнал:

$ 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 

В самом первом коммит, был добавлен файл coffee. В commit 3068c7d я добавил строку «sugar» в файл coffee. Но затем я объединил эту ветвь в ветку development, и в этом слиянии была допущена ошибка, и линия «сахар» была удалена, оставив coffee пустым. Затем была добавлена ​​другая фиксация b7a8d7a, создающая несвязанное изменение.

Теперь я смотрю на свой кофе и обнаруживаю, что в нем нет сахара. Я отчетливо помню, как добавлял сахар к моему кофе. Я бегу git log coffee, и получить этот результат:

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

    Create coffee 

Вот и все. git log не показывает ни мою первоначальную фиксацию, которая добавила сахара, ни слияние, которое его удалило. Два очень важных коммита, которые отсутствуют.

Я был расстроен около часа этой проблемой, потому что это произошло на огромном предприятии-репо, где совершается гораздо труднее найти вручную.

Я также пробовал использовать git bisect и git blame для фиксации двух коммитов, но оба этих инструмента игнорировали две коммиты. git bisect указал мне на неправильную фиксацию после того, как я закончил делать все действия git bisect bad и git bisect good.

Тогда, как я уже сказал в начале, друг указал мне в стороне --full-history флага:

$ 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          

Это делает меня счастливым, потому что он показывает два соответствующих фиксации, одну добавления сахара и слияние, которые удалены Это. Поэтому моя проблема решена. Но я действительно хотел бы знать, как сделать git bisect и git blame вести себя хорошо. Кто-нибудь знает?

+0

'мерзавец blame' вполне может позволить' --full-истории 'прямо здесь (я бы попробовал его на вашем репо, но я не могу распаковать файл 7zip). Bisect может отказаться от слияния, поскольку он сам обрабатывает их. В общем, вы не видите их, потому что 'git rev-list' пропускает много слияний: см. Обсуждение документации по TREESAME и обработке слияния (и как --full-history изменяет это). – torek

+0

@torek Я попробовал это сейчас, 'виноват', кажется, принимает флаг, но похоже, что он ничего не меняет. Попытка «git wame --full-history» и «git wame --full-history -reverse» не показала никаких результатов. Относительно того, что я не могу открыть 7z-архивы, здесь он находится в почтовом индексе: https://dl.dropboxusercontent.com/u/1927707/foo.zip –

+0

@torek Также пробовал «git wame --reverse HEAD ^^^ .. HEAD --full-history coffee', все еще ничего не получая. –

ответ

0

Интересно. Поскольку линии там нет, git blame начинается совершенно бесполезно. В документации git blame примечания:

В докладе ничего не говорит вам что-нибудь о линиях, которые были удалены или заменены; вам необходимо использовать такой инструмент, как git diff или интерфейс «кирка», кратко упомянутый в следующем параграфе.

В этом случае мы могли бы запустить git log -SSugar, чтобы найти, где он вошел в:

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

но git blame не сразу поможет нам найти, где он вышел. (И, как вы только что узнали, если мы хотим найти эту строку при упоминании файлов, нам может понадобиться --full-history, так как добавление путей для ограничения коммитов git log будет учитывать, также упрощает упрощение истории, обрезая дерево каждого коммита, . указанные файлы, а затем с помощью этого TREESAME код)

Начиная с заведомо исправным оборот, мы можем теперь попытаться --reverse [редактировать: Я заметил 3068c7d2548f1798b6840f73b13a649937339f28 == master и фактически используемые master здесь, вероятно, должен был использоваться SHA-1 непосредственно]:

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

Это, кажется, подразумевает, что 3068c7d последний оборот, в котором существует линия, поэтому она должна быть удалена в некоторых или всех детей по этому конкретному пути, это верно:

$ 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 

Существует только один коммит что ребенок 3068c7d здесь, а именно 0aa8339, так:

$ 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 

(нам нужно -m получить мерзавца сравнить слияние против обоих родителей). И это находит это, немного окольным путем.


(Между тем, кажется, нет никакого лечения для выпуска Bisect. Ну, кроме "избегать зла слияния" ...)

+0

Спасибо за ваш ответ! Моя ошибка с '--reverse' не использовала правильную левую фиксацию. –

+0

Обновление: я попробовал использовать «вину» сейчас для аналогичного случая, но когда старая команда удалила строки, существовавшие до этого, и слияние по ошибке повторно добавило их. 'винить' не удалось показать слияние, которое ошибочно добавило строки, даже когда я использовал' --full-history' и '--full-history -reverse branch..other_branch'. Любая идея почему? –

+0

Я не уверен: я не так сильно использую «git-вину». В общем, однако, независимо от того, идет ли он вперед или назад, он просто сравнивает (строки файла в) каждый до/после фиксации, принимается попарно, чтобы увидеть, была ли строка изменена или удалена. Затем линии присваивается идентификатор соответствующего фиксации пары.Этот метод не работает (и не может) очень хорошо работает при слияниях, поскольку существует несколько пар. – torek

Смежные вопросы