Відповіді:
І те, git merge --squash
і git rebase --interactive
інше може призвести до "розбитого" вчинення.
Але вони служать різним цілям.
створить розрізаний комірок на гілці призначення, не відзначаючи жодних зв'язків.
(Примітка: вона не створює зобов'язання відразу: вам потрібна додаткова git commit -m "squash branch"
)
Це корисно, якщо ви хочете повністю викинути гілку джерела, виходячи з (схема, взята з питання SO ):
git checkout stable
X stable
/
a---b---c---d---e---f---g tmp
до:
git merge --squash tmp
git commit -m "squash tmp"
X-------------------G stable
/
a---b---c---d---e---f---g tmp
а потім видалення tmp
гілки.
Примітка: git merge
є --commit
опція , але її не можна використовувати --squash
. Використовувати і разом це ніколи не вдалося .
Оскільки Git 2.22.1 (Q3 2019), ця несумісність стає явною:--commit
--squash
Див. Комісію 1d14d0c (24 травня 2019 року) від Vishal Verma ( reloadbrain
) .
(Об’єднав Хуніо С Хамано - gitster
- у комітеті 33f2790 , 25 липня 2019 року)
merge
: відмовитись--commit
с--squash
Раніше, коли
--squash
постачався, 'option_commit
' мовчки скидався. Це могло б здивувати користувача, який намагався відміняти поведінку сквошу, що не вчиняє,--commit
чітко використовуючи .
git/git
builtin/merge.c#cmd_merge()
тепер включає:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
відтворює деякі чи всі ваші зобов’язання на новій базі, дозволяючи вам робити сквош (або останнім часом «виправити», див. це питання ТА ), переходячи безпосередньо до:
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
Якщо ви вирішите скосити всі комісії tmp
(але, всупереч merge --squash
, ви можете відтворити одні, а інші - накрутити).
Тож відмінності такі:
squash
не торкається вашої вихідної гілки ( tmp
тут) і створює одиночну комісію там, де ви хочете.rebase
дозволяє продовжувати роботу над тією ж гілкою джерела (досі tmp
) з:
tmp
коміти, складені разом.
G
не будуть представляти однаковий вміст, ніж g
через зміни, внесені користувачем X
.
git merge --no-ff temp
замість цього git merge --squash temp
, ви отримуєте історію месіє, але ви також можете робити такі речі, як git revert e
набагато простіше. Це безладна, але чесна і прагматична історія, і головна гілка все ще залишається досить чистою.
git bisect
або git blame
використовувати занадто часто (як у git pull --no-ff
: stackoverflow.com/questions/12798767/… ). Існує не один підхід в будь-якому випадку, тому в цій статті описані три ( stackoverflow.com/questions/9107861 / ... )
Об'єднати коміти: зберігає всі коміти у вашій філії та перемежовує їх з комітами на базовій гілці
Merge Squash: зберігає зміни, але опускає окремі зобов’язання з історії
Rebase: Це переміщення всієї гілки функцій починається на кінчику гілки master, ефективно включаючи всі нові комісії в master
Детальніше тут
Об’єднати сквош об’єднує дерево (послідовність комітів) в один коміт. Тобто, вона розбиває всі зміни, внесені в n комітетів, в один комітет.
Rebasing - це повторне базування, тобто вибір нової бази (батьківської комісії) для дерева. Можливо, термін "меркурій" для цього є більш зрозумілим: вони називають це трансплантацією, тому що це просто так: вибір нового ґрунту (батьківська фіксація, корінь) для дерева.
Виконуючи інтерактивну базу даних, вам надається можливість скріншувати, вибирати, редагувати або пропускати комісії, які ви збираєтесь відновити.
Сподіваюся, що це було зрозуміло!
Почнемо з наступного прикладу:
Тепер у нас є 3 варіанти об'єднання змін гілки функцій у головну гілку :
Об’єднання об'єднань Збереже
всі історії комісій гілки функцій та перемістить їх у головну гілку
.
Повторне об'єднання та об'єднання Приєднає
всі історії комісій гілки функції в передній частині головної гілки
НЕ додасть додаткових фіктивних комітів.
Сквош і злиття
Згрупуйте всі функції філій, що здійснюють фільтр, в один комітет, а потім додайте його в передній частині головної гілки
.
Нижче ви можете дізнатися, як буде доглядати головна гілка за кожною з них.
У всіх випадках:
Ми можемо безпечно ВИДАЛИТИ галузь функцій .
G
цеc--d--e--f--g
стисло разом?