GIT merge --no-ff
В этом посте я попытаюсь объяснить, как git merge --no-ff может помочь нам. Я прочитал здесь http://nvie.com/posts/a-successful-git-branching-model/ (который я лично считаю действительно хорошим постом), в котором git merge --no-ff: "Это позволяет избежать потери информации об историческом существовании ветви элемента и группирует все коммиты, которые вместе добавили функцию ". Поэтому я нашел это действительно полезным и проведу несколько экспериментов.
Проблема в том, как мы можем узнать из данных журнала git, какие коммиты принадлежат каждой функции. Для этого я сделал следующий эксперимент. Предположим, два пользователя разрабатывают в программном проекте две разные и независимые функции (чтобы избежать конфликтов слияния). С последней стабильной версии мы продолжим так:
git init
touch AAA.txt
git add AAA.txt
git commit -m "My stable software version"
//this will simulate our project repository
Таким образом, с этого момента два пользователя (имя Алиса и Боб) создают две разные ветви и начинают работать над функциями:
git branch feature1_Alice
git branch feature2_Bob
И теперь Алиса и Боб начинают работать и взаимодействовать одновременно. Мы могли бы смоделировать его как:
git checkout feature1_Alice
touch f1_A1.txt
git add f1_A2.txt
git commit -m "Solving little bug on feature 1"
Боб делает два коммита после временной шкалы после того, как Алиса сделает это:
git checkout feature2_Bob
touch f2_B1.txt
git add f2_B1.txt
git commit -m "Starting feature 2"
touch f2_B2.txt
git add f2_B2.txt
git commit -m "feature 2: implementing new functionality"
Затем Алиса заканчивает особенность:
git checkout feature1_Alice
touch f2_A3.txt
git add f2_A3.txt
git commit -m "Feature 1 finished"
Затем Боб заканчивает Feature2:
git checkout feature2_Bob
touch f1_A3.txt
git add f1_A3.txt
git commit -m "Feature 2 finished"
Теперь мы объединяем новую функцию с основной веткой:
git checkout master
git log
Выход:
commit c58dd35054f83c089292d090781438f37feeffa3
Автор: Хуан
Дата: вторник, 25 апреля 10:30:01 2017 +0200
My stable software version
git merge --no-ff feature1_Alice
//We put a message on the created commit
Теперь выводим git log:
commit 50c5d1570fe0c047f72200bd57ef6cef6fa9077e Слияние: c58dd35 c136a23 Автор: juan Дата: вт 25 апр. 10:48:12 2017 +0200
Merging feature 1 to main
Merge branch 'feature1_Alice'
commit c136a23c49c546e5f48d9d0634e9bc51d67370cd Автор: juan Дата: Вторник, 25 апреля 10:41:49 2017 +0200
Feature 1 finished
commit c9dbb1b49444555fca528f562d3a38143fd521e9 Автор: juan Дата: Вторник, 25 апреля 10:35:24 2017 +0200
Solving little buf on feature 1
commit 58afad2b46565e614a99d94d1e1aa1c8520f9f2b Автор: juan Дата: вт 25 апр. 10:35:01 2017 +0200
Starting feature 1
commit c58dd35054f83c089292d090781438f37feeffa3 Автор: juan Дата: Вт 25 апр. 10:30:01 2017 +0200
My stable software version
И, наконец, объединить функцию 2:
git merge --no-ff feature2_Bob
git log
commit 3f27f78fefb30080ace629e561a242a4f8dbca56 Слияние: 50c5d15 2eee0c1 Автор: juan Дата: вт 25 апр. 10:54:20 2017 +0200
Merging feature 2 to master
Merge branch 'feature2_Bob'
commit 50c5d1570fe0c047f72200bd57ef6cef6fa9077e Слияние: c58dd35 c136a23 Автор: juan Дата: вт 25 апр. 10:48:12 2017 +0200
Merging feature 1 to main
Merge branch 'feature1_Alice'
commit 2eee0c1bb732443ae7d6f4893d651abfd558d55a Автор: juan Дата: Вторник, 25 апреля 10:43:14 2017 +0200
Feature 2 finished
commit c136a23c49c546e5f48d9d0634e9bc51d67370cd Автор: juan Дата: Вторник, 25 апреля 10:41:49 2017 +0200
Feature 1 finished
commit cd3bee2906e02df22866ba710891d21eaebb8013 Автор: juan Дата: вт 25 апр. 10:40:12 2017 +0200
feature 2: implementing new functionality
commit c6fdf092b2645f7d4088f9f439e820a9a820b891 Автор: juan Дата: вт 25 апр. 10:37:39 2017 +0200
Starting feature 2
commit c9dbb1b49444555fca528f562d3a38143fd521e9 Автор: juan Дата: Вторник, 25 апреля 10:35:24 2017 +0200
Solving little buf on feature 1
commit 58afad2b46565e614a99d94d1e1aa1c8520f9f2b Автор: juan Дата: вт 25 апр. 10:35:01 2017 +0200
Starting feature 1
commit c58dd35054f83c089292d090781438f37feeffa3 Автор: juan Дата: Вт 25 апр. 10:30:01 2017 +0200
My stable software version
Может ли кто-нибудь сказать, как я могу видеть из истории коммитов и коммит слияния, которые фиксируют влияние на каждую функцию? Я не вижу преимущества, прокомментированного в этой сети, когда мы вставляем альтернативные коммиты из разных функций (или из функции и мастера) во времени.
Единственное отличие в использовании --no-ff состоит в том, что коммит слияния имеет информацию о том, какие коммиты были слиты, но это бесполезно для отслеживания истории коммитов.
Заранее спасибо.
1 ответ
Вы можете взглянуть на свой график хранилища с git log --graph --oneline --decorate --all
или просто позвоните gitk
визуализировать вашу историю. Линейная текстовая версия, представленная простым git log
не будет отображать информацию, которую вы ищете.
При взгляде на представление графа коммиты слияния гарантируют, что вы видите, где встречаются две ветви, в то время как быстрое слияние приведет к тому, что разные ветви будут показаны как линейные, хотя они были разработаны параллельно.