Как мне «перезаписать», а не «объединить» ветку в другой ветке в Git? - PullRequest
215 голосов
/ 07 января 2011

У меня есть две ветви, email и staging.staging является самым последним, и мне больше не нужны старые изменения в ветке email, но я не хочу их удалять.

Так что я просто хочу сбросить все содержимое stagingв email, чтобы они оба указывали на один и тот же коммит.Это возможно?

Ответы [ 10 ]

175 голосов
/ 07 января 2011

Вы можете использовать «нашу» стратегию слияния:

$ git checkout staging
$ git merge -s ours email # Merge branches, but use our branch head
84 голосов
/ 07 января 2011

Если вы просто хотите, чтобы две ветви 'email' и 'staging' были одинаковыми, вы можете пометить ветку 'email', а затем сбросить ветку 'email' на 'staging':

$ git checkout email
$ git tag old-email-branch
$ git reset --hard staging

Вы также можете перебазировать ветку 'staging' на ветку 'email'.Но результат будет содержать модификацию двух веток.

63 голосов
/ 13 марта 2012

Другие ответы дали мне правильные подсказки, но они не помогли полностью.

Вот что мне помогло:

$ git checkout email
$ git tag old-email-branch # This is optional
$ git reset --hard staging
$
$ # Using a custom commit message for the merge below
$ git merge -m 'Merge -s our where _ours_ is the branch staging' -s ours origin/email
$ git push origin email

Без четвертого шага слияния с нашимиСтратегия, push считается обновлением без ускоренной перемотки вперед и будет отклонено (GitHub).

57 голосов
/ 11 мая 2015

Я видел несколько ответов, и это единственная процедура, которая позволяет мне исправить это без каких-либо конфликтов.

Если вы хотите все изменения от branch_new в branch_old, тогда:

git checkout branch_new
git merge -s ours branch_old
git checkout branch_old
git merge branch_new

однажды применив эти четыре команды, вы можете без проблем нажать на branch_old

36 голосов
/ 23 марта 2015

Если вы похожи на меня и не хотите иметь дело со слиянием, вы можете выполнить описанные выше шаги, за исключением использования силы вместо слияния, потому что это создаст отвлекающий след журнала:

git checkout email
git reset --hard staging
git push origin email --force

Примечание. Это возможно только в том случае, если вы ДЕЙСТВИТЕЛЬНО никогда больше не захотите видеть материал по электронной почте.

15 голосов
/ 02 июня 2017

Я хотел объединить две ветви, чтобы все содержимое в old_branch было обновлено содержимым из new_branch

Для меня это сработало как шарм:

$ git checkout new_branch
$ git merge -m 'merge message' -s ours origin/old_branch
$ git checkout old_branch
$ git merge new_branch
$ git push origin old_branch
10 голосов
/ 01 июля 2015

Как насчет:

git branch -D email
git checkout staging
git checkout -b email
git push origin email --force-with-lease
5 голосов
/ 25 февраля 2017

Другие ответы выглядели неполными.
Я попробовал ниже полностью, и это работало нормально.

Примечание:
1. Сделайте копию своего хранилища, прежде чем пытаться сделать это ниже, чтобы быть в безопасности.

подробности:
1. Вся разработка происходит в ветке dev
2. Ка ветка - это точно такая же копия dev
3. Время от времени код разработчика необходимо переместить / переписать в ветку qa

поэтому нам нужно переписать ветку qa из ветви dev

Часть 1:
С помощью приведенных ниже команд старый qa был обновлен до нового dev:

git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push

Автоматический комментарий для последнего нажатия дает ниже:

// Output:
//  *<MYNAME> Merge branch 'qa' into dev,*  

Этот комментарий выглядит обратным, потому что приведенная выше последовательность также выглядит обратной

Часть 2:

Ниже приведены неожиданные новые локальные коммиты в dev, ненужные
Итак, мы должны выбросить и сделать девочку нетронутой.

git checkout dev

// Output:
//  Switched to branch 'dev'  
//  Your branch is ahead of 'origin/dev' by 15 commits.  
//  (use "git push" to publish your local commits)


git reset --hard origin/dev  

//  Now we threw away the unexpected commits

Часть 3:
Убедитесь, что все как и ожидалось:

git status  

// Output:
//  *On branch dev  
//  Your branch is up-to-date with 'origin/dev'.  
//  nothing to commit, working tree clean*  

Вот и все.
1. старый qa теперь перезаписывается новым кодом ветки dev
2. local is clean (удаленный источник / dev не тронут)

2 голосов
/ 05 мая 2017
git checkout email
git merge -m "Making email same as staging disregarding any conflicts from email in the process" -s recursive -X theirs staging
0 голосов
/ 22 апреля 2019

Самый простой способ сделать это:

//the branch you want to overwrite
git checkout email 

//reset to the new branch
git reset --hard origin/staging

// push to remote
git push -f

Теперь ветка электронной почты и сценарии совпадают.

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