2016-02-16 2 views
0

Я обнаружил, что мои изменения со вчерашнего дня потеряны в git. Я исследовал и нашел две фиксаций неисправности, которые были сделаны одним из наших младших разработчиков:Broken merge commit

Screenshot

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

После этого момента эта ветка была объединена с и разработала и теперь объединена с несколькими ветвями функций.

Так что я знаю фиксацию на этой ветке перед слиянием. Я знаю, что я знаю, что это произошло.

Как исправить историю без потери изменений? Я подумывал начать с фиксации на перед слиянием и вишней выбрать все последующие изменения, избегая этих двух коммитов. Это около 30-40 коммитов. Есть ли лучшая стратегия?

ответ

0

Выбранное сообщение фиксации говорит об объединении, но не содержит никаких ссылок на коммит, который слился

Это специальный коммит с именем «Объединить совершить»

Читайте об этом здесь : https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Вместо того, чтобы просто перемещать указатель перехода вперед, Git создает новый моментальный снимок, который является результатом этого трехстороннего слияния и автоматически создает новая фиксация, указывающая на это. Это называется фиксацией слияния и особенным в том, что у него более одного родителя.

enter image description here


Слияние коммит создается, когда вы решили работать в конфигурации no-ff (без быстрой перемотки вперед).

--no-ff флаг предотвращает git merge от выполнения быстро вперед, если он обнаружит, что ваш текущий HEAD является предком фиксации вы пытаетесь объединить.

Быстрая перемотка вперед, когда вместо создания коммита слияния git просто перемещает указатель на указатель, чтобы указать на входящую фиксацию. Это обычно происходит при выполнении git pull без каких-либо локальных изменений.

Чтобы понять разницу между ff и no-ff посмотрите на это: enter image description here

+0

Как я могу видеть родителей этого совершения? –

+0

Я не вижу эту фиксацию с 'git log -min-parents = 2 -p -cc' –

+0

git show commit id, а затем вы должны увидеть 2 родителя – CodeWizard

1

Так что я не знаю, как ваш разработчик сумел добавить не-слияние; это как если бы он прошел --squash до git merge, хотя это довольно сложно сделать случайно.

Как бы то ни было, обычно я пытаюсь вернуть слияние, но то, что вы хотите сделать, это вернуть «слияние» относительно второго родителя, и в этом не слиянии нет второго родителя.Возвращение реального слияния не будет иметь никакого эффекта, поскольку оно не изменило никаких файлов. Поэтому давайте попробуем сделать «ручную отмену» того, что было бы слиянием. Предположим, что хеш фальшивого слияния - abc, а реальный (но пустой) хэш хэнд-объединения - xyz. Если мы запускаем следующее:

git diff -3 abc xyz^2 | git apply 

Тогда git будет (надеюсь) отменить часть урона. Эта команда выполняет необходимые шаги, чтобы довести состояние поддельного слияния до состояния разработки до поддельного слияния и применить эти шаги к рабочему каталогу. Если он применяется чисто, вы можете добавить/зафиксировать изменения. Опция -3 сообщает apply, чтобы попытаться слить 3 пути, если исправление не применяется чисто; вы можете попробовать его как с этим, так и без него.

Конечно, может случиться так, что с тех пор было так много изменений/слияний, что это не помогает. Но это стоит того!

+0

Похоже, она попыталась объединиться и получила много конфликтов. Она разрешила их, но после того, как она спрятала их и после того, как сделала другие изменения и совершила эти изменения. Решение и фиксация были выполнены в Android Studio, но в StringText –

+0

@EugenMartynov, я не уверен, как это приведет к сообщению о фиксации, заявив, что это слияние, когда это действительно не так, но, возможно, Android Studio делает что-то напуганное. В любом случае, дайте мне знать, если 'git diff -3 abc xyz^2 | git apply' работает для вас. –