Git: объединить старый коммит с текущей версией - PullRequest
18 голосов
/ 16 января 2012

Получен файл с двумя интересующими коммитами, оба в ветви Master, оба изменяют только один файл foo: предыдущий коммит AA и текущую версию в HEAD.Я хотел бы объединить две версии файла, сохраняя биты обоих, в HEAD на Master.

Я сделал простейшую вещь, которая, как мне казалось, будет работать:

git checkout -b merge-purgatory AA
git commit -m "pulled foo back from previous commit for merging into HEAD."
git checkout master
git merge merge-purgatory

, который просто перезаписывает текущую HEAD версию foo с AA версией.Попробовал и более многословный git checkout -m, тот же результат: тупая перезапись.

Как заставить git рассматривать AA версию foo как конфликтующее слияние с текущей HEAD версией

Ответы [ 4 ]

17 голосов
/ 16 января 2012

Если слияние Git не делает то, что вы хотите, вы можете сделать следующее:

  1. Убедитесь, что в файле нет никаких незафиксированных изменений foo, например. убедившись, что git status чисто.
  2. Перезаписать foo с версией от AA, используя: git show AA:foo > foo
  3. Выборочно ставить только те изменения из foo, с которыми вы хотите: git add -p foo
  4. Отменить все остальные изменения в foo с помощью git checkout -- foo
  5. Передача поэтапных изменений: git commit

В качестве альтернативы, если вы предпочитаете использовать графический инструмент сравнения (например, meld), вы можете просто сделать:

git show AA:foo > old-foo
meld old-foo foo
3 голосов
/ 13 мая 2015

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

git checkout -b merge-purgatory AA

здесь вам нужно немного изменить свой файл, например, вы можете добавить пустую строку. Тогда

git commit "pulled foo back from previous commit for merging into HEAD."
git checkout master
git merge --no-commit merge-purgatory

Таким образом, слияние завершится неудачей, и тогда все, что вам нужно сделать, это разрешить конфликт. Это сработало для меня.

1 голос
/ 16 января 2012
git merge --no-commit merge-purgatory

по крайней мере даст вам возможность просмотреть: изменить слияние до его совершения.
См. Также методики, предложенные в " Как объединить отдельные файлы с помощью git-merge? ", основанные на выборе вишни или проверке.


Что касается принудительного слияния вручную, вы можете объявить в .gitatributes файле , для этого конкретного файла, политика слияния, установленная в unset .

Выполнение трехстороннего слияния

1018 * слияние *

The attribute merge affects how three versions of a file is merged when a file-level merge is necessary during git merge, and other commands such as git revert and git cherry-pick.
Unset 

Взять версию из текущей ветки в качестве предварительного результата слияния и объявить, что слияние имеет конфликты. Это подходит для двоичных файлов, которые не имеют четко определенной семантики слияния.

0 голосов
/ 11 декабря 2018

Я избавляюсь от этого используя:

git checkout -f b855a13754fabf5cef6ff93ab00558608a839377 -- .

, который принудительно вносит изменения идентификатора фиксации в мою текущую ветвь (master), затем я создал новую ветвь (checkout -b) из этих примененных изменений и создал запрос на слияние с последним.

Ничто из перечисленного не сработало для меня: - (

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