GIT分支图管理:创建与合并分支图,解决合并冲突

时间:?2018-01-18阅读:?1780标签:?冲突

分支图在实际中有什么用呢?假设你人有千算开发一期新作用,不过需要两周才能完成。第一周你写了50%的代码,如果立刻提交。出于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支图,就不用怕了。你创建了一期属于你自己的分支图,别人看热闹,还继续在原来的分支图上正常工作,而你在自己的分支图上干活,想提交就提交。直到开发完毕后,再一次性合并到原来的分支图上,既平安,又不影响别人工作。

其他版本控制系统如SVN等都有分支图管理,不过用过之后你会发现,这些版本控制系统创建和切换分支图比蜗牛还慢,简直让人力不胜任承受。结果分支图功能成了摆设,大家都不去用。

但Git的分支图是新鲜的。无论创建,切换和删除分支图,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。


我们创建dev分支图,然后切换到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

git branch命令会列出所有分支图,当前分支图前面会标一期*号。

我们就可以在dev分支图上正常提交,比如对readme.txt做个修定,加网上值得一玩的网游行:

create new branch dev..

然后提交:

$ git add readme.txt
$ git commit -m "create new branch...."
[dev 45ae9a9] create new branch....
 1 file changed, 1 insertion(+)

dev分支图的工作完成,我们就可以切换回master分支图:

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

切换回master分支图后,再查看一期readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支图上。而master分支图此刻的提交点并没有变:


我们把dev分支图的工作成果范文合并到master分支图上:

$ git merge dev
Updating 90bc1f7..45ae9a9
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

git merge命令用于合并点名分支图到当前分支图。合并后,再查看readme.txt的内容,和dev分支图的最新提交是完全一样的。

注意到上面的Fast-forward信息。Git报告我们,这次合并是“快进模式”。也就是直接把master指向dev的当前提交,所以合并速度非常快。

也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

就可以放心地删除dev分支图了:

$ git branch -d dev
Deleted branch dev (was 45ae9a9).

查看branch。就只剩下master分支图了:

$ git branch
* master

合并和删除分支图非常快,所以Git鼓励你使用分支图完成某个任务。合并后再删掉分支图,这和直接在master分支图上工作效果是一样的,但过程更平安。


活动小结

Git鼓励成批使用分支图:

查看分支图:git branch

创建分支图:git branch <name>

切换分支图:git checkout <name>

创建+切换分支图:git checkout -b <name>

合并某分支图到当前分支图:git merge <name>

删除分支图:git branch -d <name>


解决冲突

人生不如意之事十有八九,合并分支图往往也不是一路顺风的。

人有千算新的feature1分支图,继续我们的新分支图开发:

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

 

修定readme.txt最后一行,改为:

create new branch feature1..

 

在feature1分支图上提交:

$ git add readme.txt
$ git commit -m "create new branch feature1 first modify"
[feature1 b4309b0] create new branch feature1 first modify
 1 file changed, 1 insertion(+)


切换到master分支图:

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Git还会自动提示我们当前master分支图比中程的master分支图要超前1个提交。

在master分支图上把readme.txt文件的最后一行改为:

goback master....

提交:

$ git add readme.txt
$ git commit -m "goback master first modify"
[master 0b56936] goback master first modify
 1 file changed, 1 insertion(+)

master分支图和feature1分支图各自都分别有新的提交,变成了这样:


Git力不胜任履行“快速合并”,只能试图把各自的修定合并起来。但这种合并就可能会有冲突,我们小试牛刀:

$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

果然冲突了!Git报告我们。readme.txt文件存在冲突。必须手动解决冲突后再提交。git status也可以报告我们冲突的文件:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

我们可以直接查看readme.txt的内容:

test git modify second
study git
three add
four add modify
five add modify
six add modify
seven add modify
eight add modify ...
create new branch dev..
<<<<<<< HEAD
goback master....
=======
create new branch feature1..
>>>>>>> feature1

Git用<<<<<<<,=======,>>>>>>>标记出不同分支图的内容。我们修定一般来说后保存:

test git modify second
study git
three add
four add modify
five add modify
six add modify
seven add modify
eight add modify ...
create new branch dev..
create new branch feature1..
goback master....

再提交:

$ git add readme.txt
$ git commit -m "fixed conflicts"
[master 0f3d64a] fixed conflicts

master分支图和feature1分支图变成了下图示意所示:


用带耐磨钢板参数的git log也可以看到分支图的合并情况:

$ git log --graph --pretty=oneline --abbrev-commit
*   0f3d64a fixed conflicts
|\
| * b4309b0 create new branch feature1 first modify
* | 0b56936 goback master first modify
|/
* 45ae9a9 create new branch....
* 90bc1f7 test name
* c1bdf43 test commit
* dd34c9a no add but commit,because use other parameter
* 4ed30d1 eight modify dify
* b45ca96 eight modify
* 9332d40 seven modify
* 72c6f9b six modify
* f64b5a0 five modify
* de8fd65 four modify
* 83a4b1e three modify
* 01c05cf two modify
* 1acafa7 first modify
* 09c1bba first git

删除feature1分支图:

$ git branch -d feature1
Deleted branch feature1 (was b4309b0).


活动小结

当Git力不胜任自动合并分支图时,就必须首先解决冲突。再提交,合并完成。

用git log --graph命令可以看到分支图合并图。

站长推荐

1.云服务推荐: 国内主流云投资商,各类云产品的问道,淘宝优惠券怎么设置领取。地址:阿里云腾讯游戏平台官方下载云华为云

链接: http://www.pannellisolari.net/article/detial/371

研究为目的,不存在任何商业策划文案目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

Baidu