文章目录
接上篇: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
发表评论