Git Merge безумие заканчивается тем, что в течение двух дней возвращаются к работе всех разработчиков: как ее вернуть? - PullRequest
1 голос
/ 05 апреля 2011

Мой коровник сделал серию слияний (9 коммитов и 2 возврата), и, насколько я могу судить, он отменил все изменения кода за последние два рабочих дня.Я могу определить последний хороший коммит и могу git checkout его.Какова рекомендуемая практика для уничтожения слияния и возвращения в хорошее состояние - git revert на каждом из его необратимых коммитов?git reset hash --hard

1 Ответ

4 голосов
/ 05 апреля 2011

Возврат коммитов слияния может быть сложным - особенно если это были злые слияния, как это звучит. Если вам это сойдет с рук, проще просто сдуть их. Там есть два больших варианта:

  • 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...