Як я можу об’єднати багато комітів, але один залишити?


74

Припустимо, у мене є ця особливість гілки "foo". Тепер я хочу об'єднати його назад у master, але я додав деякий код налагодження, який не хочу в master.

Код налагодження знаходиться у власному коміті, тому я міг би використовувати його git cherry-pickдля кожного коміту та залишати цей коміт. Але це буде досить нудно.

Чи існує якась «зворотна вишня», яка це робить, або інтерактивне злиття?

Відповіді:


53

Використовуйте інтерактивну базу даних:

git rebase -i SHA-OF-FIRST-COMMIT-IN-BRANCH

Це відкриє щось подібне у вашому $ EDITOR:

    pick 8ac4783 folders and folders
    pick cf8b1f5 minor refactor
    pick 762b37a Lots of improvement. Folders adn shit.
    pick 3fae6e1 Be ready to tableview
    pick b174dc0 replace folder collection view w/ table view
    pick ef1b65b more finish
    pick ecc407f responder chain and whatnot
    pick 080a847 play/pause video
    pick 6719000 wip: movie fader
    pick c5f2933 presentation window fade transition

    # Rebase e6f77c8..c5f2933 onto e6f77c8
    #
    # Commands:
    #  p, pick = use commit
    #  e, edit = use commit, but stop for amending
    #  s, squash = use commit, but meld into previous commit
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    # However, if you remove everything, the rebase will be aborted.
    #

Отже, ви просто видаляєте рядок, що містить коміт налагодження, пишете файл і закриваєте свій редактор, і git скаже вам щось на зразок:

Successfully rebased and updated refs/heads/master.

Тепер ви можете просто об’єднатись у цій гілці, щоб освоїти.

ОНОВЛЕННЯ: Слід зазначити, що зміна історії з rebaseмає відбуватися лише у приватних гілках. Якщо ця гілка була відкритою для громадськості, використовуйте, git revertяк запропонував інший відповідач.


Приємно .. і чи є хороший спосіб отримати SHA-ПЕРШОГО КОМІТУВАННЯ?
Дейв Фогт,


68

Незважаючи на те , що використовувати інші СДМ в увазі, в git, git revertзворотна вишневого вибрати.


9
git revertробить запис нового коміту з видаленими відповідними змінами.
Майк Мазур,

11
@mikem: що, на мою думку, інтуїтивно означає зворотний вишневий вибір. Як revertі cherry-pickтакож є -nваріант , який не виконує фіксацію , але листя зміни в кеші / індексу / постановка області , тому команди дуже схожі.
CB Bailey

короткий і солодкий - закликає вас спробувати, думаючи: «Не можна так просто! я йому покажу! »... і тоді це просто. здається, це працює навіть для коду, який я почав збирати вишні, але потім просто здійснив його нормально (ой?), що, мабуть, має сенс, оскільки в кінцевому підсумку gitвсе стосується різниць між знімками, а не залежними подіями. я не знаю. Я продовжую дізнаватися про такі функції, як і ця, і сподіваюся, що тут буде щось схопити, але вони, здається, щоразу працюють!
underscore_d

7

Інша ідея полягає в тому, щоб додати скасований коміт з налагоджувальним кодом і об’єднати його у свою головну гілку. Потім ми видаляємо цей додатковий коміт у гілці foo.

git checkout foo
git revert COMMIT_REF_WITH_DEBUG_CODE

git checkout master
git merge foo

git checkout foo
git reset --hard HEAD~1

Переконайтеся, що ваше робоче дерево чисте. Спочатку створіть скасований коміт. Потім об’єднайте його в master. Потім скиньте покажчик гілки гілки foo до батьківського елемента поверненого коміту, щоб він повернувся у початковий стан.

Якщо вам не подобається використовувати, git resetви можете створити тимчасову гілку, де ви створите скасований коміт. В кінці ви видаляєте тимчасову гілку.


2

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

На новій гілці "foo-merge", створеній з "foo":

git rebase -i master

Після того, як ви перейдете в режим редагування комітів, видаліть з редактора рядки, що містять налагоджувальні коміти, збережіть і закрийте програму.

Після перебазування просто витягніть foo-merge у master:

git checkout master
git pull . foo-merge

1
Трохи складно робити коментарі, коли вам це не дозволяють. FWIW, я проголосував за вашу відповідь, перш ніж вирішити, що моя буде достатньо іншою, щоб бути окремим записом, а потім подати її.
Ян Чжао,

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