git rebase після попереднього злиття git


79

У мене така ситуація:

  • Я створив clone(Y) з основного сховища (X), тому що над Y працювало багато людей, ми не робили жодних, rebaseа лише merges. Коли ми хочемо доставити ( push) Y до X, ми хотіли б зробити a rebase, щоб мати речі гарні та чисті

Проблема полягає в тому, що під час виконання rebaseнас просять зробити усі злиття, які ми вже робили на попередніх mergeкроках. Чи є таке рішення, крім того, яке означає фактичне повторне об’єднання?

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


At: "Оскільки над Y працювало багато людей, ми не робили жодної перебази, а лише об'єднували", ви маєте на увазі злиття з вищим течією?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Відповіді:


80

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

Якщо ви не дбаєте про збереження історії, ви можете створити нову гілку від master, перевірити її, а потім зробити a, git read-tree -u -m devщоб оновити ваше робоче дерево відповідно до devгілки. Тоді ви можете зробити все в одному великому коміті і об'єднати це в master як зазвичай.


1
Те, що ви тут ефективно зробили, - це об’єднання. Нова гілка непотрібна.
isak gilbert

1
@isakgilbert Це те саме, якщо злитися з --squash. Регулярне злиття додасть N або N + 1 комітів для обробки, якщо на гілці було N комітів. Пропонована вище пропозиція або merge --squashзавжди додаватиме лише один коміт для master.
peterflynn

3
@ytpete, так саме. Я вважаю, що вищесказане - це просто обхідний спосіб об’єднання - сквошу від розробника до майстра. "Створення нової гілки" - це просто вказівка ​​на те саме місце, що і майстер. "Здійснювати все в один великий коміт" - це просто робити сквош.
isak gilbert

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

2
Я не міг би не погодитися з тим, що "чиста" історія переоцінена. Це не переоцінено, це економить час і робить речі менш заплутаними.
basickarl

121

git merge --squashзараз є моїм найкращим способом переоцінки після великої кількості роботи та багатьох злиттів ( див. цю відповідь ). Якщо викликана гілка, над якою ви працюєте, my-branchі ви хочете перебазувати з masterцього часу, просто виконайте наступне:

git checkout my-branch
git branch -m my-branch-old
git checkout master
git checkout -b my-branch
git merge --squash my-branch-old
git commit

13

Два зауваження:

  • Ви можете перебазувати свою власну (ще не просунуту) роботу скільки завгодно часу на поверх знову отриманих комітів.
  • Ви могли б уникнути конфліктів злиття (під час перебазування), якщо б ви активувалиgit rerere , що робиться для такого типу ситуації.
    http://git-scm.com/images/rerere2.png Дивіться більше на git rerere.

@lulian: у такому випадку, якщо вам доведеться переоцінити свою роботу, я думаю, вам доведеться робити ці рішення вирішення конфліктів знову.
VonC

@krlmlr Дякую. Я відновив посилання, додав ілюстрацію та посилання на сторінку користувача цієї команди.
VonC

8

Ви можете взяти всі зміни у своїй гілці та вкласти їх у новий коміт, masterвиконавши такі дії:

git diff master > my_branch.patch
git checkout master
patch -p1 < my_branch.patch

Потім складіть свої файли та зафіксуйте.


1

Що стосується повторного відтворення конфліктів злиття, ви можете використовувати git rerere для ведення бази даних про те, як конфлікти злиття вже вирішені, так що при виконанні перебазування, що призводить до тих самих конфліктів, трудомісткі частини будуть зроблені для вас автоматично.

https://hackernoon.com/fix-conflicts-only-once-with-git-rerere-7d116b2cec67

git config --global rerere.enabled true

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

Більш офіційна документація тут: https://git-scm.com/docs/git-rerere

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