查看分支
git branch 查看本地分支
git branch -a 查看本地分支和远程分支
git branch -v 查看本地各个分支及最后一个提交对象的信息
git branch -av 查看本地和远程各个分支及最后一个提交对象的信息
git branch --merged 筛选出已经与当前分支合并的分支(也就是说哪些分支是当前分支的直接上游。)
git branch --no-merged 筛选出尚未与当前分支合并的分支(Git 1.5.6 以上版本)
创建、切换分支
默认基于当前分支
git branch <BranchName > git checkout <BranchName > git checkout -b <BranchName >
指定源分支,git log 与源分支保持一致。
git checkout -b branch-name <srcBranch > git checkout -b branch-name origin/<srcBranch > git checkout --track origin/<srcBranch > 与上一个命令作用相同,分支名与远程一致
基于本地分支新建的分支,pull 和 push 不能成功:There is no tracking information for the current branch.
基于远程的,默认关联到了远程分支。
git clone下来的仓库,默认只有master分支,若想要新建与远程其他分支对应的分支,使用第二/三条命令
合并分支
默认Fast forward,合并某分支到当前分支, 正常无冲突合并完成后,查看当前分支log, 看不出来合并过,只是多了一些提交
$ git merge <BranchName>
–no-ff参数,表示禁用Fast forward,查看当前分支log, 可以看出合并过
$ git merge --no-ff -m " " <BranchName>
生成一条commit log, Merge branch ‘<BranchName>’ into master
冲突情况
手动解决,然后add、commit,手动更改的文件只体现在本分支(master),被合并分支(conflict)内容无变化。conflict merge master 不会再冲突。
本分支log中,当前分支与被合并分支的commit信息按时间排列,最新的是both。解决过后,再去被合并分支merge,无冲突。通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。$ git log --graph --pretty=oneline --abbrev-commit //可以看合并情况
重命名分支
重命名本地
git branch -m oldbranchname newbranchname
重命名远程分支
只能通过先删除远程分支,然后重命名本地分支,再重新提交一个远程分支
删除分支
删除本地
$ git branch -d <BranchName> $ git branch -D <BranchName>
有新产生的commit没有在当前分支体现的时候,简单地用 git branch -d 删除该分支会提示错误,因为那样做会丢失数据 D强制删除,git branch –no-merged查看未在当前分支合并的分支。亲手实验结果,branch5 有新的commit之后,合并到branch3,则在branch3下可以执行删除branch5,而在branch2下会提示-D。
删除远程分支
$ git push origin --delete <BranchName> Git v1.7.0之后 $ git push origin -d <BranchName> $ git push origin :<BranchName> Git v1.7.0之前,推送一个空分支到远程分支,其实相当于删除远程分支
远程协作
推送分支到远程
$ git push origin branch-name 把本地分支推送到远程对应分支,如果该远程分支不存在,则会被新建 $ git push -u origin branch-name 基于以上,并且建立关联关系 $ git push origin branch:master 非对应分支推送,本地branch分支推送到远程master分支 <src>:<dst>
建立本地分支和远程分支的关联, 体现在 .git/config文件,可以手动配置
$ git branch --set-upstream branch-name origin/branch-name;
push冲突
解决冲突,commit,push. 你的本地commit信息和远程库最近更新的commit信息都在,分别显示基于共同节点的差异,按时间先后排序。 解决冲突后的commit信息,也在。
详述:
Git把每次提交串成一条时间线,这条时间线就是一个分支。HEAD指向master,master指向提交,所以,HEAD指向的就是当前分支。每次提交,master分支都会向前移动一步,这样,随着不断提交,master分支的线也越来越长。当我们创建新的分支dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并,fast-forward。所以Git合并分支也很快!就改改指针,工作区内容也不变!合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支。真是太神奇了,你看得出来有些提交是通过分支完成的吗?
注意到合并成功后的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。