Git分支操作
均在git bash中进行操作。事先建好本地工作库
1.什么是分支
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
2. 分支的好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
3. 分支的操作
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
3.1 查看分支
- 基本语法
git branch –v
- 实例
L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/Test/gitTest (master)
$ git branch -v
* master a0bd3a9 second commit
3.2 创建分支
- 基本语法
git branch 分支名
- 实例
L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/Test/gitTest (master)
$ git branch hot-fix
L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/Test/gitTest (master)
$ git branch -v
hot-fix a0bd3a9 second commit
* master a0bd3a9 second commit
3.3 切换分支
- 基本语法
git checkout 分支名
- 实例
L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/Test/gitTest (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/Test/gitTest (hot-fix)
$ git branch -v
* hot-fix a0bd3a9 second commit
master 6752aac hot-fix first commit
3.4 修改分支
L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/Test/gitTest (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/Test/gitTest (hot-fix)
$ vim hello.txt
L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/Test/gitTest (hot-fix)
$ git add hello.txt
L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/Test/gitTest (hot-fix)
$ git commit -m "hot-fix second commit right" hello.txt
[hot-fix 8d3ba97] hot-fix second commit right
1 file changed, 2 insertions(+)
此时当处在hot-fix分支时,工作区的hello.txt文件为本次修改后的结果:
若将分支切换回master时,工作区的hello.txt文件结果仍然保持修改前的原样:
不同的分支保存为不同的结果。
3.5 合并分支
- 基本语法
git merge 分支名
- 实例
在master分支上合并hot-ffix分支
L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/Test/gitTest (hot-ffix)
$ git checkout master
Switched to branch 'master'
M test.txt
L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/Test/gitTest (master)
$ git merge hot-ffix
Already up to date.
3.6 产生和解决冲突
- 冲突产生的表现:后面状态为MERGING
- 冲突产生的原因:
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码内容。(只有在同一个位置的字符串上出现的增加和删减才不会产生冲突,在不同位置增加的内容也会产生冲突) - 查看状态(检测到有文件有两处修改)
- 实例
在master分支的hello.txt文件中倒数第二行加上master test
在hot-fix分支的hello.txt文件中最后一行加上hot-fix test
此时在master分支上合并hot-fix分支将显示失败。
1. L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/git-demo (hot-fix)
2. $ git checkout master
3. Switched to branch 'master'
4.
5. L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/git-demo (master)
6. $ git merge hot-fix
7. Auto-merging hello.txt
8. CONFLICT (content): Merge conflict in hello.txt
9. Automat-ic merge failed; fix conflicts and then commit the result.
10.
11. L@DESKTOP-C3ML9EI MINGW64 /e/Git-space/git-demo (master|MERGING)
12. $ git status
13. On branch master
14. You have unmerged paths.
15. (fix conflicts and run "git commit")
16. (use "git merge --abort" to abort the merge)
17.
18. Unmerged paths:
19. (use "git add <file>..." to mark resolution)
20. both modified: hello.txt
21.
22. no changes added to commit (use "git add" and/or "git commit -a")
在同一个文件中发生冲突,需要手动修改合并。通过vim hello.txt打开文件,如图,手动进行修改并保存,将显示冲突部位的标识符也删除。
修改完之后再add和commit。但是手动修改后,不能识别修改的文件,因此commit的时候不能带文件名。
4. 创建分支和切换分支图解
Master、hot-fix其实都是指向具体版本记录的指针。当前所在的分支,其实是由HEAD决定的。所以创建分支的本质就是多创建一个指针。
HEAD如果指向master,那么我们现在就在master分支上。
HEAD如果指向hot-fix,那么我们现在就在hot-fix分支上。
所以切换分支的本质就是移动HEAD指针。