Git: объединить старый фиксатор в текущую версию главы
Получил файл с двумя заинтересованными интересами, как на ветке Master
, так и только модификацией одного файла foo
: предыдущего commit 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
?
Ответы
Ответ 1
Если git merge не делает то, что вы хотите, вы можете сделать следующее:
- Убедитесь, что в файле
foo
нет незафиксированных изменений, например. убедившись, что git status
чист.
- Перезаписать
foo
с версией AA
, используя: git show AA:foo > foo
- Выбирайте только те изменения из
foo
, которые вы хотите: git add -p foo
- Отмените все остальные изменения на
foo
с помощью git checkout -- foo
- Зафиксируйте поэтапные изменения:
git commit
В качестве альтернативы, если вы предпочитаете использовать графический инструмент сравнения (например, meld
), вы можете просто сделать:
git show AA:foo > old-foo
meld old-foo foo
Ответ 2
Предыдущие ответы не содержат истории изменений, поэтому тот факт, что вы использовали предыдущую фиксацию для создания нового коммита.
Следующая процедура сохранит эту историю.
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
Таким образом, слияние не удастся, и тогда все, что вам нужно сделать, - это разрешить конфликт. Это сработало для меня.
Ответ 3
git merge --no-commit merge-purgatory
по крайней мере предоставит вам возможность просмотреть: смените слияние перед его совершением.
См. Также методы, предложенные в разделе Как объединить выборочные файлы с помощью git -merge?" на основе выбора или оформления вишни.
Что касается принудительного слияния вручную, вы можете объявить в .gitatributes
файле для этого конкретного файла политику слияния set to unset.
Выполнение трехстороннего слияния
Объединить
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
Возьмите версию из текущей ветки как результат пробного слияния и объявите, что слияние имеет конфликты. Это подходит для двоичных файлов, которые не имеют четко определенной семантики слияния.
Ответ 4
Я избавляюсь от этого используя:
git checkout -f b855a13754fabf5cef6ff93ab00558608a839377 --.
который checkout -b
изменения идентификатора фиксации в мою текущую ветвь (master), затем я создал новую ветвь (checkout -b
) из этих примененных изменений и создал запрос на слияние из последней.
Ничего из вышеперечисленного у меня не сработало :-(