Исправление репозитория Git после неправильного слияния

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

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

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

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

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

8
задан 25 March 2012 в 18:54
поделиться

4 ответа

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

Это хорошие новости.

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

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

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

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

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

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


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

4
ответ дан 5 December 2019 в 08:22
поделиться

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

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

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

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

gitk --all ## show me all the branches
1
ответ дан 5 December 2019 в 08:22
поделиться

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

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

git checkout -b rescue abc123

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

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

14
ответ дан 5 December 2019 в 08:22
поделиться

Ошибки:

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

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

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

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

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

1
ответ дан 5 December 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: