3、Git 的分支
分支就是,在版本控制过程中,同时推进多个任务,为每个任务就能创建任务的单独分支。使用分支就意味着把自己的开发工作从主线中分离出来,不会影响主线的功能,在有需要的时候将分支的代码提交给主线进行主线程序的版本迭代。分支可以理解为程序的副本,你只是在操作副本进行功能添加修改等操作。实际上也是通过指针实现的。
1、分支的特性
- 在主分支上,发布的程序一开始在运行着
- 但是有一天出现了一个需求,需要加一个蓝色的背景和添加一个小游戏
- 就能让员工从主分支上拉取一份代码,一个负责做背景,一个负责做游戏,主分支照样跑
- 背景做好了,测试没问题了,就跟主分支合并发布主分支版本1.0.1
- 主分支程序跑着跑着出现了问题,就拉一份代码下来,去紧急处理区做处理
- 然后把做好的没有异常的跟住分支提交,更新,分布版本1.1.0
- 到后面了,游戏分支也做好了,测试好了,就再跟主分支提交合并,发布大更新版本2.0.0
命令 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
2、分支的创建 git branch xx
3、分支的转换 git branch xx
-
首先
git branch hot-fix
创建一个热修复分支,会没有什么提示 -
git branch -v
查看所有分支,就会看见两个分支 -
git checkout hot-fix
切换到 hot-fix 分支上-
在热修复分支上修改 hello.txt 文件,并查看
git status
当前分支是 hot-fix On branch hot-fix 发现了不受监控的修改 Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: test.txt
-
git add hello.txt
添加到当前分支的暂存区 -
git commit hello.txt -m "hot-fix first commit" hello.txt
提交到 hot-fix 分支仓库,会生成一个版本号,再git status
分支名、版本号、提交时的版本信息 [hot-fix d518204] hot-fix first commit 我做了两行修改,就有两行插入、两行删除 1 file changed, 2 insertions(+), 2 deletions(-)
-
再去文件夹中看 hello.txt 内容变了,HEAD 文件内容也变了,refs->heders 里面多了一个文件hot-fix,文件内容是修改后的文件的版本号
-
在 hot-fix 分支上
cat hello.txt
,再切换到master分支上
-
-
在master分支上
cat hello.txt
是不一样的。一个是已经修改提交过的版本,一个是之前的那个版本
4、分支的合并 git merge 分支名
-
这个命令使用时,是把命令里面的分支内文件修改内容合并到当前所在的分支的文件中,分支不会消失
-
切换回master分支
-
使用命令
git merge 分支名
把hot-fix分支合并到master分支上正在用hot-fix的文件提交结果代替主分支上的文件提交结果,后面代替前面 Updating 0b1dd9b..d518204 修改的文件名,修改的总记录数,两行删除两行插入 Fast-forward test.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
-
cat hello.txt
就会发现内容变成了在 hot-fix 分支上修改提交的结果
-
这是正常合并
5、解决代码合并冲突问题
产生分支的原因:存在两个分支对于同一个文件做了两个不同的修改方案,工具无法替我们决定使用哪一种修改的时候就由人为确定使用哪一个版本的修改。
-
首先在主分支上修改 hello.txt 文件,然后
git add hello.txt
、git commit -m "master commit" hello.txt
后 -
切换分支
git checkout hot-fix
,再同样对 hello.txt 文件修改,之后,再git add hello.txt
、git commit -m "hot-fix commit" hello.txt
后 -
切换到 master 分支
git checkout master
,进行分支合并git merge hotfix
就会出现错误-
CONFLICT (content): Merge conflict in test.txt Automatic merge failed; fix conflicts and then commit the result. 说是合并内容冲突,不能合并
而且工作空间后面会出现
(master|MERGING)
分支名和正在合并,表示分支合并还没做好。而且
git status
会发现说你有未融合的分支 You have unmerged paths. 在提交时出现问题 (fix conflicts and run "git commit") 使用 git merge --abort 命令停下合并 (use "git merge --abort" to abort the merge) 未合并的分支的原因是因为 都修改了 test.txt Unmerged paths: (use "git add <file>..." to mark resolution) both modified: test.txt no changes added to commit (use "git add" and/or "git commit -a")
-
这时
cat hello.txt
会发现<<<<<<< HEAD hello hello heihei ======= hello haha hello >>>>>>> hot-fix <<<<到=====里面的是当前分支做的修改提交,=====到>>>里面是hot-fix分支做的提交
-
那么就能 直接手动修改文件内容,自己决定要留那一部分,
vim hello.txt
,把多余的符号删了,就像修改文本一样,留下想要的修改,然后 Esc -> :wq -
然后
git add hello.txt
、git commit "merge commit" hello.txt
.完成手动合并提交 -
其实就是git把你两次的修改给你放那里,你愿意怎么改就改不改也行,也能提交,改了就算是合并了,手动提交,也是提交
-
但是呢,他会报错说是
fatal: cannot do a partial commit during a merge.
不能在合并期间提交,所以需要需改一下提交的命令git coomit -m "merge commit"
后面不跟文件名,就能成
-
-
然后就合并好了
6、Git 的团队协作机制
Git是一个分布式的版本控制系统
- 首先一个团队产出了一个程序,并把程序发布在远程服务器上
- 有团队内部人员和被团队认可的人员可以对这个程序代码拉取【clone】至本地做版本控制和功能开发
- 功能做好了后,这些人把代码版本提交到本地库,再提交【Push】到远程版本控制中心。
- 但是经过这些努力功能还是不能达到预期效果,那么就需要把远程版本控制中心的文件作为一个分支交给【fork】别人
- 其他的团队先把代码拉取【clone】到本地,然后做功能开发,做好了后,做好本地版本控制,然后提交代码到他们团队的远程版本控制中心
- 然后再把文件提交【Pull request】给程序原本的开发团队
- 原来的开发团队接受到其他团队的推送请求,先是 审核 ,等到确定功能达到要求,才会 merge 到自己团队的远程控制中心
- 等合并好了,本团队的人就能拉取【clone】代码,到本地做版本控制。
其实版本控制都是在本地做,功能开发也是在本地