Git слиться и держать отдельно? - PullRequest
20 голосов
/ 06 января 2011

Есть ли способ обновить боковую ветвь информацией от другой (основной или другой), а затем продолжить эти две? Как перебазирование, но сохранение там старых данных?

Оригинал:

A---B---C---G---H  master
     \           
      D---E---F  branchA

Результат:

A---B---C---G---H---L  master
     \           \
      D---E---F---J---K  branchA

Так, что branchA получает информацию от коммитов C, G и H (коммит J - это слияние), так что коммит K все еще является побочной ветвью (а будущий коммит L все еще находится на master), но имеет обновлена ​​информация от мастера?

Я не хочу делать ребаз, потому что это закончится:

A---B---C---G---H---L  master
                 \
                  D'---E'---F'---K  branchA

Создание «новых версий» D, E и F, как если бы они произошли поверх H вместо B, и проблема в том, что коммит C и E - это переименование ключевой папки в репо, и я хочу свернуть их вместе , пока не объединяя обновления других функций из branchA. Перебазирование означает, что H использует новое имя папки, D 'создает старое имя папки, а E снова удаляет его, что не является самым чистым.

Суть в том, что я хочу переименовать эту папку (C и E) в прошлом и прекратить ее продвижение. Имеет ли это смысл? Я смотрю на это назад? Или я должен просто разобраться с беспорядочным трюком «name, rename» до тех пор, пока ветвь не будет объединена?

Ответы [ 2 ]

19 голосов
/ 06 января 2011

Если ваша история доходит до H или L на ведущем устройстве и F на ветви A (то есть J и K еще не существуют), тогда да, просто проверьте ветку A и объедините:

git checkout branchA
git merge H   # Use H's commit identifier if it's not the tip of master

Это объединит изменения в branchA и вообще не будет мешать основной ветке.

Если вы уже создали коммит K и хотите вставить слияние между ним и F, тогда есть немного больше работы дляdo:

git checkout -b temp F   # Create a new branch at commit F
git merge H              # Merge from commit H into the new branch
git cherry-pick K        # Apply the K commit to the merged commit

# And the rest simply replaces the temp branch with branchA
git checkout branchA
git reset --hard temp
git branch -d temp

В обоих случаях, если позднее вы выполните слияние в любом направлении, коммит H будет ближайшим общим предком обеих ветвей истории, и поэтому будущие слияния не будут проходить мимо этого коммита (или прошлого Jк F либо) при решении, как объединить.

2 голосов
/ 06 января 2011

Простое git merge master на branchA должно подойти (или git merge H, где H - это commit-ref H, если H не является последним на ведущем устройстве).

Возникнут конфликты, если и C, и E переименуют одну и ту же папку, которую вам придется разрешить, но кроме этого с вами все будет в порядке.

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