Застосування змін з гілки b до a без злиття або додавання комітів


86

Мій сценарій полягає в тому, що у мене є одна гілка, в якій я зробив значні вдосконалення у процесі побудови (гілка А), а в іншій я працюю над не пов’язаною функцією (гілка В). Отже, коли я зламаю гілку B, я хочу втягнути речі, які я написав у гілці A, тому що хочу швидші та простіші збірки. Однак я не хочу "забруднювати" свою гілку B, просто додаю зміни з branchA до нестадійних змін.

Те, що я пробував (стоячи на гілці B):

git merge --no-commit branchA

Не працює, тому що вкладає вас у злиття. Якби цього не сталося, це було б ідеально.

git checkout branchA -- .

Не працює, оскільки застосовує зміни між галуззю....галузьБ, а не зміни-майстер..галузьА.

Щось іще?

Редагувати: Так, зміни у гілці А здійснено. У цьому прикладі є лише одна гілка з удосконаленнями збірки, але може бути до N гілок із вдосконаленнями збірки, які я хочу застосувати під час роботи над гілкою функцій.


Чи вже здійснено зміни на A?
Theolodis

Відповіді:


152

Мені просто довелося зробити щось подібне і зміг це виправити, додавши --squashдо команди злиття

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes

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

скажімо, я щойно об’єднав код з branchA в master, але щось забув і хочу додати ще кілька кодів / змін до цього коміту злиття, не відображаючись як черговий коміт злиття в історії git. чи спрацює цей метод?
Сушміт Сагар,

@Sushmit Я думаю, що ви можете зробити це, git commit —amendі воно додасть нові зміни до останнього коміту, я просто не зовсім впевнений, що це працює на
коммітуванні

1
Я не думаю - тут не потрібно жодного коміту? Має бути типовим.
Петтер,

11

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

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

У такому випадку я б створив нову гілку, C, яку ви об’єднаєте як з A, так і з B (та будь-якої іншої гілки з удосконаленнями збірки). Зафіксуйте зміни у гілці об’єктів B, а потім об’єднайте їх із гілкою C, яка тепер містить вдосконалення збірки та зміни гілки функції, щоб ви могли їх перевірити разом. Якщо вам потрібно внести більше змін, зробіть це у відповідній гілці, а не в C, тоді об'єднайте з C. Тому ніколи не змінюйте нічого у гілці C, просто використовуйте це для інтеграції змін з інших гілок.

Це означає, що ви можете використовувати всі функції Git у гілці C, замість того, щоб жонглювати нездійсненими змінами в брудному дереві.


UseCase для cherry-pick -n: Я створив робочу копію свого коду, додавши багато речей у випадкові місця. Тепер я хочу очистити свій код перед тим, як перейти до гілки цієї функції. Тому я переходжу до тимчасової гілки, фіксую всі зміни. Поверніться до гілки функцій, cherry-pickяка здійснює коміт. Чи є кращий спосіб зробити це?
Tejas Kale

6

Ви повинні мати можливість вибирати комміти ( -nщоб уникнути негайного вчинення)


-n не працював. У ньому сказано, що параметр no -m з урахуванням вибору черрі не вдався.
Alejandro Sanz Díaz

5

Я не впевнений на 100%, що зрозумів це чітко, але в моєму випадку я просто створив виправлення різниць між гілками, а потім застосував цей шлях до гілки B.

Всередині гілки A:

 git diff branchA..branchB > patch.diff
 git apply patch.diff

4

Я не впевнений, що розумію ваші вимоги.

Ви можете запустити злиття, а потім зателефонувати git reset HEAD~1.


Наступна послідовність повинна відтворювати кожен коміт між masterі branchAповерх branchB. Комітети, на які вже було застосовано, branchBбудуть пропущені.

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip

# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB

# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip

Це додає файли до проміжної області git, чого я не хочу. Плюс, здається, це працює добре лише тоді, коли всі гілки розгалужені від одного коміту на головній гілці. В іншому випадку різниця не в діапазоні master..branchA вводяться.
Бьорн Ліндквіст,

@ BjörnLindqvist: видаліть --softопцію, якщо ви не хочете, щоб зміни в індексованій області. Не могли б ви скласти графік того, як налаштовані ваші гілки?
LeGEC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.