Как возвратная фиксация может также быть фиксацией слияния?

Недавно на работе мы потеряли часть кода в проекте, находящемся под контролем версий с использованием git (и частного репозитория github).

Я использовал git bisect, чтобы найти коммит-виновника, и был очень удивлен, обнаружив, что он выглядит как возвратный коммит, но также имеет двух родителей, таких как коммиты слияния:

commit b5f97311eea2905baf8a96fddec22321d952f05c
Merge: 8cc7371 131d463
Author: Bob <[email protected]>
Date:   Fri May 22 19:42:25 2015 +0200

    Revert "ISB-CPW-3627 - Mise en place du calage des filtres DS1/DS2/DS3/DS4"

    This reverts commit 8cc7371e7133b68db95ac8e9aeb730d7889a1166.

Эта проблема была решена путем создания новой ветки из коммита-предка и применения некоторых исправлений поверх этой новой ветки.

Поэтому мне не нужна помощь, чтобы исправить это, я просто хочу понять, как обратная фиксация может также быть фиксацией слияния, что произошло и как воспроизвести это странное поведение.

Я попытался воспроизвести это так:

  • создать новую ветку в 8cc7371
  • git вернуться 8cc7371

Он создает возвратную фиксацию с одним родителем (8cc7371), как и ожидалось.

Автор коммита-виновника использует Atlassian SourceTree вместо собственного интерфейса командной строки, поэтому я также попытался использовать функцию возврата в SourceTree и получил тот же результат, что и выше (один родитель).

После запуска некоторых команд git на b5f9731 я заметил, что git diff и git show не сообщают об одном и том же наборе файлов:

$ git diff b5f9731..8cc7371 --name-only
=> 2 files :
   application/sites/frontend/views/scripts/Layout/Foobar/PointsDeVente/index.tpl
   public/media/design/frontend/css/main-dev.css
$ git show --oneline --name-only  b5f9731
=> 1 file :
   public/media/design/frontend/css/main-dev.css

SourceTree and Github are showing 2 files.

You can find how the graph looks like here : graph.html, and some git результаты команд:

person Vince    schedule 13.06.2015    source источник
comment
Я добавлю этот пост в избранное и буду использовать его в качестве специального справочника по вопросам, связанным с Git.   -  person Nick Volynkin    schedule 13.06.2015
comment
Как продвигается расследование?   -  person Nick Volynkin    schedule 15.06.2015
comment
Сегодня я играл с интерактивной функцией перебазирования SourceTree и не смог воспроизвести проблему. Я предполагаю, что эта проблема как-то связана с git rebase или git pull --rebase, но я сдаюсь. У меня недостаточно информации, 3 недели назад, когда это произошло, я попросил автора коммита прислать мне его рефлог для дальнейшего изучения, но он не смог этого сделать. Он работает в другой компании (они работают на внешнем интерфейсе, тогда как моя компания работает на стороне сервера), общение затруднено. Загадка осталась :с   -  person Vince    schedule 16.06.2015
comment
см. это: stackoverflow.com/questions/30863227/   -  person Nick Volynkin    schedule 16.06.2015


Ответы (2)


Что приходит мне на ум:

git revert ...
# new commit abcdef
git merge ...
# new commit fedcba
git rebase -i HEAD~2

pick abcdef - the original revert commit
squash fedcba - the merge commit

Сообщение взято с abcdef.

Все это приводит к новому b5f9731. У него есть два родителя из коммита слияния и сообщение из коммита возврата.

person Nick Volynkin    schedule 13.06.2015
comment
Спасибо, это хорошая идея. Я ожидал чего-то более простого, чем интерактивная перебазировка (поскольку автор коммита — новичок), но действительно, SourceTree справляется с этой функцией. - person Vince; 13.06.2015
comment
@Vince Преимущество графических интерфейсов в том, что они позволяют массовое уничтожение нажатием кнопки (обычно непреднамеренно). - person Nick Volynkin; 14.06.2015

Шаги по отмене фиксации из локальной ветки следующие:

1) Выполните команду «git log -1» в git bash 2) Получите «зафиксированный GUID» из приведенной выше команды 3) Выполните команду «Git reset --hard commit GUID» в git bash

person Vikram Sehgal    schedule 05.01.2016