欢迎大家来到IT世界,在知识的湖畔探索吧!
由于 Git 是一种分布式版本控制系统 (DVCS),过程中会不断的进行分支与合并,无论是有意的合并 (git merge) 或无意的合并 (git pull),总之使用 Git 版控分支与合并的动作确实经常发生。
关于合并的基本观念
当你在 Git 工作目录下建立分支时,可以让你的系统依据不同的需求分別进行开发,又不互相影响。例如你原本稳定的系统可以放在 master 分支中进行开发,而当要修正错误时则额外建立一个bugfix分支来改正软件错误,等 Bugs 修正后,再通过合并的方式将 bugfix 分支上的变更重新套用到 master 上面,这就是一种主要的使用场景。
一般来说,大家都是以一个主要或预设分支进行开发 (master),然后再依据需求建立分支 (bugfix),最后则是将两个分支合并成一个。事实上,执行合并动作时,是将另一个分支合并回目前分支,然后再手动将另一个分支给移除,这样才符合两个分支合并成一个的概念。
实际上,也经常有机会将三个、四个或更多的分支合并到其中一个分支。例如你除了主要分支 (master) 外,还额外建立了除错用的分支 (bugfix) 与新增功能 (feature) 的分支,当开发到一定程度后,你可以决定要不要将这个两个分支一起合并回主要分支 (master)。
在 Git 使用合并时,有一个重要的观念是合并的动作必须发生在同一个仓库中。在任何一个 Git 仓库中,都必须存在一个 Initial Commit (初始版本),而所有其他版本都会跟这个版本有关系,这个关系我们称为在分支线上的可追踪(the tracked object on the branch heads),所以你不能将一个仓库的特定分支合并到另一个毫不相干的仓库的某个分支里。
合并的时候,如果两个分支当中有修改到相同的文件,但只要修改的行数不一样,Git 就会自动帮你套用 / 合并这两个变更。但如果就这么刚好,你在两个分支里面改到同一个文件的同一行,那么在合并的时候就会引发冲突事件。当合并冲突发生时,Git 并不会帮你决定任何事情,而是将解决冲突的工作交给你来负责,且这些发生冲突的文件也都会被标示为 unmerged 状态,合并冲突后你可以用 git status 指令看到这些状态。
体验一场成功的合并
简单来说,成功的合并就是没有发生冲突的合并。用一个简单的例子说明合并的过程与指令的用法:
mkdir git-merge-demo cd git-merge-demo git init echo . > a.txt git add . git commit -m "Initial commit (a.txt created)" echo 1 > a.txt git add . git commit -m "Update a.txt!"
欢迎大家来到IT世界,在知识的湖畔探索吧!
接着我们通过 git checkout -b feature 建立一个 feature 分支,并同时把工作目录给切换到 feature 分支进行开发,然后建立一个内容为 2 的 b.txt 文件:
欢迎大家来到IT世界,在知识的湖畔探索吧!git checkout -b feature git branch echo 2 > b.txt type b.txt git add . git commit -m "Add b.txt!"
注意:在切换分支之前,请随时查看并保持工作目录的状态是干净的,不要有任何文件异动中的状态。
以下是两个分支的内容:
- • 主要分支:master:拥有 a.txt 其内容为 1
- • 功能分支:feature (目前所在分支),拥有 a.txt 其内容为 1 (此文件是从 master 分支继承过来的) 还有b.txt其内容为 2。
现在要做 3 件事:
- 1. 将工作目录切换回 master 主要分支
- 2. 将 a.txt 的内容新增一行 NEW LINE 在第二行 (第一行不动)
- 3. 将 a.txt 的异动加入索引,并commit版本
git status git checkout master echo "NEW LINE" >> a.txt type a.txt git status git add . git commit -m "Update a.txt: append NEW LINE"
当下两个分支的内容:
- • 主要分支:master (目前所在分支),拥有a.txt其内容有两行,第一行为 1,第二行是 NEW LINE,这里没有 feature 分支的变更,也就是没有 b.txt 文件。
- • 功能分支:feature,拥有 a.txt 其内容为 1 (这是从 master 分支继承过来的,在 feature 没动过)还有 b.txt 其内容为 2 (这是 feature 新建立的文件)。
用 SourceTree 可以查看较为漂亮的 commit graph (版本图):
由于两个分支都有在建立 feature 分支后都做过异动,不过你可能会发现到,这两个分支当中,从分支点开始,所做的修改并没有互相冲突,只要是这种状況,合并并不会发生问题。接下来我们就来执行合并动作 (git merge)。
- 1. 合并之前,先看清楚自己在哪个分支
- 2. 合并之前,请确保工作目录是干净的
- 3. 合并时请用 git merge [另一个分支] 来将另一个分支的变更合并回来
- 4. 合并成功后,可以利用 git log 查看版本记录,可以发现 合并的过程会自动建立一个新版本
欢迎大家来到IT世界,在知识的湖畔探索吧!git branch git status git merge feature git log --oneline
看看合并后的分支状況,用 SourceTree 的 commit graph 来看:
最后来看看合并后的文件内容,确实如我们预期的把两个分支中的变更都给合并了:
这就是一场成功的合并
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/81910.html