Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git合并--没有ff生成提交的副本_Git_Merge_Fast Forward - Fatal编程技术网

Git合并--没有ff生成提交的副本

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行为,我想问问这是否正常。现在,情况就是这样(新的提交添加到底部):

现在,当我

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
 |
...