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

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

вопрос задан 23.04.2009
Verhogen
9601 репутация

3 ответов


  • 70 рейтинг

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

    От git-merge (1) :

    - сквош

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

    ответ дан Jakub Narębski, с репутацией 203690, 24.04.2009
  • 24 рейтинг

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

    ответ дан Pat Notz, с репутацией 124449, 23.04.2009
  • 7 рейтинг

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

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

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

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

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

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

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

    git log output

    ответ дан samaspin, с репутацией 1153, 2.09.2015