Исправление Git репо после некорректного слияния - PullRequest
8 голосов
/ 22 августа 2010

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

Я предполагаю, что должен был объединить их, но вместо этого яgit commit -a после проверки каждой ветви.

Затем я понял, что вся программа вернулась во времени, поэтому я запустил git reset --soft HEAD (где-то читал в статье, что это должно помочь), но этоничего не делал.

Я также получил это сообщение от git о ручном удалении некоторого ./git/index.lock, поэтому я переместил его в ./git/backup_of_index.lock, но это тоже ничего не дало.

Как мне исправить мой репозиторий и объединить все ветви?

Ответы [ 4 ]

14 голосов
/ 22 августа 2010

Самая важная команда git в этой ситуации: git reflog. Reflog отслеживает все изменения в каждой конкретной ветви ветви, а команда git reflog перечисляет все изменения в голове ветви, относящиеся ко времени.

Если вы можете определить «хороший» идентификатор фиксации, используя reflog (и он будет где-то там), то вы намного впереди того, где находитесь сейчас. Если хороший идентификатор фиксации, скажем, abc123, то команда:

git checkout -b rescue abc123

создает новую ветвь с именем rescue в идентификаторе фиксации abc123.

Когда я изучал мерзавец, у меня было похожее «где, черт возьми, я и как сюда попал?» момент. Я узнал об reflog по другому вопросу переполнения стека , и это было самое ценное, что нужно знать о Git.

4 голосов
/ 22 августа 2010

Если вы не взломали данные в каталоге .git, маловероятно, что вы что-то потеряли. У вас может быть ужасный беспорядок, который нужно вычистить, и может потребоваться много времени, чтобы разобраться, что вы сделали и где это, но вы, вероятно, ничего не потеряли.

Это хорошая новость.

Плохая новость в том, что кому-то очень трудно будет вам сильно помочь.

Вероятно, вам потребуется идентифицировать все ветви и проследить обратные коммиты на каждой. Вам нужно будет решить, были ли все эти операции git commit -a хорошими. Это звучит маловероятно - поэтому вам, возможно, придется выполнять слияния должным образом, работая от одного до последнего коммита в каждой ветви.

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

Звучит так, как будто вы хотели объединить некоторое количество ветвей - назовите их BranchA, BranchB и BranchC - в основной ветви master. Но не ясно, что вы пытались это сделать.

Учитывая, что все в порядке, я рекомендую создать еще одну ветку, которую мы можем назвать «Fixup». Создайте это из головы главной ветки. Затем объедините соответствующую версию каждого из BranchA, BranchB и BranchC в ветку Fixup. На каждом этапе проверяйте, действительно ли код работает правильно - проходя тестовый набор и т. Д. Проверяйте каждое слияние отдельно в ветви Fixup.

Когда вы убедитесь, что ветка Fixup верна, переключитесь обратно на главную ветвь и объедините ветку Fixup с главной.


Чарльз Бэйли делает очень разумное предложение (в комментарии к вопросу): прежде чем делать что-либо еще, сделайте резервную копию того, что у вас есть, именно так, как оно есть в настоящее время. Только после этого приступайте к любым операциям очистки. И его предложение получить интерактивную помощь также разумно.

1 голос
/ 22 августа 2010

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

Мой предложенный подход для решения вашей текущей проблемы:

  1. Создание резервной копии всего вашего хранилища
  2. Поэкспериментируйте с одноразовыми копиями хранилища
  3. Каждый раз, когда вы портите одноразовое хранилище - выбрасывайте его и начинайте заново с новой копией из резервной копии
  4. В конце концов, вы начнете осваивать хакерские операции репо - вы восстановите свою работу, и вы будете чувствовать себя хорошо о том, что узнали

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

gitk --all ## show me all the branches
1 голос
/ 22 августа 2010

Ошибки:

  1. «Я начал играть с git на моем новом проекте»
  2. «Я просто хотел объединить их, так как каждая из них была обновлением для разных частей программы»

Вы не должны играть с незнакомой территорией, когда ваш код что-то значит. Если вы хотите сделать это, по крайней мере, иметь запасной план.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...