Git Merge без автоматической фиксации

Можно ли сделать git merge, но без коммита?

"man git merge" говорит так:

With --no-commit perform the merge but pretend the merge failed and do not autocommit,
to give the user a chance to inspect and further tweak the merge result before
committing.

Но когда я пытаюсь использовать git merge с --no-commit он все равно автоматически фиксируется. Вот что я сделал:

$> ~/git/testrepo$ git checkout master
Switched to branch 'master'

$> ~/git/testrepo$ git branch
* master
  v1.0

$> ~/git/testrepo$ git merge --no-commit v1.0
Updating c0c9fd2..18fa02c
Fast-forward
 file1 |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

$> ~/git/testrepo$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

Последующий git log показывает все коммиты из ветки v1.0, объединенные с master.

Ответ 1

Обратите внимание на вывод при выполнении слияния - он говорит Fast Forward

В таких ситуациях вы хотите:

git merge v1.0 --no-commit --no-ff

Ответ 2

Вы неправильно понимаете значение слияния здесь.

--no-commit предотвращает MERGE COMMIT, и это происходит только тогда, когда вы объединяете две расходящиеся истории ветвей; в вашем примере это не так, поскольку Git указывает, что это было слияние "ускоренной перемотки вперед", и тогда Git только последовательно применяет коммиты, уже присутствующие в ветки.

Ответ 3

Если вы хотите только зафиксировать все изменения в одном коммите, как если бы вы набрали себя, --squash тоже сделает

$ git merge --squash v1.0
$ git commit

Ответ 4

Я предпочитаю этот путь, поэтому мне не нужно запоминать какие-либо редкие параметры.

git merge branch_name

Затем он скажет, что ваша ветка впереди С# commits, теперь вы можете отключить эти коммиты и поместить их в рабочие изменения со следующим:

git reset @~#

Например, если после слияния 1 фиксация выполняется, используйте:

git reset @~1

Ответ 5

Когда есть только один коммит в ветке, я обычно делаю

git merge branch_name --ff