参考https://zhuanlan.zhihu.com/p/41344866
分支
在开发的过程中有主干线和分支线,相互之间的代码开发不受影响。
一个实际的例子。
- 假设某软件的1.0版本完成了,马上投入了1.1版本的开发中
- 过了一段时间,1.1版本开发了一部分(基于1.0),但是有用户反馈1.0版本有bug,那么就需要修复1.0版本中的bug,同时重新发布1.0版本
- 如果在现行1.1版本上修改,那么更新的版本就会带有1.1的特性
- 使用分支,只需要在1.0发布时的版本建立一个分支,我们在主干线上开发1.1版本,1.0发现bug,在分支上进行修改并发布出去。并且把修改时候没有bug的代码合并到主干线上,这样就发布没有bug的1.0,又使得正在开发的1.1版本避免了1.0的bug。
git branch
可以查看可以查看分支。在gitbash中显示的master
就是我现在所在的分支,这块就是主干线。
如果要添加分支,则在git branch
之后加上新的分支名就可以添加新的分支。git brach -D [分支名]
则是删除了分支。注意删除分支的时候要先退回的master分支。
checkout
命令加上分支名,就可以进入指定的分支。分支和主干线是互不影响的,使用merge命令可以进行合并操作。
例子:
1 | git checkout master //进入主干线 |
与远程版本协作
git的最大用途就是可以进行团队合作开发,每个人电脑上都有一份代码,团队的某个成员完成自己的一部分任务的时候,就将代码提交到服务器,其他人只需要将服务器上的代码同步到本地,就能保证大家的代码相同,再进行开发就可以了。
git clone
:将远程仓库的代码下载到本地,自己进行一些修改和提交(commit)之后,可以使用push命令
git push origin master
: origin指远程版本库的Git地址,master执行的是哪一个分支
git fetch origin master
:远程版本库上的修改同步到本地用fetch命令。执行之后就把远程版本库的代码同步到本地了,但是不会合并,而是存放在origin/master分支上面,可以用diff查看修改了什么地方git diff origin/master
。之后可以用merge命令进行合并。
git pull origin master
则是把fetch和merge两步融合为了一个命令。
远程仓库与本地仓库实验
在github中创建新的repository获得Git地址
Git_remote
在本地创建git仓库
1
2
3mkdir local_dir //创建路径
cd local_dir
git init //初始化git本地仓库将两个仓库进行连接
git remote add Git_remote
本地创建文件,并提交
1
2
3
4
5touch v1code.txt
git add . //将文件夹中的所有文件加入
git commit -m "commit v1code.txt" //向当前分支提交代码
git branch //查看当前分支(本地)
git branch -a //查看所有分支(远程)将本地仓库的代码提交到远程
1
2git push origin master //将代码推送到远程master
git branch -a此时可以发现如下:
显示当前远程仓库只有一个分支master。当前处于本地master分支创建分支
1
2git branch version1.0
git checkout version1.0 //进入version1.0分支注意此时version1.0分支包含与master分支相同的文件
将version1.0分支推到远程分支1
2git push origin version1.0
git branch -a
此时注意我们是把version1.0的版本推送到了origin/version1.0中在version1.0中进行相应的更改,添加文件test1.txt
查看不同分支
将version1.0推到origin/version1.0中
此时可以发现github repository上出现了两个分支,可以切换到不同分支进行查看在本地重新创建一个仓库,clone远程仓库,模拟多人操作。
1
2
3
4
5
6
7
8//方法1 clone
mkdir git_branch_learn_commiter2
git clone Git_remote ./git_branch_learn_commiter2
//此时发现只clone了origin/master分支,对应下图
//想要将version1.0拉下来
git branch origin/version1.0 //切换到origin/version1.0分支
git branch version1.0 //在本地仓库中创建branch,完全复制了version1.0的东西
//注意当你git checkout一个远程仓库的时候,会跳出提示,提醒你处于”detached HEAD“状态,这个时候你可以在这个分支中实验,但并不会被提交更改1
2
3
4
5
6
7
8
9
10//方法2 创建本地仓库并连接
git remote add Git_remote //出现报错, 查看报错信息
git remote add -f <name> Git_remote //尝试将<name>设为name之后发现如下图
//所以这个是设置了远程仓库,那么就依照远程仓库进行本地仓库分支更新
git checkout name/master
git branch master
git checkout name/version1.0
git branch version1.0
//这里同样出现了”detached HEAD“状态
//这时候查看会发现没有出现origin分支commiter1在version1.0上开发之后,与master合并(在version1.0上添加initial_from_c1.txt文件)
1
2
3
4
5
6
7
8
9
10
11git checkout version1.0 //切换到version1.0分支
git merge master version1.0 //这时候发现master出现了initial_from_c1.txt文件,但是没有test1.txt文件。同时提示already updated,说明并没有进行合并操作
git checkout master //切换到master
git merge master version1.0 //发现进行了text1.txt的合并
//所以这个时候我们添加的initial_from_c1.txt只是存在于dir中,并没有添加进分支。在此时我们push 远程master
git push origin master //此时我们本地master,push到远程master
git checkout version1.0
git add .
git commit -m "commiter 1 write something"
git push origin version1.0 //version1.0更改并推向远程分支commiter2进行自己的开发
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25//此时commiter2的origin与github仓库上的并不同步,可以查看发现在master分支中只有v1code.txt
//我们对当前远程仓库进行一下更新
git fetch origin
//会看到提示说”Your branch is behind origin/master by 1 commit“.就是说本地仓库master和origin/master的当前版本不一致,这个没问题这个就是我们想要的
git pull //将origin/master拉到本地仓库中,其实就是merge origin/master master
//我们在version1.0分支下添加test_2.txt,并提交
git checkout version1.0
touch test_2.txt
git add .
git commit -m "commiter2 add test_2.txt"
//我们创建version1.2, 并推导远端
git branch version1.2 //内容与version1.0完全一样
git push origin version1.2
//merge origin/version1.0和version1.0
//这时候你就发现git pull搞不清楚你想要merge哪个分支,提示你git pull <remote> <branch>
git pull origin version1.0 //merge的时候会发现要填写一个为什么需要的文档
//现在看version1.0
// -initial_from_c1.txt -test1.txt -test_2.txt -v1code.txt
//而version1.2
// -test1.txt -test_2.txt -v1code.txt
//将1.2和1.0合并
git merge version1.0 version1.2原始创建者将所有的版本汇聚成一个master主分支
1
2
3
4
5git fetch //将远程分支进行更新
git checkout version1.0
git pull origin version1.2
git checkout master
git merge version1.0 master