9 ответов:
The указывает родитель. Это связано с тем, что фиксация слияния имеет более одного родителя, и Git не знает автоматически, какой родитель был основной линией, а какой родитель был ветвью, которую вы хотите отменить слияние.
при просмотре фиксации слияния в выходных данных
git log, вы увидите его родителей, перечисленных в строке, которая начинается сMerge:commit 8f937c683929b08379097828c8a04350b9b8e183 Merge: 8989ee0 7c6b236 Author: Ben James <[email protected]> Date: Wed Aug 17 22:49:41 2011 +0100 Merge branch 'gh-pages' Conflicts: READMEв данной ситуации
git revert 8f937c6 -m 1вы получите дерево, как это было в8989ee0иgit revert -m 2восстановит дерево, как это было в7c6b236.чтобы лучше понять родительские идентификаторы, вы можете запустить:
git log 8989ee0и
git log 7c6b236
вот полный пример в надежде, что это поможет кому-то:
git revert -m 1 <commit-hash> git commit -m "Reverting the last commit which messed the repo." git push -u origin masterздесь
<commit-hash>- это хэш фиксации слияния, который вы хотели бы вернуть, и как указано в объяснении ответ,-m 1указывает, что вы хотите вернуться к дереву первого родителя до слияния.The
git commit ...линия по существу фиксирует ваши изменения, а третья строка делает ваши изменения общедоступными, нажав их на пульт отделение.
Бен сказал вам, как вернуть фиксацию слияния, но это очень важно вы понимаете, что это делает " объявляет, что вы никогда не захотите, чтобы изменения дерева были внесены слиянием. В результате более поздние слияния приведут только к изменениям дерева, внесенным коммитами, которые не являются предками ранее отмененного слияния. Это может быть или не быть то, что вы хотите."(git-merge man page).
An статья / список рассылки сообщение связаны с человеком страница подробно описывает механизмы и соображения, которые участвуют. Просто убедитесь, что вы понимаете, что если вы отмените фиксацию слияния, вы не можете просто снова объединить ветку позже и ожидать, что те же изменения вернутся.
вы можете выполнить следующие действия, чтобы вернуть неверные фиксации или сбросить удаленную ветвь обратно в правильное состояние HEAD/state.
- оформить заказ удаленной ветки в локальном репозитории.
git checkout developmentскопируйте хэш фиксации (т. е. идентификатор фиксации непосредственно перед неправильной фиксацией) из журнала git
git log -n5выход:
совершить 7cd42475d6f95f5896b6f02e902efab0b70e8038 "филиал объединения 'неправильная фиксации в "развитие"
commit f9a734f8f44b0b37ccea769b9a2fd774c0f0c012 "this is a wrong commit"
совершать 3779ab50e72908da92d2cfcd72256d7a09f446ba "это правильная фиксация"сбросьте ветку на хэш фиксации, скопированный на предыдущем шаге
git reset <commit-hash> (i.e. 3779ab50e72908da92d2cfcd72256d7a09f446ba)- запустить
git statusпоказать все изменения, которые были частью неверной фиксации.- просто запустить
git reset --hardчтобы вернуть все те изменения.- force-нажмите вашу локальную ветвь к удаленному и обратите внимание, что ваша история фиксации чиста, как это было до того, как она была загрязнена.
git push -f origin development
иногда самый эффективный способ отката-это отступить и заменить.
git logиспользуйте 2-й хэш фиксации (полный хэш, тот, к которому вы хотите вернуться, до указанной ошибки), а затем ребрендинг оттуда.
git checkout -b newbranch <HASH>затем удалите старую ветвь, скопируйте новую ветвь на свое место и перезапустите оттуда.
git branch -D oldbranch git checkout -b oldbranch newbranchесли его транслировали, то удалите старую ветку из всех репозиториев, нажмите кнопку переделайте ветку до самой центральной, и потяните ее обратно вниз ко всем.
чтобы сохранить журнал чистым, поскольку ничего не произошло (с некоторыми недостатками при этом подходе (из-за push-f)):
git checkout <branch> git reset --hard <commit-hash-before-merge> git push -f origin HEAD:<remote-branch>'commit-hash-before-merge' поступает из журнала (git log) после слияния.
Я нашел создание обратного патча между двумя конечными точками know и применение этого патча будет работать. Это предполагает, что вы создали снимки (теги) с вашей главной ветви или даже резервную копию вашей главной ветви, скажем master_bk_01012017.
говорить, что филиал код вы слились в мастер mycodebranch.
- Checkout master.
- создайте полный двоичный обратный патч между мастером и вашей резервной копией.
git diff --binary master..master_bk_01012017 > ~/myrevert.patch- проверить заплатка
git apply --check myrevert.patch- применить патч с выхода
git am --signoff < myrevert.patch- Если вам нужно будет снова ввести этот код, как только он будет исправлен, вам нужно будет разветвить возвращенный Мастер и проверить ветку fix
git branch mycodebranch_fixgit checkout mycodebranch_fix- здесь вам нужно найти ключ SHA для revert и вернуть revert
git revert [SHA]- теперь вы можете использовать свой mycodebranch_fix для устранения проблем, фиксации и повторного слияния в master после завершения.
как отметил Райан,
git revertможет сделать слияние трудно вниз по дороге, так чтоgit revertможет быть не то, что вы хотите. Я обнаружил, что с помощью чтобы быть более полезным здесь.после того, как вы сделали часть жесткого сброса, вы можете затем принудительно нажать на удаленную ветку, т. е.
git push -f <remote-name> <remote-branch-name>, где<remote-name>часто называютorigin. С этого момента вы можете повторно объединить, если хотите.
Comments