У мене від майстра дві гілки:
- v2.1 : (версія 2) Я працював уже кілька місяців
- wss : що я створив вчора, щоб додати одну конкретну особливість своєму майстру (у виробництві)
Чи є спосіб скопіювати вчорашні зобов’язання з wss в v2.1?
У мене від майстра дві гілки:
Чи є спосіб скопіювати вчорашні зобов’язання з wss в v2.1?
Відповіді:
У вас дійсно повинен бути робочий процес, який дозволяє вам це робити шляхом злиття:
- 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
Примітка. Причина того, що для цього потрібна додаткова робота, полягає в тому, що це створює дублікати комісій у вашому сховищі. Це насправді не дуже добре - вся суть простого розгалуження та злиття полягає в тому, щоб мати можливість робити все, зробивши комісії (місця) в одне місце і об'єднавши їх там, де вони потрібні. Дублікати комітів означають намір ніколи не об’єднувати ці дві гілки (якщо ви вирішите, що хочете пізніше, у вас виникнуть конфлікти).
git-svn-id
посилання, перш ніж dcommit
знову. Хоча я, мабуть, міг би залишити крок вишні і просто використав ребазу сам по собі.
Використовуйте
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.
git rebase
у моїй відповіді, є більш надійним. Зокрема, використовуючи подібний цикл, якщо одна з вишень виходить з ладу, вона все одно спробує виконати всі інші. Це ... дуже дуже не добре, скажімо.
git
відповідь проста і зрозуміла на рішення, замість того, що блукає через тонкощі git, щоб довести, наскільки добре його знає.
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
.
Ви можете створити виправлення з комісій, які потрібно скопіювати, та застосувати патч до гілки призначення.
git format-patch <revision range>
і git am *.patch
.
checkout
до іншої гілки.
Або якщо ви трохи менше на стороні євангеліста, ви можете зробити трохи некрасивого способу, яким я користуюся. У Execute_template є комітети, які я хочу скопіювати у свій майстер у вигляді розгортання гілки
git branch deploy deploy_template
git checkout deploy
git rebase master
Це створить нове розгортання гілки (я використовую -f, щоб перезаписати існуючу гілку розгортання) на розвернутий_шаблон, а потім перезавантажте цю нову гілку на головний, залишивши розгорнутий_шаблон незайманим.
Команда вишня вибору може прочитати список комітетів зі стандартного вводу.
Наступна команда cherry-picks здійснює автор користувача Джон, який існує у гілці «розвивати», але не в гілці «випуск», і робить це в хронологічному порядку.
git log develop --not release --format=%H --reverse --author John | git cherry-pick --stdin