Возврат коммитов слияния может быть сложным - особенно если это были злые слияния, как это звучит. Если вам это сойдет с рук, проще просто сдуть их. Там есть два больших варианта:
git reset --hard <good-commit>
. Это потребует некоторой координации, так как любым другим разработчикам, которые извлекли плохую ветку, также потребуется reset --hard
(и если они выполнили работу после вытягивания, они должны быть осторожны, чтобы сохранить это и так далее). Если ваш коллега пытался сделать что-то хорошее, вы могли бы переделать его слияния, но на этот раз сделайте это правильно!
Вручную вернитесь к до слияния. С верхнего уровня, git checkout <good-commit> .
, затем git commit
- обязательно напишите хорошее сообщение с описанием того, что вы только что сделали. Вы делаете обязательство, которое восстанавливает все в этом хорошем состоянии, но сохраняет всю историю с тех пор, чтобы люди могли надеяться, что они будут чистыми. Если вы сделаете это, обратите внимание, что в том, что касается Git, вы все равно слились с тем, что слил ваш коллега. Если некоторые из этих слитых коммитов были действительно хорошей работой, и вы все равно хотите их включить, вероятно, проще всего было бы выбрать их поверх своего ручного возврата.
Наконец, если оба они неудовлетворительны - если вы не хотите сдуть историю, но вы также хотите реинтегрировать часть того, что ваш коллега пытался объединить, но не путем сбора вишни ... вы можете пойти для комбинации двух. Идея состоит в том, чтобы сделать этот ручной возврат коммитом поверх мастера, но сделать это до состояния, в котором слияния должны были привести вместо состояния прямо перед слияниями.
# create a new branch, starting from the good commit
git checkout -b temp <good-commit>
# redo the merges, but do it right
# make sure your work tree is how you want it after the merge(s)
git merge ...
# switch back to master
git checkout master
# get your work tree into the good state
git checkout temp .
# and commit that
git commit