Как вернуть фиксацию слияния, которая уже отправлена в удаленную ветвь?



git revert <commit_hash> в одиночку не получится. -m должно быть указано, и я довольно смущен этим.



кто-нибудь испытывал это раньше?

549   9  
git

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.

  1. оформить заказ удаленной ветки в локальном репозитории.
    git checkout development
  2. скопируйте хэш фиксации (т. е. идентификатор фиксации непосредственно перед неправильной фиксацией) из журнала git git log -n5

    выход:

    совершить 7cd42475d6f95f5896b6f02e902efab0b70e8038 "филиал объединения 'неправильная фиксации в "развитие"
    commit f9a734f8f44b0b37ccea769b9a2fd774c0f0c012 "this is a wrong commit"
    совершать 3779ab50e72908da92d2cfcd72256d7a09f446ba "это правильная фиксация"

  3. сбросьте ветку на хэш фиксации, скопированный на предыдущем шаге
    git reset <commit-hash> (i.e. 3779ab50e72908da92d2cfcd72256d7a09f446ba)

  4. запустить git status показать все изменения, которые были частью неверной фиксации.
  5. просто запустить git reset --hard чтобы вернуть все те изменения.
  6. force-нажмите вашу локальную ветвь к удаленному и обратите внимание, что ваша история фиксации чиста, как это было до того, как она была загрязнена.
    git push -f origin development
git revert -m 1 <merge-commit>

иногда самый эффективный способ отката-это отступить и заменить.

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.

  1. Checkout master.
  2. создайте полный двоичный обратный патч между мастером и вашей резервной копией. git diff --binary master..master_bk_01012017 > ~/myrevert.patch
  3. проверить заплатка git apply --check myrevert.patch
  4. применить патч с выхода git am --signoff < myrevert.patch
  5. Если вам нужно будет снова ввести этот код, как только он будет исправлен, вам нужно будет разветвить возвращенный Мастер и проверить ветку fix git branch mycodebranch_fix git checkout mycodebranch_fix
  6. здесь вам нужно найти ключ SHA для revert и вернуть revert git revert [SHA]
  7. теперь вы можете использовать свой mycodebranch_fix для устранения проблем, фиксации и повторного слияния в master после завершения.

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

после того, как вы сделали часть жесткого сброса, вы можете затем принудительно нажать на удаленную ветку, т. е. git push -f <remote-name> <remote-branch-name>, где <remote-name> часто называют origin. С этого момента вы можете повторно объединить, если хотите.

Comments

    Ничего не найдено.