Не совсем понятно , почему вы хотите это сделать (обычные причины покрываются git merge -s ours
, что делает фиксацию merge вместо фиксации с одним родителем), но это легко сделать, , используя либо git merge --squash -s ours
, затем git commit
, либо , используя git commit-tree
. Редактировать : -s ours
от мастера сохранит неправильное дерево (z
вместо c
). можно использовать, но если вам нужен коммит merge .См. Раздел ниже.
(Все приведенные ниже команды предполагают, что вы находитесь на master
сейчас.)
Чтобы использовать git commit-tree
, вы должны предоставить несколько дополнительных аргументов, которые требуют дополнительной настройки: *Например, 1026 *
hash=$(git commit-tree -p HEAD -F /tmp/commit-msg someOtherBranch^{tree})
, с сообщением о фиксации, хранящимся в файле /tmp/commit-msg
.Полученный в результате хеш-идентификатор представляет собой новый объект фиксации, который еще не находится ни в одной ветви, но теперь его легко «переместить вперед-слияние» в:
git merge --ff-only $hash
или git reset
в:
git reset --hard $hash
Вы также можете, как заметил Джон Шакмейстер , использовать git checkout
для наложения индекса другого рабочего дерева и рабочего дерева на текущий.Вы должны git rm
все сначала, если у вас есть файл с именем README
, а у них нет README
, например, README.md
.
Или вы можете использовать git read-tree
сделать это, как мне кажется, проще:
git read-tree -m -u someOtherBranch; git commit
(здесь не нужно ^{tree}
, так как git read-tree
разрешит коммит в дерево сам по себе).
Если вы действительно хотите объединение после всех
Трюк дерева чтения (или удаления и извлечения) также можно использовать после установки истинного объединения с помощью git merge -s ours
.То есть:
git merge -s ours someOtherBranch
git read-tree -m -u someOtherBranch
git commit
подготовит к объединению, которое сохранит z
, затем заменит индекс и рабочее дерево на значения из c
, затем сделает новый коммит c1
, дерево которого соответствуетc
вместо z
:
...--x--y--z--c1 <-- master
/
...--a--b---c <-- someOtherBranch