Подтвердить что ты не робот

Git; код исчез после слияния

Мой коллега немного изменил ситуацию - представил новую функцию - и это было (успешно) выполнено для git. Однако теперь эта функция пропала.

С помощью git log --reverse мне удалось найти последнюю фиксацию, где эта функция все еще находится в коде (48d60a03). Следующий (e6f28bfd) commit (где исчезла данная функция) является слиянием (14158e1), но git show 'ни одно из них не обнаруживает удаления недостающего кода.

Другими словами, код исчез во время слияния, без удаления в любой из объединенных ветвей.

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

Связанный вопрос; могу ли я как-то узнать, есть ли другие примеры вещей, идущих до свидания? Я немного волнуюсь;)

4b9b3361

Ответ 1

Поскольку ваша история уже нажата, лучшим способом является создание нового коммита. В противном случае вы рискуете потерять другой код и повредить все репозитории.

Поскольку вы знаете, где фиксация, которая имеет последнюю функцию, вы можете git checkout 48d60a03 -- <name of file with function>. Затем вы можете передать старый/новый файл с помощью функции.

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

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

Ответ 2

Изменения

которые были совершены в какой-то момент, трудно полностью потерять. Попробуйте запустить 'git reflog' и посмотреть, можете ли вы обнаружить зафиксированный вами коммит. Затем вы можете объединить его в текущую ветку, запустив "git merge [SHA1 вашей потерянной фиксации]".

Ответ 3

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

Используйте git diff. У фиксации слияния есть два родителя:

*   8ac6131 (M) Merge branch 'B'
|\
| * 5a53959 (B) two
|
* 7cb5a06 (A) one

Используйте git diff AM и git diff BM для просмотра различий между коммитом слияния и любым его родителем. Вы должны увидеть свою отсутствующую функцию там.

Ответ 4

Если вы знаете идентификационный раздел потерянного кода, вы можете найти точное слияние, которое потеряло ваш код, используя git log -G regexToSearchFor -m --patch

  • -G <regex> сообщает Git: "Ищите различия, текст патча содержит добавленные/удаленные строки, которые соответствуют <regex>"
  • -m сообщает Git включить комманды слияния
  • --patch сообщает Git, чтобы показать diff того, что он находит

Ответ 5

Связанный вопрос; могу я как-то узнать, если есть другие случаи вещи, идущие до свидания, как это? Я немного волнуюсь;)

Попробуйте git whatchanged. Например,

git whatchanged --since="2 weeks ago" -- gitk

Покажите изменения в течение последних двух недель в файле gitk.

Ответ 6

У меня было точно так же. У меня была новая ветка, своего рода версия 2 продукта. Затем я хотел объединить текущий мастер (версия 1 продукта) с версией 2. Во время этого слияния много нового кода в версии 1 продукта теряется. Это очень расстраивает, так как десятки файлов с потерянным кодом, и я должен пройти по нему вручную :(

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