Git - ошибка фиксации без изменений содержит - PullRequest
0 голосов
/ 09 января 2020

Git commit history

Рассмотрим эту git историю. Если я извлекаю второй выделенный коммит (или любой коммит выше него / новее), то он содержит ошибку, которую я вижу на экране (особенности ошибки не слишком актуальны).

Если я извлекаю третий коммит ( или любые коммиты ниже / старше), тогда я больше не вижу ошибку на экране.

Как вы можете видеть, второй коммит содержит 0 измененных файлов с 0 добавлениями и 0 удалениями.

Как тогда переключение между этими двумя коммитами вводит или удаляет ошибку, которую я пытаюсь исправить !? Я не могу сказать, какие файлы меняются между двумя коммитами?


Обновление

Приведенное выше изображение не совсем верно, фактическая ситуация ниже. Я не осознавал, что это может произойти в GIT, если бы кто-то мог объяснить, как НЕТ БАГА можно было бы повторно ввести в коммит «Убедитесь, что мы всегда возвращаем целое число», что было бы здорово!

Full git history

Ответы [ 3 ]

2 голосов
/ 09 января 2020

История редко бывает прямой линией

В вашем обновленном графическом изображении у вас есть новые коммиты к верху и более старые коммиты к низу. Все было превращено в красивую аккуратную прямую. Но это искаженное представление о реальности, точно так же, как искажено каждое представление. (Мы можем представить Эйнштейна и относительность, если это необходимо, чтобы доказать это, но давайте просто примем это как данность, что нам нравится смотреть на вещи с того места, где мы сидим / стоим сейчас, в отличие от того, где вещи были, когда они были, какими бы они ни были и у нас не было сегодняшней перспективы. Завтра или в следующем году у нас будет еще одна перспектива!)

Давайте перерисовать эту историю другим способом, чтобы прояснить ситуацию. Мы поместим более старую работу в слева , а более новую работу в справа и нарисуем ее параллельно , например:

...--o--o---o
             \
              X--X--X   <-- master
             /
...--o---X--X   <-- feature/buggy
         ^
         |
  bug introduced

где X представляет коммит с ошибкой. Обратите внимание, что первый ошибочный коммит в нижнем ряду пришел после одного из хороших коммитов, показанных в верхнем ряду, затем второй ошибочный коммит пришел одновременно (или даже немного раньше) с последним хорошим коммитом в верхнем ряду , Ошибка, очевидно, была впервые введена в отмеченную мною точку.

Теперь, если мы рисуем эту линеаризацию по вертикали с новыми коммитами вверху, мы получаем:

.
.
.
X   (still has bug introduced by merge)
X   (bug first introduced by merge)
o   (commit from the top row, not broken)
X   (bug in feature/buggy - commit from the bottom row)
X   (bug in feature/buggy)
o   (commit from the top row, not broken)
.
.
.

В линеаризованной вид, глючные коммиты разделены хорошими коммитами. В «правильном» (или, по крайней мере, менее искаженном) представлении, которое просматривает историю по одной «ноге» за раз, ошибочные коммиты все в ряд.

Фактическое представление, которое вы показываете в обновленном graphi c, имеет коммит, чье сообщение в журнале говорит Merge remote-tracking branch 'AWS/... (это обрезается), но не является коммитом merge (коммит с двумя или более родителями) , Это тип слияния, осуществляемый git merge --squash, или - на некоторых веб-интерфейсах - нажатием кнопки с надписью что-то вроде «squa sh and merge». Эти коммиты выполняются с использованием Git механизма слияния , но не записывают правильную историю. 1 Так что в этом случае, единственный способ узнать это от har sh опыт: я видел именно такую ​​проблему раньше. Графики, которые я здесь нарисовал, показывают, как все выглядело бы, если бы слияние было обычным слиянием, а не слиянием sh.

Ничто из этого не является критическим, но кто-то в вашей организации вероятно, потребуется некоторое время и узнать, как Git работает на мелком уровне, чтобы упростить поиск и исправление ошибок в будущем.


1 Это часто преднамеренно Идея состоит в том, чтобы рассказать историю ie, чтобы облегчить дальнейшее расследование, даже на самом деле оно усложняет будущее расследование. Насколько хорошо работает эта функция «squa sh», зависит от навыков и знаний тех, кто ее использует. Любой, кто использует его вслепую, использует его неправильно, в том смысле, что любой, кто использует электроинструменты, не научившись использовать их безопасно, использует их неправильно, даже если они случайно используют их правильно. ?

2 голосов
/ 09 января 2020

Я прокомментирую, что на самом деле означает следующий текст:

Отображение 0 измененных файлов с 0 добавлениями и 0 удалениями

Это просто означает, что нижний (второй ) коммит не имеет никаких изменений по сравнению с коммитом, который пришел до этого. Таким образом, если проверка этой фиксации устраняет ошибку, это не обязательно означает, что фиксация - это то, что внесло изменения для ее исправления. Скорее, некоторые более ранние коммиты несут ответственность. Для диаграммы рассмотрим:

A -- B -- C

Ошибка была введена в коммите C, но не присутствовала в коммите A. Поскольку фиксация B фактически не выполнялась, в ней также отсутствует ошибка.

1 голос
/ 09 января 2020

Слышали ли вы о git bisect ?

Эта команда, когда выполняется и выполняется, точно определит один коммит, который привел к ошибке.

Вкратце, вы начинаете с выполнения команды и предоставления ей «начальной точки» (SHA коммита), которая, как вы знаете, НЕ имеет ошибки, затем вы даете ей «конечную точку» (также SHA коммита), которая вы знаете, что у DID есть ошибка, тогда git будет выполнять процесс типа «разделяй и властвуй» и будет проверять версии для вас, при каждой проверке вы будете проверять и проверять, есть ли ошибка, или сообщать ее * 1014. * (плохо против хорошо), и git продолжит поиск на основе вашего ввода. Наконец, он отобразит коммит, который привел к ошибке.

Стоит попробовать и это легко (и супер весело) сделать.

...