理解Git合并
我知道这个解决方案在某个地方,但我在理解git时遇到了困难 我是一个单一的开发人员,当我使用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 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中分支标签的工作方式:它们指向单个提交,因此标识分支的提示提交
如果commitc3
还不存在,Git会注意到您有这样的安排:
c2 (changes)
|
c1
|
c0 (master)
:
其中提交c0
,这是master
的提示,也可以从c2
访问,这是更改的提示。这意味着commitc0
在两个分支上(注意,这是可达性,即使master
指向某个commitc3
,如上图所示,也是如此)。由于您有这种安排,Git可以“以快进方式向前滑动名称master
”,向上滑动从c2
到c1
并返回到c0
。只要有可能,git merge
的默认操作就是这个实际上根本不是合并的东西。如果master
已经指向newcommitc3
,那是不可能的,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
进行快进合并来避免这种情况,但在大多数情况下,您实际上需要快进合并,因为这会创建更简单、更线性的历史。