git 的分支是它最明显的特性, 大部分人听别人推荐使用git都会听到“git分支操做方便...”,对比其余版本控制系统git 分支操做有难以置信的轻量,建立新分支几乎瞬间完成,不一样分支之间切换也很是快捷方便;本文将结合实践以及绘图概括、总结git常见的分支操做指令以及注意事项;本文只总结git分支的实践运用, git分支底层实现原理请阅读ProGit第二版分支部分章节;git
首先咱们得知道, GIT分支包括本地分支 跟 远程分支; 惯例先上图:github
有时远程有的分支咱们本地没有(其余同事维护的分支), 或者本地有的分支远程没有(修复线上小问题开的本地小分支);如下具体说下如何建立本地分支和远程分支:typescript
新分支都是基于原有分支建立, 而在实践开发中基本从线上分支(与线上代码同步的分支): master 分支建立。
而 从master建立本地分支也有两种方式:基于本地master分支建立分支、基于线上master分支建立分支;
基于本地master分支建立分支(命令窗口进入工程根目录):
查看当前是否在master分支:vim
// 查看本地分支信息 git branch
绿色分支表示其为当前分支,因此得切换至master分支segmentfault
git checkout master git pull // 建立并切换到新分支至关于:git branch xxx, git checkout xxx git checkout -b newBranchName
git checkout master
切换到本地master分支;windows
git pull
更新本地master分支代码至最新(如 本地master分支未关联远程master分支,git pull origin master
);缓存
git checkout -b newBranchName
基于本地master分支代码建立新分支:newBranchName,并切换到该分支;sass
基于远程master分支建立分支(命令窗口进入工程根目录):工具
首先查看本地、线上分支信息(调用如下指令前建议先执行"git pull -p"防止本地git分支信息缓存):测试
git branch -a
白色显示为本地分支、绿色显示为当前分支、红色显示为远程分支;
切换至远程分支:
git checkout remotes/origin/master
基于远程master分支建立新分支:
git checkout -b newBranchName
建立远程分支能够直接由本地新分支推送完成也能够在远程分支管理系统(例如:github 、gitLab)上可视化操做完成;
本地新分支推送建立远程分支
在 1.1 部分咱们在本地建立了一新分支, 若是在该分支更新了代码, 而后执行git add
、git commit
指令后, 再执行如下指令可在远程建立新分支;
// git push <远程主机名> <本地分支名>:<远程分支名> git push origin newBranch:newBranch
GitHub上建立远程分支
选中项目, 而后在项目首页左上侧点选分支按钮, 弹出的弹层输入新分支名称便可;
PS: 上述建立的同名本地分支跟远程分支并没创建关联, 这样操做指令会比较不方便(如“git pull”指令得输入对应的远程分支名), 怎么让其创建关联?
切换到newBranchName分支(如当前处在其余分支):
git checkout newBranchName
执行更新代码指令:
git pull
就能看到git 的关联提示:
按照其提示提示执行指令便可:
// git branch --set-upstream-to=origin/<远程分支名> <本地分支名>如设置当前分支,第二个参数可省略,; git branch --set-upstream-to=origin/newBranchName
校验是否关联成功:
git pull
提示 “Already up-to-date.” 表示已关联成功;
建立好新分支后就能够在新分支进行开发, 但可能中途须要去维护其余分支代码;这个时候就得切换分支了,切换分支指令:
git checkout newBranch2
ps: 编辑代码不会直接在develop、master分支操做,由于最终代码要同时合并到这两个分支上,因此通常均在新分支开发(即便是很小的改动);
工做区间的代码均已提交到本地仓库(当前分支), 那切换分支没什么问题, 但若是工做区域代码还没有提交,这时切换分支会怎样呢?
有时候没法切换, 有时候能正常切换;
能正常切换:改动的代码能正常合并到切换后的分支(自动合并成功)
没法切换:改动的代码不能正常合并到切换后的分支(自动合并失败)
工做区间有未提交代码,切换分支自动执行git merge
操做,故有冲突将没法切换成功;
固然也会有这样的场景: 当前分支代码没写完,还不想提交且由于有紧急需求不得不切换分支;这个时候能够 使用“工做现场”将代码暂时放着:
// 如 直接 "git stash"则将上次commit注释做为说明 git stash save "存储说明" git checkout B
处理完紧急需求拿出继续开发:
git checkout A git stash pop
若是原本想在A分支上开发, 开发过程当中才发现当前处在B分支,想强制将工做区间代码迁到A分支也能够借助“工做现场”完成:
git stash save "存储说明" git checkout B
git stash pop // 若有冲突且处理完全部冲突 git add -A
很多在windows下使用git的同窗会碰到这样的问题: 从A分支切换到B分支因为git异常致使虽然切换分支成功,但在当前B分支上留存了大量A分支的代码(被git认为是新的改动或新增文件);
这个时候就得用到上一篇博文(git图解2:git 代码回退;)知识了!
咱们能够将全部改动提交, 而后使用远程分支代码覆盖!放心提交到本地仓库,反正后面这个commit会被覆盖。
// 将全部改动提交到本地仓库 git add -A git commit -m "这个commit会被覆盖" //B 是当前分支名 git reset --hard origin/B
惯例放图:
分支代码合并也有两方式: 合并本地分支代码、合并远程分支代码;
合并本地分支代码: 例如在新分支 newBranch开发的功能已完成并已提交;接下来走测试流程须要将代码合并到develop分支(我所在团队develop为测试分支,不一样团队的测试分支会不同)。
// 切换到develop分支 git checkout develop // 合并newBranch代码 git merge newBranch // 提交commit到远程(newBranch分支有多少个commit就会生成几个) git push
合并远程分支代码: 若是新分支由多人维护,为保证更新代码为最新,使用上述方式合并分支会比较麻烦:
首先得切换到本地newBranch分支(git checkout newBranch
);
而后更新代码(git pull
);
再次切换回develop分支(git checkout develop
);
最后才能执行合并操做(git merge newBranch
);
其实可直接将远程的 newBranch分支代码合并到本地 develop分支:
git pull origin newBranch
不管哪一种方式合并分支代码代码冲突是无可避免的状况, 开发流程使用了typescript/sass等须要执行编译的语言更容易产生冲突;
分支合并代码冲突跟通常代码冲突同样: git能处理的冲突会自动解决, 不然就得手动解决冲突;冲突是因为多人维护代码致使,必定要找到相关人一块儿讨论冲突代码的取舍;
若是待合并分支代码跟当前分支前几回commit修改了同一文件,合并分支就会出现如下提示:
以上提示git自动合并失败,须要手动解决冲突, 打开冲突文件会发现如下:HEAD
到=======
之间为当前分支改动, =======
到>>>>>>> newBranch
为待合并分支的改动;
手动解决冲突后:
告诉git冲突已解决:
git add -A
合并完成,提交代码:
git commit -m "[master]-合并newBranch代码" git push
同切换分支异常状况, 在windows下合并分支也会出现异常, 异常处理方式同上:
// 将全部改动提交到本地仓库 git add -A git commit -m "这个commit会被覆盖" //B 是当前分支名 git reset --hard origin/B
在合并分支后使用可视化工具查看代码提交记录(或者 "git log" 指令), 有代码洁癖的同窗可能接受不了。若是 newBranch分支开发过程当中有10个commit, 那合并完成后(没产生冲突)也会产生10个commit;如何让合并代码后commit更简洁?
使用git rebase
合并分支代码(实际开发中会发现git rebase
执行起来很是麻烦):
rebase,合并的结果好看:清晰、直观,但合并过程当中出现冲突处理比较麻烦(rebase过程当中,一个commit出现冲突,下一个commit也极有可能出现冲突,一次rebase可能要解决屡次冲突);
merge,合并结果很差看:一堆线交错,但合并有冲突的话,只要解决一次就好了;
因此建议先git rebase xxx
,若有冲突,git rebase --abort
,再换用git merge xxx
。
另外一方案: 能够合并完成后(git push
以前)编辑commit 信息, 将多个commit合并成一个:
例如: 我再当前newBranch分支提交了三个commit :
执行git rebase -i
进入交互模式,自动打开vim:
将后两个“pick”改为(vim模式输入“i”进入编辑状态)“s”, 而后保存退出(esc退出编辑状态,而后":"输入“wq”保存退出):
保存成功后还有一个编辑vim, 合并commit后,新的commit注释填写下,保存退出:
合并完成:
ps: 简洁合并付出的就是多余的操做, 实际开发讲求的是效率, 因此不少人懒得弄这些(例如我);
git的分支在完成它使命后就不必存在了:
上线流程完成:应删除本地分支及远程分支(git lab分支): git branch -D xxxx, 上线完成意味着当前xxx分支代码已经合并到线上分支(master)以及开发分支(develop), 该分支后续功能的改动(bug修复或代码扩展)彻底能够在master新开分支完成;(不然可能遗忘删除,致使远程分支原来越多) ----[git_tips - [ git经常使用指令排行榜 ] - 看云](http://www.kancloud.cn/wteamx...
// "-d" 若是该分支代码未合并到其余分支,将没法删除; // "-D" 强制删除分支,不会出现任何提示; git branch -D xxxx
删除远程分支两种方式:
1.在git管理系统的Web页面操做(gitLab);
gitHub上没法删除远程分支, 若是你团队使用的是gitLab那能够在gitLab管理页面操做;
2.本地指令完成;
git push origin --delete newBranch
git branch官方API文档
从新组织git本地提交 | yongpoliu.com
git经常使用指令排行榜