Git швидко вперед VS немає швидкого злиття вперед


247

Злиття Git дозволяє нам здійснювати швидке перемотування вперед, а не швидке швидке з’єднання гілок вперед. Будь-які ідеї, коли використовувати швидке злиття вперед і коли не використовувати швидке злиття вперед?


12
Чи допоможе stackoverflow.com/questions/2850369/… ?
VonC

2
Я думаю, що ще одну справді хорошу перспективу можна знайти тут endoflineblog.com/gitflow-considered-harmful
Дмитро

Відповіді:


290

Цей --no-ffваріант корисний, коли ви хочете мати чітке уявлення про вашу галузь функцій. Тож навіть якщо тим часом жодних комісій не було зроблено, FF можливий - ви все одно хочете, щоб іноді кожен комітет у магістралі відповідав одній функції. Таким чином, ви розглядаєте гілку функцій з купою комітетів як єдину одиницю та об'єднуєте їх як єдину одиницю. З історії видно, коли ви виконуєте об'єднання гілок --no-ff.

Якщо вам не байдуже таке - ви, ймовірно, можете піти з FF, коли це можливо. Таким чином, у вас з'явиться більше svn-подібного відчуття робочого процесу.

Наприклад, автор цієї статті вважає, що цей --no-ffваріант повинен бути типовим, і його міркування близькі до того, що я окреслив вище:

Розглянемо ситуацію, коли серія другорядних фільмів на гілці "особливість" колективно складає одну нову функцію: Якщо ви просто робите "git merge feature_branch" без --no-ff", з історії Git неможливо побачити, хто з об'єктів комітету має разом реалізована функція - вам доведеться вручну читати всі повідомлення журналу. Повернення цілої функції (тобто групи комітетів) - це справжній головний біль [якщо --no-ffвона не використовується], тоді як це легко зробити, якщо --no-ffпрапор був використаний [тому що це лише одна фіксація] ".

Графіка, що показує, як --no-ff групує всі об'єкти з філії функції в один комітет на головній гілці


3
І швидкі перемоги чудово підходять, коли у вас є колекція тісно пов’язаних гілок, які час від часу ви хочете просто рухатися разом. Не всі злиття є подіями реальної історії.
Каскабель

3
Навіщо підтримувати кілька гілок тоді? Якщо вони близькі - чому б не зробити все на одній гілці?
Іван Данилов

11
Тісно пов'язані не означає тотожне. Крім того, робочий процес не завжди є охайним. Ви не завжди приймаєте зобов’язання, на які думаєте, що збираєтесь, не завжди відхиляєтесь від найкращого місця. Можливо, ви запускаєте пару функцій з одного місця, починаєте працювати над одним із них, розумієте, що це загальне, і перемотайте інший до нього, перш ніж розходитись.
Каскабель

2
Що стосується першої відповіді, я розумію, що ОП хоче знати найкращі практики, яких слід дотримуватися. Щось відбувається, і не все ідеально, але це схоже на якийсь примусовий компроміс.
Іван Данилов

1
Варто зауважити, що переваги --no-ffвашої історії зобов’язань можуть бути не очевидні відразу при використанні основних інструментів, як-от git log, які надалі відображатимуть усі комітети з усіх гілок, об'єднаних у вашу поточну гілку. Однак, переваги стають зрозумілішими при використанні, наприклад, git log --first-parentу галузі інтеграції, наприклад, developабо master. Якщо ви релігійно використовуєте, --no-ffто він буде відображати виключно запити на об'єднання, при git logцьому все одно надаватимете (більш) вичерпну історію. Ось чому Вінсент рекомендує його для використання з GitFlow .
Джеремі Кейні

12

Я можу навести приклад, часто зустрічається в проекті.

Тут варіант --no-ff(тобто справжнє злиття ) створює нову команду з декількома батьками та забезпечує кращу відстеження історії. В іншому випадку --ff(тобто швидке злиття вперед ) за замовчуванням.

$ git checkout master
$ git checkout -b newFeature
$ ...
$ git commit -m 'work from day 1'
$ ...
$ git commit -m 'work from day 2'
$ ...
$ git commit -m 'finish the feature'
$ git checkout master
$ git merge --no-ff newFeature -m 'add new feature'
$ git log
// something like below
commit 'add new feature'         // => commit created at merge with proper message
commit 'finish the feature'
commit 'work from day 2'
commit 'work from day 1'
$ gitk                           // => see details with graph

$ git checkout -b anotherFeature        // => create a new branch (*)
$ ...
$ git commit -m 'work from day 3'
$ ...
$ git commit -m 'work from day 4'
$ ...
$ git commit -m 'finish another feature'
$ git checkout master
$ git merge anotherFeature       // --ff is by default, message will be ignored
$ git log
// something like below
commit 'work from day 4'
commit 'work from day 3'
commit 'add new feature'
commit 'finish the feature'
commit ...
$ gitk                           // => see details with graph

(*) Зауважте, що тут, якщо newFeatureгілка буде повторно використана, замість створення нової гілки, git доведеться все-таки зробити --no-ffоб'єднання. Це означає, що швидке злиття вперед не завжди підходить.


6

Коли ми працюємо над середовищем розробки та об'єднуємо наш код у галузь постановки / виробництва, тоді Git no fast forward може бути кращим варіантом. Зазвичай, коли ми працюємо в галузі розробки для однієї функції, ми, як правило, маємо декілька комітів. Відстеження змін за допомогою декількох комісій згодом може бути незручним. Якщо ми з’єднаємось з постановочною / виробничою галуззю, використовуючи Git no fast forward, то у неї буде лише 1 комісія. Тепер у будь-який час, коли ми хочемо відновити функцію, просто відновіть цю команду. Життя легке.


0

Можливо також, що ви можете мати персоналізовані гілки функцій, де код просто розміщується в кінці дня. Це дозволяє відстежувати розвиток більш детально.

Я не хотів би забруднювати розробку майстра неробочим кодом, таким чином роблячи - no-ff може бути саме тим, що потрібно шукати.

Як зауваження, можливо, не потрібно вводити робочий код на персоналізовану гілку, оскільки історію можна переписати git rebase -iта примусити на сервері, доки ніхто інший не працює над цією ж гілкою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.