Git入门(十五):创建与合并分支

在版本控制中,Git通过维护一个时间线来记录每次的提交操作。这个时间线其实就是一个分支。在Git的默认设置中,只有一条这样的时间线存在,它被称为主分支,或者更常见地,被称为master分支。HEAD在Git中是一个特殊的指针,但它并不直接指向一个提交,而是指向当前活动的分支。一般来说,master分支就是当前的活动分支,因此HEAD实际上是指向master的。这意味着,当我们谈论HEAD时,我们其实是在谈论当前的活动分支以及该分支上的最新提交。

在最初的状态,master分支是一个单一的线性时间线。Git使用master指针来标记最新的提交,而HEAD指针则指向master,这样我们就可以清晰地知道当前的活动分支以及该分支上的最新提交点。

每当进行一次提交操作,master分支都会沿着时间线向前移动一步。这意味着,随着你的不断提交,master分支所代表的时间线(或者说分支线)会逐渐增长。

当你想创建一个新的分支,比如dev时,Git会创建一个新的指针叫做dev。这个新的dev指针会指向与master分支相同的提交点。然后,Git会将HEAD指针重新定位到dev,表示当前的工作分支已经切换到了dev分支上。这样,你就可以在dev分支上进行新的提交操作,而不会影响到master分支上的内容。

现在,当你在工作区进行修改并提交时,这些操作将针对dev分支进行。例如,当你提交一次新的更改后,dev指针会沿着时间线向前移动一步,指向这次新的提交。然而,master指针则保持不变,它仍然指向之前的提交点,表示master分支上的内容没有发生变化。这样,你就可以在dev分支上进行独立的开发工作,而不会影响到master分支的稳定性。

一旦在dev分支上的工作完成,你可能会想要将这些更改合并回master分支。Git提供了几种合并策略,但最简单和最直接的方法是执行一个快进合并(fast-forward merge)。在这种情况下,Git会将master分支的指针直接移动到dev分支的当前提交上,从而完成合并操作。这实际上意味着master分支现在包含了dev分支上的所有更改,并且两个分支的指针都指向相同的提交点。这种合并方式之所以被称为“快进”,是因为它不需要创建任何新的提交或解决任何合并冲突,而是简单地将一个分支的指针移动到另一个分支的当前位置。

Git合并分支的操作通常是非常迅速的。在大多数情况下,它仅仅涉及更改指针的指向,而工作区的内容通常不会发生变化。

完成分支合并后,如果你不再需要dev分支,可以选择将其删除。删除dev分支意味着移除指向该分支的指针。一旦指针被删除,dev分支就不再存在,你将只剩下master分支作为唯一的活跃分支。这种操作在Git中通常是安全的,只要确保没有其他人正在该分支上进行工作,因为删除分支会永久性地丢失其指向的提交历史记录。

下面,我们开始进行实际的Git操作。

首先,我们将创建一个名为dev的新分支,并立即切换到这个分支上。可以使用以下命令:

$ git checkout -b dev  
Switched to a new branch 'dev'

git checkout命令加上-b参数的作用就是创建新分支并立即切换到该分支。这相当于执行了以下两条命令:

$ git branch dev       # 创建新分支  
$ git checkout dev     # 切换到新分支  
Switched to branch 'dev'

接下来,我们使用git branch命令来查看当前所有的分支,以及当前活动的分支。这个命令会列出所有的分支,并在当前活动的分支前面加上一个*号。

$ git branch  
* dev  
  master

现在,我们已经在dev分支上了,可以开始在这个分支上进行工作。例如,我们修改readme.txt文件,添加一行文字:

Creating a new branch is quick.

然后,我们将这个修改提交到Git仓库。

$ git add readme.txt   # 将修改添加到暂存区  
$ git commit -m "branch test"  # 提交修改,并附上提交信息  
[dev b17d20e] branch test  
 1 file changed, 1 insertion(+)

完成dev分支上的工作后,我们可以切换回master分支,看看readme.txt文件的变化。

$ git checkout master  
Switched to branch 'master'

当我们切换回master分支时,会发现刚才在dev分支上做的修改并没有出现在master分支的readme.txt文件中。这是因为这两个分支的提交历史是独立的。dev分支上的提交并没有自动合并到master分支上。

为了让master分支也包含dev分支上的修改,我们需要进行分支合并操作。接下来,我们将演示如何将dev分支合并到master分支。使用以下命令执行合并操作:

$ git merge dev  
Updating d46f35e..b17d20e  
Fast-forward  
 readme.txt | 1 +  
 1 file changed, 1 insertion(+)

git merge命令用于将指定的分支(在此例中为dev)合并到当前分支(在此例中为master)。合并完成后,通过查看readme.txt的内容,你会发现它与dev分支上的最新提交完全一致。

Git输出的Fast-forward信息表明这次合并采用了快进模式,意味着Git只是简单地将master分支的指针移动到dev分支的最新提交上,因此合并过程非常迅速。

虽然快进合并是最常见的合并方式,但Git也支持其他更复杂的合并策略,我们会在后续内容中探讨这些情况。

完成合并后,可以安全地删除dev分支,使用以下命令进行删除:

$ git branch -d dev  
Deleted branch dev (was b17d20e).

删除分支后,通过运行git branch命令查看当前存在的分支,你将只看到master分支:

$ git branch  
* master

由于创建、合并和删除分支在Git中都是非常快速的操作,因此鼓励开发者频繁地使用分支来隔离不同的工作流。在完成特定任务后,可以将这些分支合并回主分支(如master),然后删除它们。这种方法与直接在主分支上工作具有相同的最终效果,但提供了更高的灵活性和安全性。

有的朋友已经发现,git checkout命令在Git中扮演了多个角色,它既可以用于切换分支,又可以用于撤销对文件的修改,这可能会让初学者感到有些困惑。为了解决这个问题,并在语义上更清晰地区分这两个操作,最新版本的Git引入了新的git switch命令专门用于切换分支。

如果你想创建并立即切换到一个新的dev分支,你可以使用以下命令:

$ git switch -c dev

这里,-c选项告诉Git在切换的同时创建新分支。

如果你想直接切换到一个已经存在的分支,比如master,你可以简单地使用:

$ git switch master
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧