2

我试图理解为什么当我在一种情况下合并时,Git 会自动为我执行提交,而在另一种情况下则不然。

方案 1

我们刚刚掌握了许多提交和一个或多个标签。

git checkout --orphan newbranch
rm -rf * # Plus removing a few .files other than the .git folder
git add -A
git commit -m "Created empty newbranch branch."
git merge tagname

方案 2

就回购的状态而言,与上述相同。

git checkout --orphan newbranch
git merge tagname

当我执行场景 1 并签出新分支时,我将看到所有提交消息以及顶部的两条新消息,即“已创建空的新分支”。(我自己输入)和另一个说“将标签'v1.02'合并到新分支中”。

我已经阅读了文档(虽然可能从来没有按章节顺序),但我不明白为什么它应该对场景 1 进行自动提交,而对场景 2 则不进行。

4

2 回答 2

3

实际上,它确实做了一个自动提交。

git checkout --orphan newbranch更新HEAD以告诉 git 你在分支上newbranch。它不会创建分支。结果是这样的:

$ git status
# On branch newbranch
#
# Initial commit
#
# Changes to be committed:
[snip]
$ git symbolic-ref HEAD
refs/heads/newbranch
$ git rev-parse HEAD
HEAD
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

如果你现在git commit有什么东西,分支实际上会被创建。因为refs/heads/newbranch在执行“git commit”时不存在,所以该新提交的“父级”为空,即分支现在标记了一个没有父级的提交:根提交。

同样,如果你git merge tagname和合并顺利,提交就会发生,分支就会被创建。因为这是一个合并提交,它通常(除非它是快进)有两个父级:“之前的提交”和“现在有什么”。但是您明确告诉 checkout 应该“之前没有提交”。

因此,从逻辑上讲,结果是单亲提交,即被合并的提交。它作为快进合并执行,设置newbranch为指向相同的提交指向哪些tagname点。

如果您要求进行非快进合并,则会收到错误消息:

$ git merge --no-ff master
fatal: Non-fast-forward commit does not make sense into an empty head

这遵循“根提交”和“合并提交”的定义:根提交是没有父提交的提交,而“合并提交”是有两个或更多父提交的提交。根本不可能有一个单亲的合并提交——这只是一个普通的非合并提交!

于 2013-11-12T01:13:51.140 回答
0

您正在合并到一个空分支中,因此没有什么可以合并的。

于 2013-11-11T22:16:12.960 回答