Git合并--没有ff生成提交的副本
我今天有一个奇怪的git行为,我想问问这是否正常。现在,情况就是这样(新的提交添加到底部): 现在,当我Git合并--没有ff生成提交的副本,git,merge,fast-forward,Git,Merge,Fast Forward,我今天有一个奇怪的git行为,我想问问这是否正常。现在,情况就是这样(新的提交添加到底部): 现在,当我 git checkout br1 git merge --no-ff br2 它变成这样(请从头到尾阅读;最新提交是“E”) 好的。。现在,奇怪的事情是;现在我称之为“git状态”;上面说我比远程分支快4步。这是怎么发生的?我不应该是唯一一个承诺的人吗 奇怪的是,当我从Stash(基本上是GitWebUI)检查时,它确认了“4次提交”的状态,我在“br1”和“br2”下看到了相同的提交(b
git checkout br1
git merge --no-ff br2
它变成这样(请从头到尾阅读;最新提交是“E”)
好的。。现在,奇怪的事情是;现在我称之为“git状态”;上面说我比远程分支快4步。这是怎么发生的?我不应该是唯一一个承诺的人吗
奇怪的是,当我从Stash(基本上是GitWebUI)检查时,它确认了“4次提交”的状态,我在“br1”和“br2”下看到了相同的提交(bc和D)
我假设,当我使用“-no ff”参数时,“br2”(B C D)处的提交不会复制到“br1”,而只创建合并提交。我弄错了吗?从技术上讲,4次提交实际上是
br1
的一部分。如果删除br2
,提交仍将是br1
的一部分。当您重置合并提交时,会出现差异。如果执行硬重置,您将返回到合并提交之前的提交,即e
。这在您想要回滚时特别有用。因此,是的,您提前了四次提交,但只要您不重置br1
,您就应该没事了
另外,
-no ff
并不能阻止git复制提交。将提交与br1
树分开。通过这种方式,您可以维护分支的历史记录和进行提交的上下文,而不是大量提交(所有提交都与不同的功能相关)从技术上讲,4次提交实际上是br1
的一部分。如果删除br2
,提交仍将是br1
的一部分。当您重置合并提交时,会出现差异。如果执行硬重置,您将返回到合并提交之前的提交,即e
。这在您想要回滚时特别有用。因此,是的,您提前了四次提交,但只要您不重置br1
,您就应该没事了
另外,
-no ff
并不能阻止git复制提交。将提交与br1
树分开。这样,您就可以维护分支的历史记录和进行提交的上下文,而不是大量提交—所有提交都与不同的功能相关我认为您误解了Git中分支的工作方式,这意味着在创建新分支或将一个分支合并到另一个分支时,不会复制任何内容
分支是指向提交的引用。由于每个提交都链接到其以前的提交,因此当您指向一个提交时,实际上就是指向该提交的历史记录
在您的示例中,E
是一个合并提交,它将两个分支组合在一起,创建一个历史记录。这意味着在将br2
合并到br1
之后,br1
(现在是对E
的引用)将知道br2
的历史(现在仍然是对D
的引用),因为D
,C
和B
是E
历史的一部分
您的本地
br1
是对E
的引用,而您的远程br1
仍然是对a
的引用。因此,有四个提交(B
、C
、D
和E
)是br1
历史上新出现的,我想您误解了Git中分支的工作方式,这意味着在创建新分支或将一个分支合并到另一个分支时,不会复制任何内容
分支是指向提交的引用。由于每个提交都链接到其以前的提交,因此当您指向一个提交时,实际上就是指向该提交的历史记录
在您的示例中,E
是一个合并提交,它将两个分支组合在一起,创建一个历史记录。这意味着在将br2
合并到br1
之后,br1
(现在是对E
的引用)将知道br2
的历史(现在仍然是对D
的引用),因为D
,C
和B
是E
历史的一部分
您的本地
br1
是对E
的引用,而您的远程br1
仍然是对a
的引用。因此,有四个提交(B
、C
、D
和E
)是br1
更新:在我写下这个答案后,海报改变了问题。此更新回答了其余答案未涵盖的一个问题
好的。。现在,奇怪的事情是;现在我称之为“git状态”;上面说我比远程分支快4步。这是怎么发生的?我不应该是唯一一个承诺的人吗
将提交的A
和D
合并到E
后(--no ff
),本地分支在远程分支之前有4个提交(我假设远程分支仍然指向A
)。这是正确的
让我们统计一下本地分支(现在指向E
)上的提交和远程分支(指向A
)上的提交E
显然是其中之一E
作为合并提交,有两个父级:a
(存在于远程分支上)和D
(不存在于远程分支上)。当git
将E
推送到远程服务器时,它需要推送到它的两个父服务器(否则E
在远程服务器上无效)
D
需要C
(其父项)需要B
需要A
<代码>远程服务器上已存在一个,链到此结束<代码>B,C
<
git checkout br1
git merge --no-ff br2
br1 br2
A
| \
| B
| C
| D
| /
E
B <-- br2
|
C
|
D
|
E <-- br1
|
...
git checkout br1
git merge br2
br1 --> B <-- br2
|
C
|
D
|
E
|
...
git checkout br1
git merge --no-ff br2
A <-- br1
|\
| B <-- br2
| |
| C
| |
| D
|/
E
|
...