2010-08-21 2 views
8

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

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

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

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

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

+3

Откат к старой резервной копии всегда работает для меня –

+8

Во-первых, сделать полную резервную копию рабочего дерева и '.git' папку сейчас и поместить его в безопасное место, желательно только для чтения. Из того, что вы сказали, очень маловероятно, что вы потеряли работу (нет «reset -hard», и это звучит так, будто вы возились с вещами, совершенными на филиалах). Как только вы это сделаете, найдите эксперта git на интерактивном канале, где вы сможете поговорить о том, как искать и восстанавливать предыдущее состояние. stackoverflow почти наверняка не является форумом для этого, потому что вам нужна интерактивная помощь, а не только вопросы и ответы. –

+0

Спасибо всем, я буду использовать все предложения и что-то выяснить, я пока не могу выбрать ответ. – 2010-08-25 13:51:18

ответ

1

Ошибки:

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

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

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

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

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

+0

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

+4

Я изначально начал печатать в комментарии и выбежал из комнаты. : -/ – Chris

4

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

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

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

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

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

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

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

Когда вы удовлетворены тем, что ветка Fixup верна, вернитесь к главной ветке и слейте ветвь Fixup в master.


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

14

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

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

git checkout -b rescue abc123 

создает новый филиал под названием rescue на коммит идентификатор abc123.

Когда я изучал git, у меня был такой же «где я, и как я сюда попал»? момент. Я узнал о рефлоге на different Stack Overflow question, и это было самое ценное, что нужно знать о Git.

+0

Я второй этот комментарий, который вы должны обратить внимание на Джонатана. Запустите 'git reflog' (или' git log -g', чтобы получить ту же информацию с некоторыми дополнительными данными), найдите последнее коммандное, которое было хорошим, и проверите ветку в этой точке. –

+0

Также есть небольшая документация по такой ситуации: http://progit.org/book/ch9-7.html#data_recovery –

+0

Я пришел сюда, чтобы сказать «reflog!». просто из названия вопроса. – masonk

1

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

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

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

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

gitk --all ## show me all the branches 
+0

Также (еще лучше?): 'Gitk --reflog' - Я думаю, что это новая функция, но очень полезная. – nobar

Смежные вопросы