Согласно git , коммит является предком другого коммита, но также не

#git

#git

Вопрос:

Итак, у меня есть странный случай, когда некоторые команды git log утверждают, что коммит является предком другого коммита, но другие команды утверждают, что это не так. Затем после слияния коммита снова это правильно.

Так что это определенно в истории:

 > git log 533f43d27f1a937d43dc00cf33684efeeeea6f58 | grep 25303646749f814a64339845fef830d60236b47c
commit 25303646749f814a64339845fef830d60236b47c
> git log --oneline --graph 533f43d27f1a937d43dc00cf33684efeeeea6f58 | grep 253036467
| | * | | | | | | | | | | | | | | | | | | 25303646749 [commit message stripped]
 

Но это также не:

 > git log 533f43d27f1a937d43dc00cf33684efeeeea6f58..25303646749f814a64339845fef830d60236b47c | grep commit
commit 25303646749f814a64339845fef830d60236b47c
> git log --oneline --graph 533f43d27f1a937d43dc00cf33684efeeeea6f58..c4353c35b7233c4cab8e63817aac28dda5dbf8bc | grep 25303646749
| * 25303646749 [commit message stripped]
 

Я не могу его объединить:

 ((533f43d27f1...))> git merge 25303646749f814a64339845fef830d60236b47c
Already up to date.
 

Но я могу объединить что-то еще, что его содержит:

 ((533f43d27f1...))> git log --no-merges  ..c4353c35b7233c4cab8e63817aac28dda5dbf8bc | grep commit
commit 0f3704bf5a6428940ee0b1f1df36ebbe807cca99
commit 25303646749f814a64339845fef830d60236b47c
((533f43d27f1...))> git merge c4353c35b7233c4cab8e63817aac28dda5dbf8bc
Merge made by the 'recursive' strategy.
 

И затем он больше не отображается в журнале git:

 ((c474a8be528...))> git log ..25303646749f814a64339845fef830d60236b47c
((c474a8be528...))>
 

До сих пор я не смог воспроизвести это с помощью какого-либо другого коммита. Есть идеи о том, что может вызвать это?

Комментарии:

1. Какую версию Git вы используете? Если это 2.28 или более поздняя версия, включили ли вы некоторые из более популярных новых растровых алгоритмов?

2. Есть ли у вас какие-либо активные git replace данные в вашем репозитории? из корневого каталога вашего репозитория: запустите ls .git/refs/replace

Ответ №1:

Во-первых:
Вы используете grep на выходе git log , который также может показать вам строки, которые появляются в любом месте.

Может ли быть, что коммит 533f43d27 (или один из его родителей) содержит строку с указанием :

 commit 25303646749f814a64339845fef830d60236b47c
 

в его сообщении?

Во-вторых:
вы просматриваете историю 533f43d27 , но команды в вашем вопросе не проверяют, каково значение активного commit ( HEAD ) :

 git rev-parse HEAD
 

Для grep для идентификаторов фиксации : используйте git rev-list вместо git log .

Чтобы иметь представление об истории вашего репо в вашем терминале, я рекомендую :

 git log --oneline --graph

# can be combined with any other parameters for git log :
git log --oneline --graph 533f43d2
git log --oneline --graph 533f43d2..25303646
git log --oneline --graph --no-merges ..c4353c3
# etc ...
 

Чтобы настроить для него ярлык :

 git config --global alias.lol 'log --oneline --graph'

# usage :
git lol 533f43d2..25303646
git lol --no-merges ..c4353c3
 

В вашем случае взгляните на :

 git lol 533f43d2 c4353c3
 

Команда для проверки, является ли A она предком B :

 git merge-base A B
# if it displays A : A is an ancestor of B
# if it displays B : B is an ancestor of A
# if it displays something else : A and B forked, and aren't ancestors or descendants
 

Комментарии:

1. Grep довольно безопасен, так как «commit» не может появиться в начале строки, если в сообщении о фиксации сообщения о фиксации всегда предназначены.

2. Ты прав. Есть ли у вас более четкое представление об использовании --graph though?

3. —graph практически бесполезен, так как у нас есть сотни разработчиков, которые вносят свой вклад в несколько отдельных ветвей выпуска с помощью отдельных pull-запросов, а затем ветви выпуска объединяются друг с другом. График немедленно заполняет весь экран… Фиксация, безусловно, может быть достигнута в истории по разным маршрутам. Но до сих пор я всегда предполагал, что <commit a>..<commit b> синтаксис — это просто заданное поведение: покажите мне все коммиты, которые являются предками commit b, но не commit a . Но каким-то образом я заставил git нарушить это. Поэтому я пытаюсь выяснить, как это может сработать.

4. Добавлен вывод некоторых команд —graph в вопросе

5. О, у вас есть один из этих массивных графиков для обработки, хорошо. Один момент, в вашем абзаце «Но это тоже не так», два диапазона, которые вы проверяете, разные ( 253... vs c43... )