前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分支与合并@基础

分支与合并@基础

作者头像
用户3004328
发布2018-09-06 16:50:47
5830
发布2018-09-06 16:50:47
举报
文章被收录于专栏:增长技术增长技术

一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫”experimental”的分支:

代码语言:javascript
复制
$ git branch experimental

如果你运行下面这条命令:

代码语言:javascript
复制
$ git branch

你会得到当前仓库中存在的所有分支列表:

代码语言:javascript
复制
 experimental
*master

“experimental”分支是你刚才创建的,”master”分支是Git系统默认创建的主分支。星号(*)标识了你当前工作在哪个分支下,输入:

代码语言:javascript
复制
$ git checkout experimental

切换到”experimental”分支,先编辑里面的一个文件,再提交(commit)改动,最后切换回”master”分支。

代码语言:javascript
复制
(edit file)
$ git commit -a
$ git checkout master

你现在可以看一下你原来在”experimental”分支下所有的修改还在不在;因为你现在切换回了”master”分支,所以原来那些修改就不存在了。

你现在可以在”master”分支下再做一些不同的修改:

代码语言:javascript
复制
(edit file)
$ git commit -a

这时,两个分支就有了各自不同的修改(diverged);我们可以通过下面的命令来合并”experimental”和”master”两个分支:

代码语言:javascript
复制
$ git merge experimental

如果这两个分支间的修改没有冲突(conflict),那么合并就完成了。如果有冲突,输入下面的命令就可以查看当前哪些文件产生了冲突:

代码语言:javascript
复制
$ git diff

当你编辑了有冲突的文件,解决了冲突后就可以提交了:

代码语言:javascript
复制
$ git commit -a

提交(commit)了合并的内容就可以查看一下:

代码语言:javascript
复制
$ gitk

执行了gitk会有一个图形界面显示项目的历史。 这时你就可以删除掉你的”experimental”分支了(如果愿意):

代码语言:javascript
复制
$ git branch -d experimental

git branch -d只能删除那些已经被当前分支合并的分支。如果你要强制删除某个分支的话就用git branch -D;下面假设你要强制删除一个叫”crazy-idea”的分支:

代码语言:javascript
复制
$ git branch -D crazy-idea

分支是很轻量级且容易的,这样就很容易来尝试它。

如何合并

你可以用下面的命令合并两个分离的分支:git merge:

代码语言:javascript
复制
$ git merge branchname

这个命令把分支”branchname”合并到了当前分支里面。如有冲突(冲突–同一个文件在远程分支和本地分支按不同的方式被修改了);那么命令的执行输出就像下面一样

代码语言:javascript
复制
$ git merge next
    100% (4/4) done
Auto-merged file.txt
CONFLICT(content):Merge conflict in file.txt
Automatic merge faile;fix conflicts and then commit the result.

在有问题的文件上会有冲突标记,在你手动解决完冲突后就可以把此文件添加到索引(index)中去,用git commit命令来提交,就像平时修改了一个文件一样。

如果你用gitk来查看commit的结果,你回看到它有两个父分支:一个指向当前的分支,另一个指向刚才合并进来的分支。

解决合并中的冲突

如果执行自动合并并没有成功的话,git会在索引和工作树里设置一个特殊的状态,提示你如何解决合并中出现的冲突。

有冲突(conflicts)的文件保存在索引中,除非你解决了问题了并且更新了索引,否则执行git commit都会失败:

代码语言:javascript
复制
 $ git commit
 file.txt:needs merge

如果执行git status会显示这些文件没有合并(unmerged),这些有冲突的文件里面会添加像下面的冲突标识符:

代码语言:javascript
复制
<<<<<<< HEAD:file.txt
Hello world
=======
Goodbye
>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt

你所需要做的就是编辑解决冲突,(接着把冲突标识符删掉),再执行下面的命令:

代码语言:javascript
复制
$ git add file.txt
$ git commit

注意:提交注释里面已经有一些关于合并的信息了,通常是用这些默认信息,但是你可以添加一些你想要的注释。

上面这些就是你要做一个简单合并所要知道的,但是git提供更多的一些信息来帮助解决冲突。

##撤销一个合并

如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到之前的状态:

代码语言:javascript
复制
$ git reset --hard HEAD

或者你已经把合并后的代码提交,但还是想把它们撤销:

代码语言:javascript
复制
$ git reset --hard ORIG_HEAD

但是刚才这条命令在某些情况会很危险,如果你把一个已经被另一个分支合并的分支给删除了,那么以后在合并相关的分支时会出错。

快速向前合并

还有一种需要特殊对待的情况,在前面没有提到。通常,一个合并会产生一个合并提交(commit),把两个父分支里的每一行内容都合并进来。

但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit)都已经存在另一个分支里了,git就会执行一个”快速向前(fast forward)“操作;git不创建任何新的提交(commit),只是将当前分支指向合并进来的分支。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何合并
  • 解决合并中的冲突
  • 快速向前合并
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档