适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作

适合前端初学者的git实操总结–windows系统git教程(一)仓库初始化、文件更改、版本回退

适合前端初学者的git实操总结–windows系统git教程(二)工作区与暂存区

适合前端初学者的git实操总结–windows系统git教程(三)撤销、修改与删除

适合前端初学者的git实操总结–windows系统git教程(四)关于远程仓库

适合前端初学者的git实操总结–windows系统git教程(五)添加、克隆远程仓库

提示:往期关于git教程的所有文章可以点击上方链接查看


文章目录

  • 适合前端初学者的git实操总结--windows系统git教程(一)仓库初始化、文件更改、版本回退
  • 适合前端初学者的git实操总结--windows系统git教程(二)工作区与暂存区
  • 适合前端初学者的git实操总结--windows系统git教程(三)撤销、修改与删除
  • 适合前端初学者的git实操总结--windows系统git教程(四)关于远程仓库
  • 适合前端初学者的git实操总结--windows系统git教程(五)添加、克隆远程仓库
  • 一、什么分支?
  • 二、创建、合并、删除分支
    • 1.创建dev分支并切换到dev分支:
    • 2.切换并进入到master分支:
    • 3.切换并进入到master分支的另一种操作:
  • 总结
  • 三、如何解决冲突
    • 1.在不同分支对同一文件进行修改并提交
    • 2.将不同分支的操作合并
    • 3.修改冲突
  • 总结
  • 四、分支管理策略
    • 1.--no-ff方式的git merge
    • 2.分枝策略
  • 总结
  • 五、Bug分支
    • 1.stash功能
    • 2.修复bug
  • 总结
  • 六、Feature分支
    • 1.新功能开发
    • 2.删除未合并的分支
  • 总结
  • 七、多人协作
    • 1.推送分支
    • 2.抓取分支
    • 3.多人协作
    • 4.多人协作的工作模式梳理
  • 总结



一、什么分支?

关于分支,廖雪峰老师是这么解释的:↓
假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,无论创建、切换和删除分支,Git在1秒钟之内就能完成这样,既安全,又不影响别人工作。

分支的重要性就不言而喻了吧~

二、创建、合并、删除分支

1.创建dev分支并切换到dev分支:

git checkout -b dev

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第1张图片

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev // 创建dev分支
$ git checkout dev // 切换到dev分支
Switchedto branch ‘dev’

git branch 命令查看当前分支: git branch 命令会列出所有分支,当前分支前面会标一个*号。

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第2张图片

然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:
Creating a newbranch is quick.
然后提交

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第3张图片
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第4张图片

2.切换并进入到master分支:

dev分支的工作完成,接下里我们就可以切换并进入到master分支:

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第5张图片

然后我们再查看一个本地的readme.txt文件,刚才添加的内容不见了!我们明明添加了呀,这是为什么呢?

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第6张图片

因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

那么,我们需要把dev分支的工作成果合并到master分支上:git merge命令用于合并指定分支到当前分支。
合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第7张图片
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第8张图片

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward,我们后面会学习其他方式的合并。
合并完成后,就可以放心地删除dev分支了: $ git branch -d dev
删除后,查看branch,就只剩下master分支了: $ git branch
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第9张图片
因为创建、合并和删除分支非常快,所以我们一般使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

3.切换并进入到master分支的另一种操作:

切换分支使用git checkout ,而前面学过的的撤销修改则是git checkout --
同一个命令,有两种作用,是不是有点疑惑呢?
实际上,最新版本的Git提供了新的git switch命令来切换分支:
创建并切换到新的dev分支,可以使用:$ git switch -c dev
直接切换到已有的master分支,可以使用:$ git switch master
使用新的git switch命令,比git checkout要更容易理解。一起来实践一下吧~

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第10张图片

总结

工作中,我们要学会使用分支,这样既安全,又不影响别人工作。
查看分支:git branch
创建分支:git branch
切换分支:git checkout 或者 git switch
创建+切换分支:git checkout -b 或者 git switch -c
合并某分支到当前分支:git merge
删除分支:git branch -d

三、如何解决冲突

1.在不同分支对同一文件进行修改并提交

1.创建新的feature1分支并进入该分支

git switch-c feature1

修改readme.txt最后一行,改为:Creating a newbranch is quick ANDsimple.
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第11张图片

然后在feature1分支上提交
git add readme.txt
git commit-m "AND simple"

2.接着切换到master分支:在master分支上把readme.txt文件的最后一行做同样的修改:

然后在master分支上提交:
git add readme.txt
git commit-m "& simple"

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第12张图片

操作我们看下图:现在,master分支和feature1分支各自都分别有新的提交
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第13张图片

2.将不同分支的操作合并

3.将feauture1分支的操作合并到当前master分支

这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:将feauture1分支的操作合并到当前master分支,

在这里插入图片描述

git status也可以看到冲突的文件:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第14张图片

我们可以直接查看readme.txt的内容:适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第15张图片

可以看到,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第16张图片

3.修改冲突

我们修改如下后保存:Creating a new branch is quick and simple.
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第17张图片

现在用带参数的git log 也可以看到分支的合并情况:最后,删除feature1分支
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第18张图片

总结

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
git log --graph命令可以看到分支合并图。

四、分支管理策略

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

1.–no-ff方式的git merge

–no-ff表示禁用Fast forward,下面我们实战一下–no-ff方式的git merge:

首先,仍然创建并切换dev分支: $ git switch-c dev
修改readme.txt文件,并提交一个新的commit:
git add readme.txt
git commit-m "add merge"
现在,我们切换回master:
git switch master
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第19张图片

准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward:

因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
git merge --no-ff -m "merge with no-ff"dev
合并后,我们用git log看看分支历史:

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第20张图片

*   84287e2 (HEAD -> master) merge with no-ff
|\
| * 22deb41 (dev) add merge
|/
*   e13a9f1 conflict fixed
|\
…

可以看到,不使用Fast forward模式,merge合并后的历史有分支,就像这样
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第21张图片

2.分枝策略

在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
我们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第22张图片

总结

Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

五、Bug分支

当你接到一个修复一个代号101的bug的任务时,你想创建一个分支issue-101来修复它,但是,假如当前正在dev上进行的工作还没有提交,而且只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,该怎么办?

Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

1.stash功能

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第23张图片
现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第24张图片

2.修复bug

首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第25张图片

假如现在修复bug,需要把readme.txt中的“Git is free software …”改为“Git is a free software …”,然后提交:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第26张图片
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第27张图片

修复完成后,切换到master分支,并完成合并,最后删除issue-101分支:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第28张图片

现在,接着回到dev分支给老板搬砖
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第29张图片

工作区是干净的,刚才的工作现场存到哪去了?我们git stash list命令看看:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第30张图片

工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下。用git stash pop,恢复的同时把stash内容也删了:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第31张图片

用git stash list查看,就看不到任何stash内容了:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第32张图片

如果多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:

 git stash apply stash@{0}

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第33张图片
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第34张图片

在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了?有木有更简单的方法?当然有!
同样的bug,要在dev上修复,我们只需要把 996137 fix bug 101【我这里是996137 fix bug
101,注意看你自己的内容是什么】这个提交所做的修改“复制”到dev分支。

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第35张图片
注意:我们只想复制996137 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第36张图片
Git自动给dev分支做了一次提交,注意这次提交的commit是d5a9cff,它并不同于master的996137,因为这两个commit只是改动相同,但确实是两个不同的commit。用git cherry-pick,我们就不需要在dev分支上手动再把修bug的过程重复一遍。

总结

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,
修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,
可以用git cherry-pick commit 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

六、Feature分支

工作中,现在我们每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。

1.新功能开发

假设我们现在需要开发一个menu的新功能,新建并进入menu分支:

git switch -c feature-menu

开发完毕之后:

git add menu.txt
git status
git commit -m "add feature menu"

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第37张图片
切回dev,准备合并:git switch dev
feature分支和bug分支是类似的,合并,然后删除。

2.删除未合并的分支

假设领导通知新功能必须取消,此时我们这个feature-menu的分支还是必须删掉,执行

git branch -d feature-menu

删除失败,Git提醒我们,feature-menu分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第38张图片

总结

开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D name 强行删除。

七、多人协作

当我们从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第39张图片

git remote 查看远程库的信息
git remote -v 显示更详细的信息,上面显示了可以抓取和推送的origin的地址。
如果没有推送权限,就看不到push的地址。

1.推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:

推送master分支:git push origin master
推送dev分支:git push origin dev

如果dev分支没有存在,需要自行创建再push上远程仓库,这一步很重要,否则会导致别人抓取分支的时候,创建远程origin的dev分支到本地这一步会提醒失败

哪些需要推送到远程
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

2.抓取分支

多人协作时,大家都会往master和dev分支上推送各自的修改。
可以在另一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另一个目录下克隆来实验。
这里我用同一台电脑的不同目录模拟我的工作伙伴进行试验:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第40张图片

我的工作伙伴从远程库clone时,只能看到本地的master分支适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第41张图片
我的工作伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:

git switch -c dev origin/dev

适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第42张图片

3.多人协作

创建本地dev分支后,他就可以在dev上继续修改,然后,时不时地把dev分支push到远程:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第43张图片

而假如碰巧我也对同样的文件作了修改,并试图推送:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第44张图片

推送失败,我那“可爱”小伙伴的最新提交和我试图推送的提交有冲突,Git提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第45张图片

git pull也失败了,原因:没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接,然后再pull
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第46张图片

这次git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,再提交,再push:
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第47张图片
适合前端初学者的git实操总结--windows系统git教程(六)关于git分支的相关操作_第48张图片

4.多人协作的工作模式梳理

首先,可以试图用git push origin branch-name 推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交
没有冲突或者解决掉冲突后,再用git push origin branch-name 推送就能成功! 、
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,
用命令git branch --set-upstream-to branch-name origin/branch-name

总结

查看远程库信息,使用git remote -v
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用 git push origin branch-name
如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。


你可能感兴趣的:(git操作的系统教程,git,github,前端)