GIT: объединить branch1 и branch2 в master без перезаписи - PullRequest
0 голосов
/ 04 июля 2018

У меня есть следующий сценарий:

  1. Создан новый филиал branch1 из master
  2. В branch1 я добавил новый файл с именем b1.txt +, также в common.txt Я добавил новую строку echo 'line added in branch1';.
  3. Создан новый филиал branch2 из branch1
  4. Переименовал файл b1.txt в b2.txt + также в common.txt Я изменил эту строку на echo 'line added in branch2';.
  5. Объединено branch1 в master
  6. Объединено branch2 в master

Результат : master содержит 1 новый файл b2.txt и новую строку в common.txt, которая читает echo 'line added in branch2';.

Что я хотел бы получить в результате: master имеет 2 новых файла b1.txt и b2.txt и 2 новые строки в common.txt, которые читают echo 'line added in branch1'; и echo 'line added in branch2';.

Как этого добиться?

Примечание: Я знаю, обычно я должен создать branch2 из master, но гораздо проще скопировать-вставить (и немного изменить) изменения branch1, хотя branch1 еще не объединено в master.

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

Коммиты в branch1 также присутствуют в branch2, поэтому слияние двух ветвей приводит к самой branch2, которая включает в себя branch1.

Причина в том, что в истории модификации, которая привела к ветке 2, у вас есть все изменения в ветке 1, т. Е. Рабочее дерево определяется этими модификациями:

  • (коммит 1, из ветви 1) начните с мастера, создайте файл b1.txt и напишите "line added in branch1" в common.txt
  • (коммит 2, из ветви 2) начните с ветви 1, удалите b1.txt, создайте b2.txt и измените "branch1" с "branch2" в common.txt

вам нужно переписать историю branch2, чтобы два коммита были объединены в один со следующим набором изменений:

  • (объединенная фиксация) начните с мастера, создайте файл b2.txt и напишите "line added in branch2" в common.txt

Чтобы получить это, вы должны rebase branch2 и squash коммитов. Обратитесь к странице руководства для git-rebase, чтобы узнать, как это сделать. Или, если в Branch2 есть только один коммит, вы можете просто повторно зафиксировать текущее рабочее дерево, начиная с master вместо branch1. Это делается из branch2 с чистым рабочим деревом и индексом:

  • git reset --soft master
  • git commit

Затем вы можете объединить как ветку 1, так и ветку 2 в мастер (или друг в друга) и получить желаемый результат

0 голосов
/ 04 июля 2018

Вы можете создать branch2 из branch1, чтобы использовать измененные файлы, а затем заставить branch2 указать на master с помощью git reset:

git checkout master
git checkout -b branch1
* make changes and commit *
git checkout -b branch2
git reset --soft master
* make changes and commit *

На данный момент обе ветви имеют свои собственные изменения и отдельные истории (вплоть до master), что облегчает слияние с мастером с git merge branch1 branch2.

0 голосов
/ 04 июля 2018

Как насчет marge branch2 в branch1, а затем в master?

  • git checkout a (вы переключитесь на ветку)
  • git merge b (это объединит все изменения из ветви b в ветку a)
  • git commit -a (это подтвердит ваши изменения)
  • мастер проверки git (вы переключитесь на ветку b)
  • git merge a (это объединит все изменения из ветви a в master)
0 голосов
/ 04 июля 2018

В вашем случае: не меняйте, а добавляйте.

Так что в branch2, скопируйте вместо переименования b1.txt. И добавьте строку в common.txt.

Тогда вам не нужно объединять branch1, только branch2. Но вы можете, конечно, без каких-либо неблагоприятных последствий, например, есть больше изменений в branch1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...