Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.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合并_Git - Fatal编程技术网

理解Git合并

理解Git合并,git,Git,我知道这个解决方案在某个地方,但我在理解git时遇到了困难 我是一个单一的开发人员,当我使用git时,其他分支上通常没有变化 以下是我经常做的事情: git branch changes git checkout -b changes /* changes occur */ git commit -m "Changes Occured" /* Changes occur */ git commit -m "More Changes" 在这之后,我的脑海中出现了以下景象: : | c2

我知道这个解决方案在某个地方,但我在理解git时遇到了困难

我是一个单一的开发人员,当我使用git时,其他分支上通常没有变化

以下是我经常做的事情:

git branch changes
git checkout -b changes
/* changes occur */
git commit -m "Changes Occured"
/* Changes occur */
git commit -m "More Changes"
在这之后,我的脑海中出现了以下景象:

  :
  | c2
  | |
  | c1
  | /
master
然而,GitGUI显示了这种可视化

    :
    c2 changes
    |
    c1
    |
  master
然后,我将更改与master合并,如下所示:

git checkout -b master
git merge changes
我有以下设想:

:
| master, changes
|
| \
| c2
| |
| c1
| /
主人

但是,git gui显示:

:
| master, changes
c2
|
c1
|
主人


这是预期的行为吗?还是我做错了什么?

如果主分支上没有其他提交,git将选择快进,而不是进行合并提交。如果您不喜欢这种行为(许多人,像我一样,不喜欢),并且希望保留分支历史记录,您可以使用
git merge\u branch\uuo--no ff
进行合并,以强制git进行合并提交。

git中的分支只不过是其提交的历史记录。他们自己并没有被记录下来,只是指向了其中最新的一次

这就是为什么

    :
    c2 changes
    |
    c1
    |
  master
查看它的显示方式。只有两个提交,c1和c2,并且
更改
指向第二个提交,而
主提交
没有记录的历史记录


合并后,
master
还记录了提交的
c1
c2
。由于在合并发生之前主服务器上没有独占提交,
主服务器
更改
实际上并不相同,即记录相同的提交历史,因为从这两个角度看,相同的提交以相同的顺序发生。也就是说(
c1
c2
),因为合并是通过快进完成的。

您的可视化假设分支
主节点上有更多提交:

c3 (master)
|
| c2 (changes)
| |
| c1
| /
c0
:
或者,等价地,分支名称具有某种永久意义(它们在Git中并不重要:在Git中,只有提交才重要;分支名称在很大程度上只是用来容纳普通人的愚蠢的东西,除了它们在保持提交活动并帮助在不同Git之间来回发送它们方面的一些特殊角色)

还要注意,我还移动了分支标签以指向最新提交(仅限)。这就是Git中分支标签的工作方式:它们指向单个提交,因此标识分支的提示提交

如果commit
c3
还不存在,Git会注意到您有这样的安排:

c2 (changes)
|
c1
|
c0 (master)
:
其中提交
c0
,这是
master
的提示,也可以从
c2
访问,这是
更改的提示。这意味着commit
c0
在两个分支上(注意,这是可达性,即使
master
指向某个commit
c3
,如上图所示,也是如此)。由于您有这种安排,Git可以“以快进方式向前滑动名称
master
”,向上滑动从
c2
c1
并返回到
c0
。只要有可能,
git merge
的默认操作就是这个实际上根本不是合并的东西。如果
master
已经指向newcommit
c3
,那是不可能的,Git将不得不执行并进行“真正的合并”(执行合并操作,并进行合并提交
c4

要强制Git进行合并提交,操作merge-as-a-verb仍然是完全不必要的,Git也不麻烦,您可以使用
Git merge--no ff
。这将创建一个新的合并提交
c3
,并将
master
标签向上移动,指向该合并提交:

c3 (HEAD -> master)
|\
| c2 (changes)
| |
| c1
| /
c0
:

请注意,只有当前分支名称,即标签
master
,才会移动。要注意哪个标签是最新的,我们添加
标题
名称。

旁注:不制作代码段片段,只需将它们缩进四个空格(或高亮显示它们并在浏览器编辑器中按control-K)。是的,这是预期的,只要同时没有提交给master,这称为“快进”合并。您可以通过要求merge命令不使用
--no ff
进行快进合并来避免这种情况,但在大多数情况下,您实际上需要快进合并,因为这会创建更简单、更线性的历史。