git: Как объединить старое состояние, если новое состояние уже объединено? - PullRequest
0 голосов
/ 17 мая 2018

У нас была ветвь (скажем, ветвь A) с некоторыми модификациями, которые мы хотели объединить в master, и некоторые модификации, которые мы еще не хотели объединять, но хотели сохранить для дальнейшего использования.Мы не перебазировали / не разделили коммиты и просто пошли на ручную модификацию кода.

Поэтому мы создали новую ветку (ветку B) из ветки A, чтобы сохранить весь кодв текущем состоянии, включая модификации, которые мы хотели объединить позже.В существующей ветви (ветвь A) мы вручную модифицируем код, чтобы удалить части, которые мы не хотели объединять на данный момент.

Затем мы слили ветвь A в master.Проблема в том, что если мы сейчас попробуем объединить ветку B, git merge скажет, что все обновлено.Я предполагаю, что это потому, что нет особой разницы в B по сравнению с общим предком B и master (то есть ветвь A до удаления частей кода, которая идентична ветке B).Например, git diff master...B не показывает различий.Но существуют реальные различия.

Я понимаю, что мы не следовали лучшим практикам.Что мы должны были создать новую ветку, чтобы изменить историю в нее.Или что мы должны удалить части кода в новой ветви B, а не в исходной ветви A.

Но есть ли способ сказать git изменить стратегию слияния, чтобы онна самом деле выбирает различия в ветке B?

1 Ответ

0 голосов
/ 18 мая 2018

Я не думаю, что есть способ изменить стратегию слияния таким образом, потому что история изменений имеет отношение к слиянию.Речь идет не просто о сравнении двух независимых файлов, а о применении изменений.Поскольку B является родоначальником A, после слияния A all ваши изменения в B будут объединены с master.

Если избыточное слияние старшегосостояние отменит новые изменения, вся концепция слияния станет очень ... странной.

То, что вы на самом деле хотите сделать, это не слияние изменения (потому что все объединено), но возвращает некоторых изменений, которые уже были объединены.

Для этого вы можете использовать git revert <sha> в ветке master, где с помощью <sha> вы можете указать коммит, который вы хотите вернуть.

git revert <sha> создает новый коммит, который точно инвертирует указанный коммит.

Оригинал

         master <- HEAD
           |
1----------5
 `-2--3--4´
      |  |
      B  A

После git revert 4

            master <- HEAD
              |
1----------5--6
 `-2--3--4´    `revert A
      |  |
      B  A

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

git revert B..A

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

git revert --no-commit B..A
git commit -m"Revert everything at once"

, чтобы создать один ревert commit для всех отмененных изменений.

...