Як скопіювати комітети з однієї гілки в іншу?


727

У мене від майстра дві гілки:

  • v2.1 : (версія 2) Я працював уже кілька місяців
  • wss : що я створив вчора, щоб додати одну конкретну особливість своєму майстру (у виробництві)

Чи є спосіб скопіювати вчорашні зобов’язання з wss в v2.1?


Щоб просто скопіювати комісії (або діапазон комітетів) з однієї гілки в іншу, ця відповідь мені найкраще допомогла: stackoverflow.com/questions/1994463/…
caramba

Відповіді:


563

У вас дійсно повинен бути робочий процес, який дозволяє вам це робити шляхом злиття:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (wss)

Отже, все, що вам потрібно зробити, це git checkout v2.1і є git merge wss. Якщо з якихось причин ви дійсно не можете цього зробити, і ви не можете скористатися git rebase, щоб перемістити свою гілку wss до потрібного місця, команда захопити одну команду звідкись і застосувати її в іншому місці - це git cherry-pick . Просто перевірте гілку, на яку потрібно застосувати її, та запустіть git cherry-pick <SHA of commit to cherry-pick>.

Деякі із способів перезавантаження даних можуть врятувати вас:

Якщо ваша історія виглядає так:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

Ви можете використовувати git rebase --onto v2 v2-only wssдля переміщення wss безпосередньо на v2:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

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

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase

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


1
Не міг більше погодитися з цією відповіддю. +1. Дивіться також мій старий відповідь ілюструє наслідки вишневого вибору: stackoverflow.com/questions/881092 / ...
VonC

18
Чудова відповідь, як це зробити належним чином! Я б хотів, щоб я міг два рази голосувати за зусилля щодо створення діаграм ASCII.
gotgenes

@VonC: Дякую за підтримку та додаткову інформацію про те, чому б не взяти вишню - я знаю, що трохи проїхав. @gotgenes: Дякую! Я думаю, що цілком варто докласти зусиль - просто подивіться на сторінку git-rebase. Немає кращого способу пояснити це.
Каскабель

Що стосується того, чому ви не зможете злитися - Git merging не грає добре з git-svn. Щоб скопіювати серію комітетів з однієї гілки SVN в іншу, я закінчив їх вибирати, а потім виконати інтерактивне перезавантаження / повторне слово, щоб видалити неправильні git-svn-idпосилання, перш ніж dcommitзнову. Хоча я, мабуть, міг би залишити крок вишні і просто використав ребазу сам по собі.
Боб

1
Ось мій випадок використання: критичні виправлення помилок були допущені до функції гілки. Мені це потрібно в майстра, щоб зараз перейти у виробництво. Це врятує мою недопалку.
Гіпертекст капітана

910

Використовуйте

git cherry-pick <commit>

подати заявку <commit>до своєї поточної філії .

Я сам, мабуть, перехресно перевірив зобов’язання, які я отримую, gitkі виберіть їх, натиснувши правою кнопкою миші, натомість замість цього зробити запис.


Якщо ви хочете пройти більш автоматично (з усіма його небезпеками) і припускаючи всі комісії з вчорашнього дня на wss, ви можете сформувати список комітетів, використовуючи git log(за --prettyпропозицією Jefromi)

git log --reverse --since=yesterday --pretty=%H

тому все разом, якщо ви використовуєте bash

for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
    git cherry-pick $commit
done

Якщо тут щось піде не так (потенціал є багато), ви потрапили в біду, оскільки це працює в режимі прямої перевірки, тому або робіть ручні вишні, або використовуйте поновлення, як запропонував Jefromi.


Усі заповнювачі для опції --pretty знаходяться на сторінці git-log. Ви можете отримати будь-який потрібний вам формат - особливо корисний для отримання потрібних полів для сценарію у легко розбірливій формі.
Каскабель

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

2
Домовились. Тому я ніколи його не використовую, а роблю вручну. Але вишня вибору все одно є відповіддю, принаймні на назву питання. Я змінив відповідь.
Бенджамін Баньє

1
Хтось прихильнився до старої / неправильної гілки, і вишня вибору дозволить мені поставити цю команду в потрібну гілку (при цьому все ще зберігаю їх як довідник). Ідеально.
Патрік

8
Рідкісне видовище, gitвідповідь проста і зрозуміла на рішення, замість того, що блукає через тонкощі git, щоб довести, наскільки добре його знає.
Przemek D

74

git cherry-pick : Застосуйте зміни, внесені деякими існуючими комісіями

Припустимо, ми маємо гілку A з (X, Y, Z). Нам потрібно додати ці коммітов в галузі B . Ми будемо використовувати cherry-pickоперації.

Коли ми використовуємо cherry-pick, ми повинні додати фіксації на гілку B в тому ж хронологічному порядку , що коммітов з'являються в філії A .

cherry-pick підтримує ряд комісій, але якщо у вас є об'єднання комітетів у цьому діапазоні, це стає дуже складним

git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z

Приклад робочого процесу:

введіть тут опис зображення

Ми можемо використовувати cherry-pickз опціями

-e або --edit : за допомогою цієї опції git cherry-pick дозволить вам редагувати повідомлення про фіксацію перед здійсненням.

-n або --no-commit : Зазвичай команда автоматично створює послідовність комітів. Цей прапор застосовує зміни, необхідні для вибору кожної названої комісії для вашого робочого дерева та індексу, не приймаючи жодних зобов'язань. Крім того, коли використовується ця опція, ваш індекс не повинен відповідати комісії HEAD. Вибір вишні проводиться відповідно до початкового стану вашого індексу.

Тут цікава стаття, що стосується cherry-pick.


19

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


16
Навіть якщо ви з якихось причин дійсно хочете використовувати патчі (-и) замість вишень (-ів) / ребазування, прямий спосіб зробити це з допомогою git format-patch <revision range>і git am *.patch.
Каскабель

Це вимагає checkoutдо іншої гілки.
CoolMind

12

Або якщо ви трохи менше на стороні євангеліста, ви можете зробити трохи некрасивого способу, яким я користуюся. У Execute_template є комітети, які я хочу скопіювати у свій майстер у вигляді розгортання гілки

git branch deploy deploy_template
git checkout deploy
git rebase master

Це створить нове розгортання гілки (я використовую -f, щоб перезаписати існуючу гілку розгортання) на розвернутий_шаблон, а потім перезавантажте цю нову гілку на головний, залишивши розгорнутий_шаблон незайманим.


1

У простому випадку просто скопіювати останню команду з гілки wss в v2.1, ви можете просто схопити id ( git log --oneline | head -n 1) і зробити:

git checkout v2.1
git merge <commit>

Для цього потрібна перевірка в іншу гілку.
CoolMind

1

Команда вишня вибору може прочитати список комітетів зі стандартного вводу.

Наступна команда cherry-picks здійснює автор користувача Джон, який існує у гілці «розвивати», але не в гілці «випуск», і робить це в хронологічному порядку.

git log develop --not release --format=%H --reverse --author John | git cherry-pick --stdin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.