Git基础(三)分支管理
总结
本节我们所要使用到的命令有:
- git branch
- git checkout
- git commit
- git merge
1. 分支创建
这会以当前仓库中的最后一次提交版本(最新版本)为基础创建一个分支
注:在分支切换时,要注意将当前分支的任务都更新/提交为最新版本,否则会将当前版本上的一些改动携带到另一个分支(除非目的就是想将当前已做的修改直接创建一个新分支并切换到新分支上)
- 使用
git branch <branch-name>
创建分支
注:该命令仅仅创建一个新分支,并不会自动切换到新分支中去
# git branch dev
C:\Users\zsf\Desktop\ss>git branch
* master
C:\Users\zsf\Desktop\sd>git branch dev
C:\Users\zsf\Desktop\sd>git branch
dev
* master
- 使用
git checkout -b <branch-name>
创建并切换分支
注: 想要新建一个分支并同时切换到那个分支上,你可以运行一个带有 -b 参数的 git checkout 命令。它是git branch和git checkout两条命令的简写
# git checkout -b prod
C:\Users\zsf\Desktop\sd>git checkout -b fix
Switched to a new branch 'fix'
C:\Users\zsf\Desktop\sd>git branch
dev
* fix
master
- 使用
git log
查看各个分支的提交版本
# git log --oneline
C:\Users\zsf\Desktop\sd>git log --oneline
22ed852 (HEAD -> master) master comit
cc0c263 first commit
2. 分支切换
切换分支会将当前的文件还原回目的分支的版本
注:在分支切换时,要注意将当前分支的任务都更新/提交为最新版本,否则git会禁止切换分支
- 使用
git checkout <branch-name>
切换分支
# git checkout dev
C:\Users\zsf\Desktop\sd>git checkout dev
Switched to branch 'dev'
错误示例:可以看到,如果不commit,就会切换分支失败
# 存在修改过文件,未git add
C:\Users\zsf\Desktop\sd>git status -s
M a.txt
C:\Users\zsf\Desktop\sd>git checkout master
error: Your local changes to the following files would be overwritten by checkout:
a.txt
Please commit your changes or stash them before you switch branches.
Aborting
C:\Users\zsf\Desktop\sd>
# 存在git add过的文件,未git commit
C:\Users\zsf\Desktop\sd>git add a.txt
C:\Users\zsf\Desktop\sd>git status -s
M a.txt
C:\Users\zsf\Desktop\sd>git checkout master
error: Your local changes to the following files would be overwritten by checkout:
a.txt
Please commit your changes or stash them before you switch branches.
Aborting
有一些法可以绕过这个问题(即,保存进度(stashing) 和 修补提交(commit amending))
3. 分支合并
- 使用
git merge branch-name
合并分支
# 切换到master分支
git checkout master
# 将fix分支合并到当前分支
git merge fix
补充:合并分支的三种情况
- fast-forward 直接快进(不会自动创建新的commit)
- thirty-party automatic commit 自动合并提交(会自动创建新的commit)
- conflict merge 冲突合并(需要手动进行commit)
- fast-forward 直接快进(不会自动创建新的commit)
在合并的时候,你应该注意到了"快进(fast-forward)"这个词。 由于当前 master 分支所指向的提交是你当前提交(有关 hotfix 的提交)的直接上游,所以 Git 只是简单的将指针向前移动。 换句话说,当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。
git branch -d hotfix
关于这个紧急问题的解决方案发布之后,你准备回到被打断之前时的工作中。 然而,你应该先删除 hotfix 分支,因为你已经不再需要它了 —— master 分支已经指向了同一个位置。
注:当 master 分支的问题处理完后,此时iss53分支上并没有包含 master上修改的代码,如果你需要拉取 hotfix 所做的修改,你可以使用 git merge master 命令将 master 分支合并入 iss53 分支,或者你也可以等到 iss53 分支完成其使命,再将其合并回 master 分支
- thirty-party automatic commit 自动合并提交(会自动创建新的commit)
你的开发历史从一个更早的地方开始分叉开来(diverged)。 因为,master 分支所在提交并不是 iss53 分支所在提交的直接祖先,Git 不得不64做一些额外的工作。 出现这种情况的时候,Git 会使用两个分支的末端所指的快照( C4 和 C5 )以及这两个分支的工作祖先(C2),做一个简单的三方合并。
和之前将分支指针向前推进所不同的是,Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它。 这个被称作一次合并提交,它的特别之处在于他有不止一个父提交。
需要指出的是,Git 会自行决定选取哪一个提交作为最优的共同祖先,并以此作为合并的基础;
既然你的修改已经合并进来了,你已经不再需要 iss53 分支了。 现在你可以在任务追踪系统中关闭此项任务,并删除这个分支。
git branch -d iss53
- conflict merge 冲突合并(需要手动进行commit)
如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。
① 在你解决了所有文件里的冲突之后,对每个文件使用 git add 命令来将其标记为冲突已解决。 一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。
②如果你对结果感到满意,并且确定之前有冲突的的文件都已经暂存了,这时你可以输入 git commit 来完成合并提交
4. 查看分支
- 使用
git branch
查看所有分支
C:\Users\zsf\Desktop\sd>git branch
* fix
master
- 使用
git branch -v
查看每个每个分支的最后一次提交
C:\Users\zsf\Desktop\sd>git branch -v
* fix d5a4b4d success
master 22ed852 master comit
- 使用
git branch --merged/--no-merged
查看已经合并或尚未合并到当前分支的分支
C:\Users\zsf\Desktop\sd>git branch --merged
* fix
master
C:\Users\zsf\Desktop\sd>git branch --no-merged
<empty>
5. 分支删除
- 使用
git branch -d branch-name
删除分支
# git branch -d dev3 删除dev3
C:\Users\zsf\Desktop\sd>git branch -d dev3
Deleted branch dev3 (was ce684e9)
# git branch
- 使用
git branch -D branch-name
强制删除分支
C:\Users\zsf\Desktop\sd>git branch -d dev3
error: The branch 'dev3' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev3'.
C:\Users\zsf\Desktop\sd>git branch -D dev3
Deleted branch dev3 (was 8b9225c).