Отмените слияние Git, которое еще не было перенесено - PullRequest
3492 голосов
/ 05 марта 2010

В моей основной ветке я сделал git merge some-other-branch локально, но никогда не выдвигал изменения в исходную мастер. Я не хотел сливаться, поэтому я хотел бы отменить это. При выполнении git status после моего слияния я получал это сообщение:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

На основании некоторых инструкций, которые я нашел , я попытался запустить

git revert HEAD -m 1

но сейчас я получаю это сообщение с git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

Я не хочу, чтобы моя ветвь была впереди при любом количестве коммитов. Как мне вернуться к этой точке?

Ответы [ 28 ]

13 голосов
/ 13 декабря 2018

Если вы находитесь в процессе слияния, вы всегда можете прервать его git merge --abort

13 голосов
/ 18 января 2013

Если вы еще не зафиксировали это, вы можете использовать только

$ git checkout -f

Это отменит слияние (и все, что вы сделали).

13 голосов
/ 17 февраля 2017

Добрался до этого вопроса также, пытаясь вернуться к исходному совпадению (т. Е. НЕТ фиксирует перед началом координат).Исследуя далее, обнаружил, что есть команда reset для именно этого:

git reset --hard @{u}

Примечание: @{u} является сокращением для origin/master.(И, конечно, вам нужен этот удаленный репозиторий, чтобы это работало.)

10 голосов
/ 09 июня 2011

Просто для дополнительной возможности, я в основном следовал описанной здесь модели ветвления: http://nvie.com/posts/a-successful-git-branching-model/ и поэтому обычно сливался с --no-ff (без ускоренной перемотки вперед).

Я только что прочитал эту страницу, так как случайно слил ветку тестирования вместо своей ветки релиза с мастером для развертывания (веб-сайт, мастер - это то, что работает). Ветвь тестирования объединена с двумя другими ветвями и насчитывает около шести коммитов.

Итак, чтобы отменить весь коммит, мне просто понадобился один git reset --hard HEAD^, и он полностью отменил слияние. Так как слияния не были быстро переданы, слияние было блоком, и один шаг назад - «ветвь не слита».

10 голосов
/ 13 декабря 2014

Вы можете использовать только две команды для отмены слияния или перезапуска с помощью определенного коммита:

  1. git reset --hard commitHash (вы должны использовать коммит, который хотите перезапустить, например, 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (Отправка новой локальной главной ветки в origin / master)

Удачи и вперед!

10 голосов
/ 25 июля 2018

Мне удалось решить эту проблему с помощью одной команды, которая не включает поиск идентификатора коммита.

git reset --hard remotes/origin/HEAD

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

10 голосов
/ 03 ноября 2017

Самый простой ответ дан один - Велмонт

Сначала сделайте git reset --merge ORIG_HEAD

Для тех, кто хочет сбросить после изменений, сделайте это (потому что это первый постзамечено для любых вопросов о слиянии git reset)

git push origin HEAD --force

Это будет сброшено таким образом, что вы не получите обратно объединенные изменения после вытягивания.

8 голосов
/ 26 июня 2012

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

Например, я случайно слил ветку разработки в masterи хотел отменить это.Используя следующие шаги:

git checkout develop
git branch -D master
git branch -t master origin/master

Вуаля!Мастер находится на той же стадии, что и источник, и ваше неправильно объединенное состояние стирается.

4 голосов
/ 21 марта 2013

Если вам нужно решение для командной строки, я предлагаю просто ответить на вопрос MBO.

Если вы новичок, вам может понравиться графический подход:

  1. Начните с gitk (из командной строки или щелкните правой кнопкой мыши в браузере файлов, если он у вас есть)
  2. Вы можете легко обнаружить коммит слияния - первый узел сверху с двумя родителями
  3. Перейдите по ссылке на первого / левого родителя (ссылка на текущую ветвь перед слиянием, обычно красная для меня)
  4. На выбранном коммите щелкните правой кнопкой мыши «Сбросить ветку до сюда» и выберитехард ресет там
4 голосов
/ 11 июня 2015

Стратегия: Создайте новую ветку, где все было хорошо.

Обоснование: Отменить слияние сложно. Существует слишком много решений, в зависимости от многих факторов, таких как то, совершили ли вы слияние или выдвинули его или были ли новые коммиты с момента вашего слияния. Также вам все еще нужно иметь относительно глубокое понимание git, чтобы адаптировать эти решения к вашему случаю. Если вы слепо следуете некоторым инструкциям, вы можете получить «пустое слияние», при котором ничего не будет объединено, и дальнейшие попытки слияния заставят Git сказать вам «Уже в курсе».

Решение:

Допустим, вы хотите объединить dev в feature-1.

  1. Найдите ревизию, которую вы хотите получить слияние:

    git log --oneline feature-1
    a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
    e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
    
  2. Проверить это (вернуться во времени):

    git checkout e5f6g7h8
    
  3. Создайте новую ветку оттуда и проверьте ее:

    git checkout -b feature-1
    

Теперь вы можете перезапустить слияние:

  1. Слияние: git merge dev

  2. Исправьте конфликты слияния.

  3. Фиксация: git commit

  4. Если вы удовлетворены результатами, удалите старую ветку: git branch --delete feature-1

...