2013-07-16 1 views
0

Итак, у меня было две ветки на github - мастер & рефакторинг. Я проверил рефакторинг на месте и отправился в город. В какой-то момент я прищурился и сделал git push origin master вместо того, чтобы нажимать на источник рефакторинга, и, кроме того, не заметил вопроса до двух недель спустя после принятия дальнейших действительных изменений в мастер.Git revert winup - восстановление?

/меня facepalms

Пытаться не-Борк вещей, я проверил мастер локально, и сделал git revert <some tag>, которое фиксировало мастер, удалив различные файлы, которые я добавил, и так далее. Счастливый конец! Оттолкнутый хозяину происхождения, все было хорошо. Умел работать над моей локальной рефакторинговой ветвью, иногда отбрасывая регенератор.

Сегодня я закончил с первым проходом моего рефакторинга и хочу подтолкнуть свои изменения к мастеру. I git add, git commit, git push origin refactor. Все хорошо. Затем я пытаюсь нажать на начальника. Потерпеть неудачу! Неудивительно, что требуется ручное слияние из-за махинаций, верно? Итак, я git pull origin master в моей местной ветке рефакторинга ... и все щеки разрываются. Все мои новые файлы удалены, конфликты повсюду.

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

Итак, поскольку я все еще git newb, любые предложения о том, как спасти мою хромоту? Бонусные баллы, если вы можете дать общее руководство/образование о том, как избежать этого класса ошибок в моем будущем рабочем процессе. Благодаря!

ответ

3

О том, как избежать этого в будущем: установить push.default в upstream и только когда-либо работать git push без дальнейших рассуждений, если вы явно не хотите, чтобы нажать на другую ветку (который я лично никогда не делал). Не нажимайте на другие ветви. Отъезд master, слияние refactor, push.

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

Устранение неполадок: вы правильно поняли: вы объединяете свою команду revert commit, так что это делает git. Вот как предотвратить это:

  • Создать новую ветку master-fix-revert из master и проверить его:

    git checkout -b master-fix-revert master 
    
  • Вернуть вы убираете:

    git revert **SHA-of-revert-commit** 
    
  • проверить свой refactor филиал и объединить свои master-fix-revert:

    git checkout refactor 
    git merge master-fix-revert 
    
  • удалить временную ветвь:

    git branch -d master-fix-revert 
    
+0

Спасибо @Chronial, даст этот снимок завтра, когда я вернусь к работе. Спасибо за указатель на push.default, там будут некоторые чтения. –

+0

Это сделало трюк. Кроме того, для людей, которые находят это в будущем, http://code.google.com/p/git-core/source/browse/Documentation/howto/revert-a-faulty-merge.txt хорошо читает Linus on субъект. –

0

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

Если это не ваш случай, я предлагаю отменить изменения, используя более интуитивные методы, такие как git reset. Допустим, ваша главная ветвь совершила A, B, C, и вы случайно положили D и E поверх этого.

     master 
A <-- B <-- C <-- D <-- E 

Если D и E были ваши нежелательные, лишние фиксаций, вы можете просто сделать:

Перейти на локальном мастер отрасли:

git checkout master 

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

git reset --hard <sha1 of C> 

      master   
A <-- B <-- C 

Затем нажмите на свой репозиторий с помощью силы, так как вы переписали историю и, таким образом, не быстрая перемотка вперед:

git push origin master -f 

Затем контроль рефакторинга и продолжать работать в теме. Если вы хотите, чтобы пикап, откуда ваш мастер ветви указывал (т.е. с дополнительной лишними фиксаций), вы можете использовать git reset, чтобы установить его там:

git checkout refactor 
git reset --hard <sha1 of E> 

      master  refactor 
A <-- B <-- C <-- D <-- E 

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

затем просто продолжать добавлять к фиксациям refactor, а затем объединить освоить и нажать мастер:

git checkout master 
git merge refactor 
git push origin master 

          master 
          refactor 
A <-- B <-- C <-- D <-- E <-- F 

Там все еще очень простой рабочий процесс. Мое предложение было бы использовать инструмент, как gitk:

gitk --all 

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