Як перевірити злиття без фактичного злиття спочатку


166

Чи є якийсь спосіб моделювання а git merge між двома гілками, поточною робочою гілкою та головним, але не вносячи жодних змін?

У мене часто виникають конфлікти, коли мені доводиться складати git merge. Чи є спочатку змоделювання злиття?



Відповіді:


132

Я не думаю, що існує спосіб імітувати те, що буде, поки ви не спробуєте об'єднатись. Однак якщо ви переконайтеся, що вихідний git statusфайл порожній перед тим, як зробити злиття, цілком безпечно просто продовжити і спробувати його. Якщо у вас виникли конфлікти, ви можете негайно повернутися до стану, в якому ви були раніше:

git reset --merge

Оскільки git 1.7.4, ви також можете скасувати злиття, виконавши:

git merge --abort

(Як пояснюється повідомлення про фіксацію, яке додало цю опцію , це було додано для відповідності git rebase --abortтощо).


4
@ Amber відповідь відповідає саме те, що запитується "як імітувати злиття". використовувати --no-commitнабагато простіше на мою думку
samirahmed

14
@samirahmed: @ Amber відповів на питання більш буквально, звичайно, хоча --no-commitти все ще змінюєш індекс та робоче дерево, що не зовсім "без жодних змін" :) Думаю, що коли люди задають подібний вид питання, це взагалі тому, що вони не усвідомлюють, що найкращий спосіб зрозуміти, як відбудеться злиття, - це просто спробувати злиття , часто тому, що вони не усвідомлюють, наскільки легко повернутися до стану, в якому вони були раніше якщо виникли проблеми.
Марк Лонгейр

2
Я не знаю, чи це було додано в більш новій версії git, але в документах (1.8.4) він зазначає, що " git merge --abortеквівалентно тому, git reset --mergeколи MERGE_HEADвін присутній", тому все, що простіше запам’ятати :)
Samuel Meacham

@SamuelMeacham: спасибі за те, що наголосив, що було введено в 1.7.4. Я оновив відповідь на це. Дякую!
Марк Лонгейр

Ця пропозиція не зробила нічого для мене, на git 1.9.4.
djangofan

137

Можна використовувати git merge --no-commit для запобігання злиття насправді, а якщо вам не подобається, як відбувається злиття, просто поверніть його до початкового заголовка.

Якщо ви точно не хочете завершити злиття, навіть якщо це швидке перемотування вперед (і, таким чином, не має конфліктів, за визначенням), ви можете також додати --no-ff.


Я не думаю, що це git merge --abortіснує - можливо, ти маєш на увазі git reset --merge?
Марк Лонгейр

Ні, я просто забув , що в відміну rebaseнемає --abortдля git merge.
Бурштин

7
Я б і накинувся --no-ff. Щоб запобігти появі злиття ff.
Енді

1
@ Енді --no-ffтут дуже обов'язковий, оскільки --no-commitне зупиняє швидких змін.
jackr

1
@Anant Anand Gupta - це хороший трюк, але він повинен бути: git config --global alias.tm "merge --no-commit --no-ff"
pasx

109

Якщо я хочу порівнювати зміни в тематичній галузі з основним, я вважаю найпростішим і найбезпечнішим зробити наступне:

git checkout master
git checkout -b trial_merge
git merge topic_branch

Після завершення злиття легко помітити консолідовану зміну від головного

git diff master

Закінчивши, просто видаліть гілку trial_merge

git checkout master
git branch -D trial_merge

Таким чином, головна гілка ніколи не змінюється.


4
Ви також можете робити git checkout --detachі протестувати все, що завгодно. Пізніше, якщо ви хочете зберегти свої зміни, зробіть це git checkout -b new_branch. І якщо ви хочете відмовитись від змін, перевірте будь-яку галузь, яку ви хочете ( git checkout master).
Shayan Toqraee

Якщо topic_branchвін величезний (як це, мабуть, у випадку, якщо ви в першу чергу ставитеся до цього питання), diff masterрезультат, мабуть, занадто великий для вас, щоб звести яблуко, якщо злиття спричинить конфлікти.
Півмісяць Свіжий

Мені, безумовно, це дуже подобається ... безпечно і просто.
лео

4

Я використовую :

git merge --ff-only

згідно документації :

Відмовтеся від злиття та виходу з ненульовим статусом, якщо поточна HEAD уже оновлена ​​або злиття не може бути вирішено як швидкий вперед.

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


4

Я git merge --abortнещодавно міг користуватися . Однак це можна використовувати лише у випадку конфлікту злиття. Якщо ви впевнені, що не хочете виконувати зобов'язання, то використовуйте інші згадані вище методи.


1
Які ще методи, згадані вище? Всі вони згадують git merge --abort. Вам слід в майбутньому підтвердити свою відповідь, вказавши, хто написав відповідь, на яку ви звертаєтесь.
Майкл Фултон,

3

Чому б просто не створити гілку, що викидається (git checkout -b), і зробити тестове злиття там?


1
Що ви пропонуєте - це насправді відповідь Яна, висловлена
невідступно

0

Я точно не знаю, чи це ваш випадок , але ваше запитання запам’ятало мені, що іноді я запускаю функцію, я виконую ці дні, і я зливаю розробку на ній багато разів.

З цього моменту я втрачаю контроль над точними файлами, які я змінив, і знаю це лише тоді, коли моя функція буде закрита і мій код піде розвиватися.

У цьому випадку хороший спосіб дізнатися, які модифікації ви зробили (крім інших злиття) використовує Sourcetree.

Потрібно натиснути правою кнопкою на базовій гілці та вибрати Diff Against Current:

Особливість Sourcetree знати різницю між двома галузями

Тоді sourcetree покаже вам всі модифікації, які будуть об'єднані, якщо ви об'єднаєте свою гілку в базову гілку.

Результати

Звичайно, це не покаже вам конфліктів, але це корисний інструмент у злиттях.

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