首先需要了解分支的本质,分支可以理解为一个指向某个commit对象的指针,但是它是可变的,随着commit提交的变化,指针跟随移动,始终指向当前分支最新的那个提交。使用 git log --oneline 命令可以查看每个分支指向的提交信息。git中的分支信息都保存在.git目录下,具体位置参考git目录介绍
目录
1. 创建分支,并关联远程分支
git branch new_branch
本地创建新分支,如果分支已经存在,代码会报错, -f 强行创建,原来的同名分支会被新建分支覆盖,新建分支之后,并不能自动切换到新分支
git checkout -b new_branch
新建分支的同时切换分支,如果分支已经存在,代码会报错 , -B 强行创建,原来的同名分支会被新建分支覆盖
注意:第一第二种方式是基于当前分支创建新分支,而且也没有建立与远程分支的关联关系(如何查看分支的跟踪关联关系可查看第二点)。
创建分支的同时建立关联关系:
git checkout -b branch-name origin/branch-name
在创建分支的同时关联远程分支
git pull origin origin_branch:local_new_branch
拉取远程分支origin_branch上的最新代码到本地分支local_new_branch上,如果不存在local_new_branch则自动创建
注意:这两种方式都必须保证指定的远端分支是存在的
创建分支后手动关联远程分支:
git branch --set-upstream-to branch-name origin/branch-name
将本地分支branch-name关联远程分支branch-name,如远端不存在该分支,会提示错误
git branch --set-upstream-to=origin/branch-name
将当前本地分支追踪远程分支origin/branch-name,如远端不存在该分支,会提示错误
git branch -u origin/branch-name
设置当前分支跟踪远程分支origin/branch-name
ps:分支除了追踪远程分支,也可以追踪本地其他分支
git push -u origin <remote_branch> 或者 git push --set-upstream origin <remote_branch>
进行推送并将当前本地分支追踪远程分支origin/branch-name,如远端不存在该分支,则自动创建 ,注意如果本地代码不是最新的话,push会被拒绝,但是也有解决方案,在拉取代码时指定远程分支,git pull origin remote_branch 拉取远程指定分支的代码到本地当前分支上,两者之间无需建立跟踪关系
也可以基于指定提交创建分支:
git branch newBr commitId
基于某次提交创建新分支,其中commitId是该提交对象的id,可以是前几位缩写。前3种语法都可以适用该语法。
git stash branch newBr stashIndex
git基于指定stash储藏创建分支,stashIndex 为 stash对应序号
git stash branch newBr stash@{0} 或者 git stash branch newBr 0
表示基于序号为0的stash创建分支(参考git stash用法)
新创建的分支,如果未跟踪远程分支(没有和远程分支建立联系),那在git push和git pull时会提示上述错误。
关于git pull 和 git push 参考文章 git常用命令记录
2. 查看分支
git branch -l
查看所有本地分支,-l 为默认参数,可不写出
git branch -a
查看所有本地分支以及远程分支
git branch -v
展示分支当前提交的hash值和提交信息
查看分支的跟踪关系
git branch -vv
查看所有分支的跟踪关系
注意,即使跟踪的远程分支已经被删除了,跟踪关系也依然保留,那么显然这是无效的,网上有些花里胡哨的操作我不甚理解,个人认为直接删除该本地对应分支即可。
3. 切换分支
git checkout target_branch
注意:切换分支并不会改变当前工作区和暂存区,所以需要提交所有修改
4. 分支重命名 (不推荐)
git branch -m oldName newName
5. 删除分支
git branch -d branchOne branchTwo
删除本地分支
注意:不能在当前分支删除当前分支,同时 git branch -d只能删除那些已经被当前分支合并的分支,分支上如果还未合并,会提示无法删除,这时需要强制删除 git branch -D newBr
git push origin --delete branchOne branchTwo
删除远程分支
6. 分支恢复
每个分支就像一个指针指向某个commit对象,只要记住该对象对应的sha-1键值,使用该提交重新创建分支即可。
PS:如果不清楚该sha-1id,也可以通过reflog命令查看
7. 分支合并
git merge dev
表示将dev分支上的内容合并到当前分支,此操作在未发生冲突时会自动生成提交对象并进行提交。
假若发生冲突,git 只做合并操作,并未进行提交。同时会生成冲突文件,通过 git status 命令可查看未合并的冲突文件提示
比如,a.txt 文本中内容分别为aaaa 和 bbbb,此时就需要我们手动解决冲突
修改好后,需要手动再次 add 该文件并再次 commit
如果想将dev上的代码合并到master,可参考以下简洁用法
git checkout dev # 检出dev
git pull # 从远端拉取dev上的最新代码
git checkout master # # 检出master
git merge dev # 合并dev到master
git push -u origin master # 推送到远端master
8. git 远端
git remote -v 查看远端地址
git remote show origin 查看远端详细信息
9. 撤销提交
git reset
具体细节用法参考 git常用命令记录 一文
附:Git开发流程标准中的分支划分,参考文章http://www.softwhy.com/article-8651-1.html
一.分支种类:
当在实际应用开发中,特别是比较复杂的项目,Git不可能只存在一个分支。
比如主分支存放当前线上稳定版代码,还有正在进行测试的非稳定版本分支,或者还有正在开发新功能的分支。
开发建议Git有如下分支(不是影响固定,仅供参考):
(1).master。
(2).develop。
(3).hotfix。
(4).release。
(5).feature。
图示如下:
二.分支种类作用介绍:
1.master分支:
此分支通常用来存放项目的稳定版本,主要特点如下:
(1).内容来源主要是分支合并过来,不推荐开发者直接commit提交。
(2).由于master分支可以是稳定版本,可以随时上线,所以通常版本标签都是打在master分支各个提交之上。
关于标签的用法可以参阅Git tag标签用法详解一章节。
2.develop分支:
develop开发分支通常和feature特征分支配合使用,它是所有feature特征分支的基础。
当在feature分支中测试完新开发的功能后,可以将其合并到develop分支。
3.hotfix分支:
当出现紧急问题,比如master线上分支出现代码问题,可以在此分支中进行修补,修补之后然后再合并到master分支。
特别说明:在合并到master主分支的同事,还要合并一份到develop分支,否则之后将develop合并到master时候,可能会导致修复的问题复现。
4.release分支:
当develop分支开发到自认为足够稳定的状态,将此分支合并到release分支(在此分支进行上线前的最后测试)。
最后测试完成后,再合并到master分支和develop分支。
合并到master分支是非常好理解的,因为要上线运行。合并到develop是因为release分支后续可能还会发现问题,所以要将与develop分支同步,以防止以后develop再合并到release分支出现问题。
5.feature分支:
此分支作用其在介绍develop分支的时候已经涉及,在feature进行新功能的开发,开发完成后再合并到develop。