date:
updated:

重新认识git【其五】分支


git的分支管理是git区分于其他版本管理系统的最重要的特性之一, 创建分支仅仅只需要创建一个指针, 而不需要复制文件, 大大方便了大型项目的管理。

假设你要在issue分支上修复一个问题

第一步 创建分支

使用 -b 参数快速创建分支并切换到该分支上

1
2
3
4
5
git checkout -b issue # 创建 issue 分支
=
git branch <branch name> # 创建分支
&&
git checkout <branch name> # 切换分支

创建分支后我们在这个分支上修复了某个bug

第二步 合并分支

修复完 bug 当然要合并到 master 分支上面啦, 注意分支的主次关系

1
2
git checkout master # 切换到主分支
git merge issue # 与issue分支合并

发生冲突

并不是所有合并都一帆风顺, 如果你的 master 分支与 issue 分支对同一个文件有不同的修改, 则会产生冲突, 需要手动合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ git merge issue # 尝试合并
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result. # 发生冲突, 自动合并失败

$ git status # 查看状态
On branch master
You have unmerged paths. # 存在未合并的路径
(fix conflicts and run "git commit")

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

both modified: index.html # 你要合并的两个分支都修改了这个文件, 导致了冲突

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

使用最原始的方法解决冲突

git 会为你的冲突文件打上标记

1
2
3
4
5
6
7
<<<<<<< HEAD:index.html # 这是当前分支的内容
<div id="footer">contact : email.support@github.com</div>
======= # 这是分界线
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html # 上面是要合并的分支的内容

只需要把<<< === >>> 这些标记去除, 保留你真正需要的部分, git add 即可解决冲突

1
2
3
4
5
6
7
8
9
10
git add index.html 

git status # 再次查看状态
On branch master
All conflicts fixed but you are still merging. # git提示你冲突已经解决, 但是合并还没结束
(use "git commit" to conclude merge)

Changes to be committed: # 你需要 commit 来完成最终的合并操作

modified: index.html

当然, 这种原始的方法不容易操作, 因此也有不少可视化的工具可以帮助我们解决冲突, 比如idea内置的git插件, git mergetool 获取图形化解决方案的提示

第三步 删除分支

1
git branch -d issue53 # 当合并完成后, 可以删除issue分支

第四步 把这个issue的修改同步到dev分支

假设我们平时工作的分支是 dev 分支, 在 master 分支上修复的 bug 应该怎样同步到 dev 分支呢?

1
2
git checkour dev # 切换到开发分支
git merge master # 合并刚刚修复的bug

当然, 这个bug对你开发没有影响的话, 也可以等 dev 分支要合并的时候直接将 dev 合并到master, 还省下一步

git branch 查看所有分支

1
2
3
git branch # 查看所有分支
git branch --no-merged # 查看未合并的分支(基于当前分支)
git branch --no-merged master # 查看未合并的分支(基于master)

本文参考文章


← Prev 重新认识git【其六】变基 | 重新认识git【其四】打标签 Next →