Git слияния уплощения

Если я работаю в нескольких ветках над одной функцией, я использую git pull branch1 branch2 branch3 вытащить все изменения в мою основную ветку. Однако все журналы фиксации каждой ветви также копируются. Как свести журнал фиксации к одному сообщению?

3 ответа

Решение

Вы можете использовать интерактивную перебазировку и "сдавить" коммиты - см. Также Git Ready Tutorial по сквошу через перебазирование. Извините, что просто добавил ссылку на вас, но это довольно подробное руководство. О, и это также хорошо раздавит ваши слияния.

"git merge --squash" (после "git fetch"; "git pull" это просто "выборка + слияние", возможно, он также позволяет использовать параметр --squash).

Из git-merge (1):

--сквош

Создайте рабочее дерево и состояние индекса, как если бы произошло реальное слияние, но на самом деле не выполняйте коммит, не перемещайте ГОЛОВУ и не записывайте $GIT_DIR/MERGE_HEAD чтобы следующая команда git commit создала коммит слияния. Это позволяет вам создать один коммит поверх текущей ветви, эффект которого такой же, как и слияние другой ветви (или более в случае осьминога).

Как Брайан Уайт прокомментировал проблему с git merge --squash заключается в том, что она не дает вам видимой ссылки, и, следовательно, не позволяет проследить обратно к ветви (или отдельным изменениям), с которой вы слились.

Видимо (при просмотре в виде графика git log --graph), важная ветвь, которая была объединена обратно, выглядит ничем не отличающейся от экспериментальной ветки, с которой вы облажались и с радостью отбросили бы. Оба просто висят там, не связанные ни с чем. Я лично хочу знать, что определенная ветвь была объединена, поэтому я знаю, что работа сделана.

Решение, которое работает для меня, заключается в использовании слияния с опцией no-fastforward.

git merge --no-ff somebranch -m "my commit message"

Это вынуждает git создавать единый коммит со всеми включенными изменениями веток, вы можете установить сообщение коммита самостоятельно (если хотите), но самое главное, он связывает новый коммит с веткой, в которую он только что слился. Это наглядно показывает, что работа на этой ветви завершена, но также позволяет вам проследить, чтобы увидеть детали отдельных коммитов из объединенной ветви.

Вот пример, где очень простые ветви с одним и двумя коммитами соответственно были объединены обратно в master. Впоследствии я удалил теги ветвлений на слитых ветвях, однако имя ветки все еще можно увидеть в сообщении фиксации слияния. Имя ветви должно обобщать изменения, и если вы хотите узнать точные содержащиеся в них изменения, вы можете проследить его до отдельных коммитов. Этот подход хорошо работает для простых проектов.

Примечание: мне пришлось вручную нарисовать один из разъемов, так как он был таким синим, что его было едва видно.

вывод журнала git

Другие вопросы по тегам