文章目录
接上篇:Git基础和GitHub
分支管理
这部分的内容相对较难,也是我过去没记住的,但感觉这是Git的一个核心,需要好好理解。
每次commit形成一个点,这些点按时间先后顺序连成一条线,一个“快照流”,目前线只有一条,在Git中称为master分支。指针HEAD指向master,master指向提交点,那么HEAD指向的就是当前分支。
分支的创建与合并
创建新分支dev,Git新建指针dev,指向了master的提交点,再切换到dev分支,即让指针HEAD指向dev分支:
|
1 2 |
$ git branch dev //创建dev分支 $ git checkout dev //切换当前分支至dev分支 |
或者使用-b参数完成:
|
1 |
$ git checkout -b dev |
使用命令git branch查看分支(加上参数-a查看远程分支):
|
1 |
$ git branch |
*标识当前分支
现在我们可以在dev分支作正常提交,例如修改readme.txt文件并提交:
dev分支工作完成,现在我们切换回master分支,此时master的提交点还在过去的点,我们还要把dev的工作成果合并到master分支:
|
1 2 |
$ git checkout master //切换分支 $ git merge dev //合并分支 |
命令git merge用于合并指定分支到当前分支,“快进模式”(Fast-forward)表示直接把master指向dev的当前提交点,仅是指针移动,所以速度很快。
合并完成后可放心删除dev分支:
|
1 2 |
$ git branch -d dev $ git branch |
删除远程分支为远程当前分支错误解决(更新)
删除远程分支
|
1 |
$ git push origin --delete <branchname> |
若出现以下类似错误
|
1 |
! [remote rejected] gh-pages (refusing to delete the current branch: refs/heads/... |
说明删除远程的分支为远程当前分支,到GitHub远程库Settings>>Branches修改远程库当前分支后即可顺利删除。
解决分支冲突
新建并切换至feature1分支,修改readme.txt文件并提交,切换到master分支:
Git还会自动提示了当前master分支比远程的master分支要超前一个提交点。再修改readme.txt文件并提交,此时master分支和feature1分支都有了各自的新提交,这样Git是无法以“快进模式”执行合并,可能会发生冲突:
readme.txt文件发生了冲突,自动合并失败,这时需要手动解决冲突再提交合并。使用命令git status可以查看冲突的文件:
现在我们来查看readme.txt文件:
|
1 2 3 4 5 6 7 8 |
$ cat readme.txt Git is a distributed version control system. Git is free softwave distributed under the GPL. <<<<<<< HEAD Creating a new branch is quick & simple. ======= Creating a new branch is quick AND simple. >>>>>>> feature1 |
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们再修改readme.txt文件并提交:
带参数的git log查看分支的合并情况:
|
1 |
$ git log --graph --pretty=oneline --abbrev-commit |
最后删除feature1分支:
|
1 |
$ git branch -d feature1 |
工作完成。
分支管理策略
合并分支时Git默认使用“快进模式”,删除分支后会丢失分支信息。如果要强制禁用“快进模式”,Git就会在合并时生成一个新的commit(记得带上-m参数添加描述),这样我们可以从分支历史看到分支信息。
在使用命令git merge合并时,加上--no-ff参数即可用普通模式合并分支:
分支策略:master分支应稳定,用来发布新版本,dev分支不稳定,用来工作,每个人的工作分支往dev分支合并。
Bug分支
当你在dev分支上工作,工作没有完成提交,但突然有一个紧急修复Bug的任务issue-101,可以通过Git提供的stash功能把当前工作现场“储藏”,等待完成修Bug任务后恢复继续工作。
|
1 2 3 |
$ git status $ git stash $ git status |
现在工作区是“干净”的,可以放心创建分支来修复Bug。假设需要在master分支修复Bug,就从master分支创建临时分支:
Bug修复完成,现在回到dev分支继续工作,使用命令git stash list查看:
|
1 |
git stash list |
现在恢复工作现场(两种方法):
|
1 2 3 4 5 6 |
$ git stash pop //恢复的同时删除stash内容 //或者 $ git stash apply //恢复但不删除stash内容 $ git stash drop //删除stash内容 //有多个stash内容时,需指定恢复删除的stash |
Feature分支
假设开发实验性新功能Vulcan,新建Feature分支在上面工作,不影响主分支。
在合并到dev前突然被告知不需要新功能,必须删除该Feature分支,使用-D参数为强制删除:
|
1 |
$ git branch -D feature-vulcan |
多人协作
查看远程库信息:
|
1 |
$ git remote -v |
推送分支:
|
1 2 3 4 5 6 |
$ git push origin master //主分支,建议时刻同步远程库 //or $ git push origin dev //开发分支,与团队在上面工作,也应同步远程库 //or //看情况同步 $ git push origin bug $ git push origin feature |
如果自己玩,同不同步自选。
抓取分支(另一人抓取你的):
|
1 |
$ git clone git@github.com:StarryLeo/learngit.git |
默认情况下,他只能看到master分支,他要在dev分支工作,必须创建远程origin的dev分支到本地:
|
1 |
$ git checkout -b dev origin/dev |
现在,他可以在dev分支上工作,可以把dev分支push到远程库。如果有冲突查看说明解决就好啦。
同步 Fork 上游(更新)
添加 Fork 源仓库为上游远程仓库
|
1 2 3 |
$ git remote -v $ git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git $ git remote -v |
合并上游远程仓库到自己的 Fork 仓库
|
1 2 3 |
$ git fetch upstream $ git checkout master $ git merge upstream/master |
使用子模块 gitmodules(更新)
主仓库添加其他仓库作为子模块
|
1 2 3 |
$ git submodule add https://github.com/submodule/submodule (submodule_path) $ cat .gitmodules $ git diff --cached --submodule |
git clone 含有子模块的项目
|
1 2 3 4 5 6 |
$ git clone $ cd $ git submodule init $ git submodule update Or $ git clone --recursive |
使用 rebase(更新)
标签管理
切换至要打标签的分支,使用命令git tag <name>即可打上新标签:
|
1 2 3 |
$ git branch $ git checkout master $ git tag v1.0 |
查看所有标签:
|
1 |
$ git tag |
默认标签是打在最新的commit上的,要打在历史commit可以使用git log查询commit_id,如下:
|
1 2 3 |
$ git log --pretty=oneline --abbrev-commit $ git tag -a v0.9 -m "version 0.9 released" a21977c $git show v0.9 |
删除本地标签:
|
1 |
$ git tag -d <tagname> |
推送标签至远程库:
|
1 2 3 |
$ git push origin <tagname> //一个 //or $ git push origin --tags //全部 |
删除远程库标签:
|
1 2 |
$ git tag -d <tagname> $ git push origin :refs/tags/<tagname> |
是否删除成功登陆GitHub查看。
使用GitHub
要参与一个开源项目,先Fork项目到自己的GitHub账号,再从自己账号下git clone到本地,例如:
人气极高的开源CSS框架项目地址:https://github.com/twbs/bootstrap

打开Git Bash
|
1 |
$ git clone git@github.com:StarryLeo/bootstrap.git |
使用Win的,建议克隆到其他非系统盘,不然你的C盘迟早要炸,完成后即可再本地修改开源项目。
写在最后
花了好几天的时间,比较系统的学习了Git,不枉费这几天边看教程边搜索,边实战边写博,感觉自己对Git总算有了比较全面的认识,不过对Git的使用才刚刚开始。 ![]()
主要参考以下Git教程,十分感谢!!
References











发表评论