В моей основной ветке я делал 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.
Я не хочу, чтобы моя ветвь была впереди любого количества коммитов. Как мне вернуться к этому моменту?
Ответы:
С
git reflog
проверкой, какой коммит перед слиянием (git reflog
будет лучшим вариантом, чемgit log
). Затем вы можете сбросить его, используя:Есть и другой способ:
Это вернет вам 1 коммит.
Имейте в виду, что любые измененные и незафиксированные / неснятые файлы будут сброшены в их неизмененное состояние . Чтобы сохранить их, либо спрятать изменения, либо см.
--merge
Опцию ниже.Как @Velmont предложил ниже в своем ответе, в этом прямом случае используется:
может дать лучшие результаты, так как это должно сохранить ваши изменения.
ORIG_HEAD
будет указывать на коммит непосредственно перед тем, как произойдет слияние, так что вам не придется охотиться за ним самостоятельно.Еще один совет - использовать
--merge
переключатель вместо,--hard
так как он не сбрасывает файлы без необходимости:источник
git log
выбрано для отображения по умолчанию - может быть, есть другой выводgit log
илиgit reflog
может быть использовано для этого)git log
выводе вы хотите посмотреть на два родительских коммита. Один из них - последний коммит в вашей ветке, второй - последний коммит в ветке, в которую вы вошли. Вы хотите, чтобыgit reset --hard
родительский коммит на ветви, в которую вы слились.git reset --hard <commit_sha>
Предполагая, что ваш местный мастер не опередил источника / мастера, вы должны быть в состоянии сделать
Тогда ваше местное
master
отделение должно выглядеть идентичноorigin/master
.источник
См. Главу 4 в книге Git и оригинальный пост Линуса Торвальдса .
Чтобы отменить слияние, которое уже было передано :
Обязательно отмените возврат, если вы снова делаете ветку, как сказал Линус.
источник
git revert -m 1 <commit>
. Проблема состоит в том, что выполнение этого не стирает случайное слияние, которое он сделал (и еще не выдвинул). Другие ответы, включающие полную перезагрузку, лучше подходят для оригинальной проблемы с постером.Странно, что пропала самая простая команда. Большинство ответов работают, но отмена слияния, которое вы только что сделали, это простой и безопасный способ :
Ссылка
ORIG_HEAD
будет указывать на исходную фиксацию до слияния.(
--merge
Опция не имеет ничего общего со слиянием. Она такая жеgit reset --hard ORIG_HEAD
, но безопаснее, поскольку не затрагивает незавершенные изменения.)источник
git reset --merge ORIG_HEAD
тех пор вы загрязнили свое рабочее дерево, сохраните эти изменения.git reset --hard HEAD~5
сбрасывает только HEAD (может удалить коммиты как в master, так и в branch1). Только--merge
опция удаляетmerge
.--merge
Опция на самом деле не удаляет слияние, вы можете использовать--hard
его также будет хорошо работать. Ключом здесь является ссылка ORIG_HEAD, она устанавливается перед тем, как выполнить слияние с тем местом, где вы стоите в этой точке. :)git reset --hard ORIG_HEAD
отлично сработала для меня - возможно, ей помог тот факт, что я не внес никаких других изменений в хранилище после того, как локальный файлgit merge
я пытался отменить. Команда просто сбрасывает состояние хранилища до того, каким оно было до слияния. Спасибо за отличный совет!В более новых версиях Git, если вы еще не совершили слияние и у вас есть конфликт слияния , вы можете просто сделать:
От
man git merge
:источник
Вы должны сбросить до предыдущего коммита. Это должно работать:
Или даже
HEAD^^
отменить этот возвратный коммит. Вы всегда можете дать полную ссылку на SHA, если не уверены, сколько шагов назад вы должны сделать.В случае, если у вас возникли проблемы и в вашей основной ветке не было локальных изменений, вы можете выполнить сброс на
origin/master
.источник
ORIG_HEAD
для вас, почему бы не использовать его?В последнее время я использую,
git reflog
чтобы помочь с этим. В основном это работает только в том случае, если произошло слияние, и оно было на вашей машине.git reflog
может вернуть что-то вроде:Первая строка указывает, что произошло слияние. 2-я строка - время до моего слияния. Я просто
git reset --hard 43b6032
заставляю эту ветку отслеживать до слияния и переносить.источник
reflog
чтобы получить SHA и передать это в работуgit reset
.С современным Git вы можете:
Старый синтаксис:
Старая школа:
Но на самом деле, стоит заметить, что
git merge --abort
это эквивалентно только тому,git reset --merge
чтоMERGE_HEAD
присутствует. Это можно прочитать в справке Git для команды слияния.После неудачного слияния, когда его нет
MERGE_HEAD
, неудачное слияние может быть отмененоgit reset --merge
, но не обязательноgit merge --abort
, так что они не только имеют старый и новый синтаксис для одной и той же вещи .Лично я нахожу
git reset --merge
гораздо более мощным и полезным в повседневной работе, поэтому я всегда использую это.источник
Хорошо, ответы, которые мне дали другие люди, были близки, но это не сработало. Вот что я сделал.
Делая это...
... дал мне следующий статус.
Затем мне пришлось вводить одну и ту же
git reset
команду еще несколько раз. Каждый раз, когда я это делал, сообщение менялось на единицу, как вы можете видеть ниже.В этот момент я увидел, что сообщение о статусе изменилось, поэтому я попытался сделать
git pull
, и это, похоже, сработало:Короче говоря, мои команды сводятся к следующему:
источник
HEAD^^^^
origin/master
;)Вы можете использовать,
git reflog
чтобы найти предыдущий заказ. Иногда это хорошее состояние, в которое вы хотите вернуться.В частности,
источник
Если вы находитесь в процессе слияния, вы всегда можете прервать его
git merge --abort
источник
Я смог решить эту проблему с помощью одной команды, которая не включает поиск идентификатора коммита.
Принятый ответ не работал для меня, но эта команда достигла результатов, которые я искал.
источник
Если вы еще не совершили это, вы можете использовать только
Это отменит слияние (и все, что вы сделали).
источник
Добрался до этого вопроса также, пытаясь вернуться к исходному совпадению (т. Е. NO фиксирует перед началом координат). Исследуя далее, обнаружил, что есть
reset
команда именно для этого:git reset --hard @{u}
Примечание:
@{u}
это сокращение отorigin/master
. (И, конечно, вам нужен этот удаленный репозиторий, чтобы это работало.)источник
Вы должны изменить свою ГОЛОВУ, Не свою конечно, но мерзавца ГОЛОВУ ....
Поэтому, прежде чем ответить, давайте добавим некоторую предысторию, объясняющую, что это такое
HEAD
.First of all what is HEAD?
HEAD
это просто ссылка на текущий коммит (последний) в текущей ветке.Там может быть только один
HEAD
в любой момент времени. (без учетаgit worktree
)Содержимое
HEAD
хранится внутри.git/HEAD
и содержит 40 байтов SHA-1 текущего коммита.detached HEAD
Если вы не используете последний коммит, то
HEAD
есть он указывает на предыдущий коммит в историиdetached HEAD
.В командной строке это будет выглядеть так - SHA-1 вместо имени ветви, так как
HEAD
не указывает на конец текущей ветвиНесколько вариантов того, как восстановить систему с отключенной HEAD:
git checkout
Это извлечет новую ветку, указывающую на желаемый коммит.
Эта команда вернется к данному коммиту.
На этом этапе вы можете создать ветку и начать работать с этого момента.
git reflog
Вы всегда можете использовать
reflog
также.git reflog
будет отображаться любое изменение, которое обновило,HEAD
и проверка желаемой записи reflog установитHEAD
вернет этот коммит.Каждый раз, когда ГОЛОВКА изменяется, в
reflog
Это вернет вас к желаемой фиксации
git reset --hard <commit_id>
«Переместите» ГОЛОВУ назад к желаемому коммиту.
вы также можете использовать
git rebase --no-autostash
.git revert <sha-1>
"Отменить" данный диапазон фиксации или фиксации.
Команда сброса «отменит» любые изменения, сделанные в данном коммите.
Новый коммит с патчем отмены будет зафиксирован, в то время как оригинальный коммит останется в истории.
Эта схема иллюстрирует, какая команда что делает.
Как вы можете видеть там,
reset && checkout
изменитеHEAD
.источник
Самый простой ответ - тот, который дал Одино - Велмонт
Сначала сделай
git reset --merge ORIG_HEAD
Для тех, кто хочет выполнить сброс после отправки изменений, сделайте это (потому что это первый пост, увиденный для всех вопросов по git reset слиянию)
git push origin HEAD --force
Это будет сброшено таким образом, что вы не получите обратно объединенные изменения после вытягивания.
источник
Просто чтобы посмотреть на дополнительную опцию, я в основном следовал описанной здесь модели ветвления: http://nvie.com/posts/a-successful-git-branching-model/ и поэтому объединялся с
--no-ff
(нет перемотка вперед) обычно.Я только что прочитал эту страницу, так как я случайно слил ветку тестирования вместо своей ветки релиза с мастером для развертывания (сайт, мастер - это то, что работает). Ветвь тестирования объединена с двумя другими ветвями и насчитывает около шести коммитов.
Итак, чтобы отменить весь коммит, мне просто нужен был один,
git reset --hard HEAD^
и он полностью отменил слияние. Так как слияния не были быстро переданы, слияние было блоком, и один шаг назад - «ветвь не слитая».источник
Вы можете использовать только две команды, чтобы отменить слияние или перезапустить с помощью определенного коммита:
git reset --hard commitHash
(вы должны использовать коммит, который хотите перезапустить, например, 44a587491e32eafa1638aca7738)git push origin HEAD --force
(Отправка новой локальной ветки master в origin / master)Удачи и вперед!
источник
Это можно сделать несколькими способами.
1) Прервать слияние
Если вы находитесь в промежутке между неудачным слиянием (ошибочно сделанным с неправильной ветвью) и хотите избежать слияния, чтобы вернуться к последней ветке, как показано ниже:
2) Сбросить ГОЛОВУ в удаленную ветку
Если вы работаете из удаленной ветки разработки, вы можете сбросить HEAD до последнего коммита в удаленной ветке, как показано ниже:
3) Удалить текущую ветку и снова оформить заказ из удаленного хранилища.
Учитывая, что вы работаете над веткой разработки в локальном репо, которая синхронизируется с удаленной веткой / веткой разработки, вы можете сделать следующее:
источник
Если ваше слияние и соответствующие коммиты еще не были перенесены, вы всегда можете переключиться на другую ветку, удалить оригинальную и заново создать ее.
Например, я случайно слил разрабатываемую ветку в master и хотел отменить это. Используя следующие шаги:
Вуаля! Мастер находится на той же стадии, что и источник, и ваше неправильно объединенное состояние стирается.
источник
Если вам нужно решение для командной строки, я предлагаю просто ответить на вопрос MBO.
Если вы новичок, вам может понравиться графический подход:
gitk
(из командной строки или щелкните правой кнопкой мыши в браузере файлов, если он у вас есть)источник
Стратегия: создать новую ветку, где все было хорошо.
Обоснование: отменить слияние сложно. Существует слишком много решений, в зависимости от многих факторов, таких как то, совершили ли вы слияние или выдвинули его или были ли новые коммиты с момента вашего слияния. Кроме того, вам все еще нужно иметь относительно глубокое понимание git, чтобы адаптировать эти решения к вашему случаю. Если вы слепо следуете некоторым инструкциям, вы можете получить «пустое слияние», при котором ничто не будет объединено, и дальнейшие попытки слияния заставят Git сказать вам «Уже в курсе».
Решение:
Допустим, вы хотите слиться
dev
сfeature-1
.Найдите ревизию, которую вы хотите получить слияние:
Проверьте это (вернитесь во времени):
Создайте новую ветку оттуда и проверьте ее:
Теперь вы можете перезапустить слияние:
Объединение:
git merge dev
Исправьте ваши конфликты слияния.
Commit:
git commit
Когда вы будете удовлетворены результатами, удалите старую ветку:
git branch --delete feature-1
источник
Просто создайте новую ветку, а затем выберите нужные коммиты.
Это делает его более безопасным и простым после сброса, описанным во многих ответах выше.
источник
Я думаю, что вы можете указать,
git rebase -i [hash] [branch_name]
где[hash]
находится хеш-идентификатор для того места, которое вы хотите перемотать назад, плюс один (или сколько коммитов вы хотите вернуть), а затем удалить строки для коммитов в редакторе, которые вам больше не нужны. , Сохраните файл. Выход. Молиться. И это должно быть перемотано. Возможно, вам придется сделатьgit reset --hard
, но это должно быть хорошо на этом этапе. Вы также можете использовать это для извлечения определенных коммитов из стека, если вы не хотите сохранять их в своей истории, но это может оставить ваш репозиторий в состоянии, которое вы, вероятно, не хотите.источник
Если вы совершили слияние:
источник
Во-первых, убедитесь, что вы все совершили.
Затем верните ваш репозиторий в предыдущее рабочее состояние:
или используя
--hard
( это удалит все локальные, не зафиксированные изменения! ):Используйте хеш, который был там до вашего ошибочно объединенного коммита.
Проверьте, какие коммиты вы хотите повторно зафиксировать в верхней части предыдущей правильной версии:
Примените свои правые коммиты в верхней части правой версии вашего хранилища:
Используя cherry-pick (изменения, внесенные некоторыми существующими коммитами)
Или путем выбора диапазона коммитов:
Сначала проверьте правильные изменения, прежде чем объединять их:
Сначала проверьте правильные изменения, прежде чем объединять их:
где это диапазон правильных коммитов, которые вы совершили (исключая ошибочно совершенное слияние).
источник
git stash
git branch -d the_local_branch
git checkout -t <name of remote>
git stash apply
Это сработало для меня .. !!
источник
Если вы заметили , что нужно вернуться сразу после слияния , и вы не сделали ничего , после попытки слияния, вы можете просто выполнить следующую команду:
git reset --hard HEAD@{1}
.По сути, ваше слияние
sha
будет указывать наHEAD@{0}
то, что после слияния не было зафиксировано ничего другого, и поэтомуHEAD@{1}
будет предыдущим пунктом перед слиянием.источник
Самый простой из самых простых шансов, намного проще, чем все сказанное здесь:
Удалите локальную ветку (локальную, а не удаленную) и снова потяните. Таким образом, вы отмените изменения в своей основной ветке, и любое изменение будет затронуто вами, которое вы не хотите вносить. Начни это сначала.
источник
В этом случае вы захотите сбросить ветку с помощью
git reset --hard <branch_name>
. Если вы хотите сохранить изменения перед их сбросом, обязательно создайте новую ветку иgit checkout <branch_name>
.Вы также можете сбросить состояние до определенного коммита
git reset --hard <commit_id>
.Если изменения были перенесены, вы можете использовать
git revert <branch_name>
вместо этого. Обязательно узнайте, как использовать git revert и git checkout в других сценариях.источник