Перебазировать две ветви на другую - PullRequest
0 голосов
/ 03 января 2019

Учитывая следующую историю мерзавцев:

enter image description here

Какой самый простой способ перебазировать ветви feature/1 и feature/2 на master для получения следующей истории:

enter image description here

До сих пор я придумал следующее:

  1. Оформить заказ feature/2 (глава цепочки коммитов, которую я хочу перебазировать)
  2. Перебазировать ветку на мастер: git rebase master
  3. Изменить голову ветви feature/1: git branch -f feature/1 <hash>

Где <hash> - хэш дублированного коммита Feature 1, созданного командой rebase.

Работает нормально, но мне кажется слишком сложным.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Самое простое и быстрое решение - это то, которое вы уже разработали.Вы можете комбинировать шаги 1 и 2

git rebase master feature/2

, и вам может быть проще избежать работы с идентификаторами коммитов, в случаях (например, в вашем примере), где легко вычислить выражение для целевого коммита

git branch -f feature/1 feature/2^

Вы можете, как уже упоминали другие, использовать две перебазировки.Однако это не проще.То есть, является ли сложность команд более простой, это вопрос мнения;но то, что вы говорите Git делать объективно сложнее.И как следствие этого, есть больше возможностей для вещей пойти не так, как надо.Например, конкретный метод перебазирования feature/1, а затем перебазирования feature/2 вместо feature/1 основан на обнаружении дублирующих идентификаторов патчей во время 2-й перебазировки, которая неудачным образом завершится неудачей, если какое-либо разрешение конфликта произошло в течение 1-гоперебазироваться.Если вы действительно хотите использовать подход с 2-ребазированием, я бы рекомендовал, чтобы 2-й ребаз был выполнен как

git rebase --onto feature/1 feature/1@{1} feature/2

, поскольку это позволяет избежать даже переписывания коммитов feature/1.(feature/1@{1} - это запись reflog, которая указывает на feature/1 до того, как она была перебазирована.) Но тогда вы используете менее распространенный синтаксис rebase, который, насколько я могу судить, по крайней мере, не так прост, какВы делали в первую очередь.

В качестве альтернативы вы можете использовать --fork-point, чтобы заставить git автоматически интерпретировать reflog и попытаться выяснить, какие коммиты будут дупсами.

git rebase --fork-point feature/1 feature/2

До тех пор, пока вы выполняете обе перебазировки почти в одно и то же время на одном и том же клоне, это будет работать большую часть времени .Но это добавляет больше сложности (в форме «магии», которую делает git под капотом), поэтому вам нужно понять, что это может пойти не так, и если он действительно либо (а) знает достаточно о том, что он пыталсясделать, чтобы диагностировать проблему, или (b) отступить и использовать один из других методов.

0 голосов
/ 03 января 2019

Скажите git, что вы делаете, и последовательность:

git rebase master feature/1
git rebase feature/1 feature/2

примерно так, вы можете c & p это:

git init test; cd $_
doit() { eval echo \>$*; git add $1; git commit -m "$2"; }
doit master "Initial commit"
git checkout -tb feature/1
doit file1 "Feature 1"
git checkout -tb feature/2
doit file2 "Feature 2"
git checkout master
doit master "New commit on master"

, производя ваш график точно:

$ git log --graph --decorate --oneline --all
* 35cfad5 (feature/2) Feature 2
* 46b79ae (feature/1) Feature 1
| * ae89e31 (HEAD -> master) New commit on master
|/  
* f1138eb Initial commit
$

и теперь, так как вы сказали git свою структуру ветки,

$ git rebase master feature/1
First, rewinding head to replay your work on top of it...
Applying: Feature 1
$ git rebase feature/1 feature/2
First, rewinding head to replay your work on top of it...
Applying: Feature 2
$ 
...