Git - синхронизировать ветку * точно * с файлами нового мастера? - PullRequest
1 голос
/ 17 апреля 2019

У меня есть ветвь git, которая изначально разветвлялась от master1, но теперь ее нужно переназначить (если это даже правильный термин?) На master2.

Другими словами, теперь я хотел бы перевести «ветвь» в состояние, идентичное «master2», т. Е. Содержит все те же файлы, что и (и не более) master2.

  • Я пробовал объединить master2 в ветку, которая сработала. Но тогда ветвь все еще содержит старые файлы из master1, а master2 - нет, и при создании PR из ветки в master2 она пытается добавить эти устаревшие файлы.
  • Я пробовал ветку git checkout, затем git reset --hard master2. Но теперь при фиксации происходит сбой, говоря, что кончик моей текущей ветви находится за его удаленным аналогом
  • Я подумал, что, возможно, git push --force поможет обойти эту последнюю ошибку, но я тоже не могу ее использовать, так как она отключена на сервере

Есть ли для меня способ сделать это?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Локально, правильно запускать git checkout foo && git reset master2 --hard.Однако, поскольку вы не можете выполнить принудительное принудительное нажатие, foo в удаленном хранилище не может быть обновлено.Мы можем использовать другой способ, чтобы foo имел те же каталоги / файлы с master2, не переписывая историю.

git checkout foo
git merge $(git commit-tree -p HEAD -m "blah blah" master2^{tree})

git commit-tree создает объект фиксации, чей родитель является текущей главойfoo и чье дерево совпадает с деревом головы master2.Когда 2 коммита имеют одинаковое дерево, они имеют одинаковые каталоги и файлы с одинаковым содержимым.git commit-tree также возвращает хеш объекта фиксации.Таким образом, foo обновляется до нового коммита с помощью быстрого слияния.Сначала обновите локальный master2, если необходимо.

1 голос
/ 17 апреля 2019

Если вам не нужно хранить историю вашей ветки, просто наведите ее на ссылку, которую вы выбрали:

git branch -f your-branch master2

Однако, чтобы сохранить историю ветки по любой причине (здесьв частности, поскольку правила сервера запрещают принудительный толчок), вы можете объединиться со стратегией ours:

# create a copy of master2 and merge your-branch in it, BUT taking nothing from it
git checkout -b master2-copy master2
git merge -s ours your-branch

# at this point we have to reflect the operation on your-branch
# (the second merge is just a fast-forward)
git checkout your-branch
git merge master2-copy

# delete the temp branch
git branch -d master2-copy

Тогда your-branch будет точно таким же, как master2, но вы сможетенажмите your-branch на пульт без усилия.

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