Как полностью переопределить одну ветку git на другую

Мой проект посчитали наследием, и я начал все сначала. Вот что я сделал:

  1. Я проверил develop в своем текущем проекте и создал новую refactor ветку.

  2. Затем я git rm * удалил все файлы и начал все сначала.

  3. Во время работы над новой веткой в ​​исходную develop ветку были внесены и зафиксированы некоторые изменения.

Теперь, когда я закончил с веткой refactor, как мне безопасно объединить или перебазировать эту ветку в develop, чтобы она полностью переопределяла?

Вот моя мысль:

Вариант 1. Просто поменять названия веток.

Это простое решение, но это должен быть последний вариант, потому что если я сделаю это в удаленных ветках, это запутает моих товарищей по команде. В следующий раз они git pull не уверен, что они refactor правильно выдернут ветку. скажи мне, если я ошибаюсь.

Вариант 2. Объединение

Вариант 3. Перебазировать

Может быть, выполнение rebase будет означать повторение git rm * в последнем коммите ветки develop, чего я и хочу? Но что произойдет, если я сольюсь?


50
1

Ответ:

Решено

Похоже, вы хотите сохранить версию ветки refactor независимо от того, что присутствует в ветке develop. Если вы абсолютно уверены, что это так, то вы можете выполнить слияние с помощью стратегии наши. Это слияние должно выполняться с опцией -s, которая просто сохраняет текущую версию, а не с опцией -X, которая попадала бы на текущую версию только в случае конфликтов.

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

В вашем случае, поскольку для опции theirs нет стратегии -s, вам нужно выполнить пару слияний, чтобы «обмануть» Git, заставив его поверить, что изменения refactor уже присутствуют в develop.

# making sure to be on branch refactor
git checkout refactor

# creating a temporary branch from refactor and switching to it
git checkout -b temp

# merging develop into temp and keeping only the version from temp (i.e. refactor),
# this will result in a new merge commit on temp where every commit in develop is reachable from temp
git merge -s ours develop

# switching to branch develop
git checkout develop

# fast-forward merge as "every commit in develop is already contained in temp", keeping only temp's version (i.e refactor)
git merge temp

# deleting the temporary branch temp
git branch -d temp