GITLAB: Как перенести ВСЮ ветку на другую - PullRequest
2 голосов
/ 24 октября 2019

Моя цель довольно проста для объяснения, но пока я не мог найти способ сделать это. Допустим, у меня есть 3 ветви. A, B и C

A -------.
          \--------.----------- B
                     \
                      .-------------- C

Я просто хочу перенести всю ветвь "C" в ветвь "B". Позвольте мне объяснить: я не хочу хранить все, что я делал в Bпосле того, как я создал C из него. Я просто хочу, чтобы B имел точно такой же код с ветвью C.

Как я могу это безопасно сделать?

Существует более 10 000 различий между этими двумя файлами, поэтому вручнуюэто не вариант.

Я пробовал несколько вещей, включая git merge со "их" стратегией, но у меня все равно было много конфликтов.

Ответы [ 4 ]

5 голосов
/ 24 октября 2019

Независимо от количества потенциально конфликтующих файлов или различий в коде, любая из этих трех команд

# if you don't need to checkout the branch immediately
git branch -f B C

# if you DO want to checkout the branch immediately
git checkout -B B C

# if you branch B is ALREADY checked out
git reset --hard C

сделает B пункт на том же коммите, чем C, делая их абсолютно идентичными, код и история. Нет разрешения конфликтов, нет слияний, это происходит мгновенно.

Обратите внимание, что это считается переписыванием недавней истории B, поэтому его нельзя использовать, если вы делитесь веткой Bс кем-либо.

Также будет разыменован любой коммит, сделанный на B после того, как C был разветвлен, поэтому, если у вас есть какие-либо сомнения, заранее сделайте резервную копию B с помощью

git branch backup-B B

Наконец ... вы забыли сделать резервную копию и пожалели? git reflog перечислит предыдущие позиции HEAD, вы найдете там B, восстановите его с помощью git reset --hard <old position hash> или наденьте на него ручку для проверки / повторного использования с git branch recovered-B <old position hash>

4 голосов
/ 24 октября 2019

Оформить заказ B, затем сбросить HEAD

git checkout B
git reset --hard C
3 голосов
/ 24 октября 2019

Нет стратегии theirs. Существует опция -X theirs , но это не стратегия. Git называет это «опцией стратегии», что является плохим названием: это звучит как опция, предоставляющая стратегию, но на самом деле это опция от до какой-то другой стратегии,один из параметра -s, который по умолчанию -s recursive здесь. Я называю -X «расширенной опцией», чтобы избежать путаницы с опцией -s.

Для описания почему нет -s theirs, хотя быласм. этот ответ VonC .

. Различные методы сброса (git checkout -B, git reset --hard и т. п.) в других ответах здесь, как правило, являются подходящим способом. ,Однако, если вы хотите легко создать эффект стратегии -s theirs, посмотрите ответ jthill to Есть ли "их" версия "git merge -s ours"? «

2 голосов
/ 24 октября 2019

Если вы просто хотите отменить все изменения, уникальные для B, удалите его:

git branch -d B

Оформить заказ C и создайте из него новый B:

git checkout C
git branch B

B теперь точно так же, как C.

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