参考廖雪峰git教程
Git的分支管理
创建/合并/删除分支
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
所以,每个分支都指针,指向此分支的当前文件,而HEAD,指向某分支的指针,表示目前访问的是该分支的当前文件。
主分支为master,在master下创建子分支dev1dev2…:master主分支上最后提交的仓库,子分支则接着时间往前创建,由dev1/2…指向,然后HEAD指向dev1/2…当某个子分支创建的内容完善时,可以将其合并到master上,这是master指向了此时dev1/2…的指向,就算删除了子分支,主分支也记录着原内容。
啊~这个,以我现在的看法,就是很适合于多人协作,也适合去尝试多种方法解决一个问题。嗯,优秀的git
疑问?可以在子分支里再创建子分支吗?
还是这里所有的分支都是并行关系(有一个主)
回答:我试了一下,应该说可以,可以把创建分支看成copy当前的文件,开启另一个时间轴,如果我在子分支目录下创建new子分支,那么这个new子分支copy的就是当前子分支的文件内容,如果我回到master去新建子分支,那么这个子分支copy的就是当前master的文件内容。
那么记录记录命令吧:
git branch dev#创建分支dev
git checkout dev#将HEAD切换进分支dev
或
git switch dev#将HEAD切换到分支dev
上面两句可以使用checkout的-b参数合并成一句
git checkout -b dev#创建并切换进分支dev
#或
git switch -c dev#创建并切换到分支dev
显示当前全部的分支(当前分支前会标一个*):
git branch
合并分支内容(切换到master下):
git merge 被合并分支名
我试了一下,不仅仅master可以合并其他分支,其他分支之间也可以合并,其实我理解的就是copy其他分支的内容了。
删除分支:
git branch -d dev
我试了一下,master不能删除。然后我就想是不是有子分支的父分支不能删除呢?
于是创建了一个dev1,并在此分支下创建了一个dev2,然后试图删除dev1,居然成功了。
所以说,我的理解还是有问题dev1并非像master那样的主分支,它至于dev2不能说父分支,只是某个时间点下的copy对象而已。
然后我在没有merge的情况下用-d删除分支,报错说还未merge到master,要删除没有merge的分支需要用-D指令才可以。
解决冲突问题
如果master和dev都更新了,那么合并的时候master就不是简单的去copy dev的内容了,git会标记出不同分支的内容,需要我们手动修改,并重新提交。
查看分支合并图:
git log --graph#显示全部的分支合并图
git log --graph --pretty=oneline --abbrev-commit#以一行显示分支合并图?
分支管理策略
啊~
这一小节是在解释
如果直接用merge命令进行合并分支的话,如果没有冲突发生(master在创建分支后未改变),就会以fast forward的模式合并
(直接把master指向dev的当前提交,所以合并速度非常快),若有冲突发生则想上一节一样,需要手动修改。
以fast forward的模式合并的话,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
什么意思呢?就是如果禁用了fast forward说此时master指针不是直接改变指向到当前的dev了,而是把当前的dev内容当做暂存区内容去创建一个新的commit,然后自己再指到这新的结点上:
git merge --no-ff -m "merge with no-ff" dev
–no-ff就是禁用fast forward的意思,而加了-m参数后带的就是此次commit的描述。
BUG分支
在dev分支上写代码的时候,需要去master分支改bug,也就说我现在要离开我当前分支的工作区但当前工作还没有完成不能提交怎么办?
把当前工作现场“储藏”起来
git stash
查看保存的工作现场(我觉得这是一个栈)
git stash list
可以多次stash。
等我改完bug回来的时候:
git stash apply#恢复现场到stash保存的样子,并不删除当前的stash指向
git stash drop#删除当前stash指向
或
git stash pop#恢复现场并删除当前stash指向
git stash apply stash@{0}#指定恢复哪一个stash
至于在改bug时:先创建一个bug分支,改bug,然后再merge --no-ff到原分支上,后删除这个bug分支就可以了。
如果该的bug在master上那么,dev也存在该bug,那么dev应该也要更新该bug的修改才对,这时可以在dev下使用命令:
git cherry-pick bug分支的版本号
这样在dev就做了和master上一样的bug修复,但是是一个新的commit。
当然我也可以在dev上创建bug分支修改bug在用cherry-pick到master上。
Feature分支
啊~这个就是用-D删除没有被合并的分支
多人协作
查看远程库信息
git remote -v
从本地推送分支
git push origin branch-name
推送之前需要先在本地创建远程分支对应的分支并建立连接
git checkout -b <branch-name> origin/branch-name
git branch --set-upstream branch-name origin/branch-name
如果推送失败,则可能是因为远程分支比你的本地更新,需要先用git pull合并,如果合并有冲突,则解决冲突(手动),并在本地提交。在从本地推送分支。
Rebase
变基操作
git rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
今天就学到这吧,十点半了,还有作业,好惨啊~总要厚着脸皮去问别人,害怕大佬们对我产生什么厌恶情绪,怎么做才对呢T T。