Git 的入门教程<四>
5> git分支的管理
git默认的有一个主分支叫做master,随着每次的提交,master主分支会形成一条线,而HEAD是指向当前的主分支master的,一般来说,我们将master分支作为向外发布的主分支,而开发的时候会新建一个分支或者好多分支,作为开发分支,等到开发分支完成,在一次性的想master主分支上合并,并进行发布。
5.1 git 分支的创建、删除、切换
git branch dev //创建分支 git checkout dev //切换分支 git checkout -b dev //创建并切换分支 git branch //查看当前仓库的分支 git branch -d dev //删除dev分支
git checkout -b dev == git branch dev + git checkout dev
查看所有分支:
git branch
在之前的git文件夹中,打开bash,创建并切换到dev 分支上,增加一个branch文件,并提交到dev的仓库。
此时ls后,会看到branch 和readme.txt两个文件,然后我们切换到master分支看到并没有branch,那么dev做出修改后,如何提交到主分支哪?
5.2 git 分支的合并,整合
git merge dev //合并dev分支到主分支
此时ls后,在主分支master下就能看到branch文件。
git merge dev 之后,看到 提示
Fast-forward
这个的意思就是快速合并,意思就是将当前指向master的HEAD指针,直接移动到dev上。这样做的后果就是查看历史的时候,看不到这次的合并信息。
而如果合并的时候,添加 --no-ff 参数则会保留下合并的信息,意思就是禁止Fast-forward 模式
git merge dev --no-ff
两次查看历史的比较:
git merge dev
git reset --hard HEAD^ git merge dev --no-ff
说到合并,还有一种情况,就是两个人操作dev分支,一个对dev分支下的branch文件做出了修改,并上传合并到主分支,另一个也同样做了修改,另一个进行上传的时候,会是什么情况哪?
首先创建另一个分支dev_other,并修改branch文件内容,提交修改内容,并进行合并。
git checkout -b dev_other echo "hello,dev_other" >> branch git add branch git commit -m "dev_other"
然后切换回dev分支,并修改branch文件内容,提交修改内容,并进行合并。
git checkout dev echo "hello,dev" >> branch git add branch git commit -m "dev_other"
合并之后会报错,如下
提示合并冲突,合并失败,要你修改冲突,在次提交,我们此时打开branch文件看到
<<<<<<< HEAD hello,dev_other ====== hello,dev >>>>>>> dev
HEAD 指的是当前的主分支上的内容,======来区分两个分支,下面是dev分支上的内容,很清楚吧,将合并冲突的地方很清楚的划分出来。
既然已经知道冲突,那么就要结局冲突,此时是切换不到dev分支的,会提示没有完成合并,不能切换分支,那么修改后提交。
git add branch git commit -m "resolve conflict"
如果在分支没有提交之前,想要删除该分支的话,使用大写的D进行强制删除
git branch -D dev_other
5.3 git 的stash功能
git提供了stash的功能,以防止你正在增加某个功能,但是之前的版本有bug继续修复,可以利用stash功能将未完成的分支暂存起来,然后新建分支进行修改bug,之后提交合并到master之后,在恢复到之前未完成的分支,就是恢复stash,继续进行。
新建job分支,并增加job模块(新建job文件)
git checkout -b work touch job echo "working" >> work git add job git commit job
此时来了一个bug_1急需修复
首先在job分支下,存储job,并查看当前分支的状态
git status //发现有新增job<没有提交 git stash //提示存储到stash的版本 git status //此时状态是nothing
然后新建bug_1分支进行修复
git checkout -b bug_1
修复完成提交并合并到master
git add branch git commit -m "resolve bug_1" git checkout master git merge bug_1 --no-ff
修复完成之后,我们需要将刚刚dev分支下未完成的代码在调出来,继续工作。
git stash list //查看当前stash列表 //第一种方式 git stash apply [email protected]{0} git stash drop [email protected]{0} //第二种方式直接从stash中pop一下,就会将最后保存的stash恢复 并从stash list 栈中将此stash删除。 git stash pop
5.4 git 分支的远程多人协作
git可以将本地的分支推送到服务器端。
git push origin master git push origin dev
此时A在dev分支下进行开发,添加了remote文件,并提交到远程服务器
touch remote echo "hello,remote" >>remote git add remote git commit -m "hello,remote" git push origin dev
假如B和A一起写这个软件的另一个功能,则B clone了这个链接。(B:本地创建的一个名字为GitClone的文件,模拟成另一个开发人员)
克隆之后,就只有master这个主分支,B不能再主分支上进行开发,所以他需要新建一个dev分支,并且和远程服务器的dev关联起来。
git clone [email protected]:/home/git/first.git git branch git checkout -b dev origin/dev
关联之后,ls 就能看到服务器 推过来的文件,就是之前 A push到服务器的文件。
此时B修改了remote文件,并提交上传服务器。
echo "............." >> remote git add remote git commit -m "..........." git push origin dev
然后此时 A 也修改了 remote 文,件并提交上传服务器。
echo "111111111111" >> remote git add remote git commit -m "111111111111" git push origin dev
推送失败,因为B最新提交和你试图推送的提交有冲突,Git提示,先用git pull
把最新的提交从origin/dev
抓下来,然后,在本地合并,解决冲突,再推送.
然后此时要
git pull
git pull
也失败了,原因是没有指定本地dev
分支与远程origin/dev
分支的链接,则设置dev
和origin/dev
的链接:
git branch --set-upstream-to=origin/dev dev
之后再git pull,成功。
然后这个时候就需要解决冲突,并提交,就行了。解决冲突查看5.2章节的内容。
A端:
然后B端在使用的时候,再次git pull , 得到最新的内容,就是A 结局冲突之后最新提交的内容
B端:
OK ,到这里,结束本章节内容。
ps:累屎了,截图累屎了。