StarryCat
Astronomy
喵喵的灿烂星空

Git学习笔记(下)

接上篇:Git基础和GitHub

分支管理

这部分的内容相对较难,也是我过去没记住的,但感觉这是Git的一个核心,需要好好理解。

每次commit形成一个点,这些点按时间先后顺序连成一条线,一个“快照流”,目前线只有一条,在Git中称为master分支。指针HEAD指向mastermaster指向提交点,那么HEAD指向的就是当前分支。

分支的创建与合并

创建新分支dev,Git新建指针dev,指向了master的提交点,再切换到dev分支,即让指针HEAD指向dev分支:

或者使用-b参数完成:

使用命令git branch查看分支(加上参数-a查看远程分支):

https://starrycat.me/wp-content/uploads/2018/08/04_034.png

*标识当前分支

现在我们可以在dev分支作正常提交,例如修改readme.txt文件并提交:

https://starrycat.me/wp-content/uploads/2018/08/04_035.png

dev分支工作完成,现在我们切换回master分支,此时master的提交点还在过去的点,我们还要把dev的工作成果合并到master分支:

https://starrycat.me/wp-content/uploads/2018/08/04036.png

命令git merge用于合并指定分支到当前分支,“快进模式”(Fast-forward)表示直接把master指向dev的当前提交点,仅是指针移动,所以速度很快。

合并完成后可放心删除dev分支:

删除远程分支为远程当前分支错误解决(更新)

点击打开折叠
keyboard_arrow_down

删除远程分支

若出现以下类似错误

说明删除远程的分支为远程当前分支,到GitHub远程库Settings>>Branches修改远程库当前分支后即可顺利删除。

https://starrycat.me/wp-content/uploads/2018/08/04037.png

解决分支冲突

新建并切换至feature1分支,修改readme.txt文件并提交,切换到master分支:

https://starrycat.me/wp-content/uploads/2018/08/04038.png

Git还会自动提示了当前master分支比远程的master分支要超前一个提交点。再修改readme.txt文件并提交,此时master分支和feature1分支都有了各自的新提交,这样Git是无法以“快进模式”执行合并,可能会发生冲突:

https://starrycat.me/wp-content/uploads/2018/08/04039.png

readme.txt文件发生了冲突,自动合并失败,这时需要手动解决冲突再提交合并。使用命令git status可以查看冲突的文件:

https://starrycat.me/wp-content/uploads/2018/08/04040.png

现在我们来查看readme.txt文件:

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们再修改readme.txt文件并提交:

https://starrycat.me/wp-content/uploads/2018/08/04041.png

带参数的git log查看分支的合并情况:

https://starrycat.me/wp-content/uploads/2018/08/04042.png

最后删除feature1分支:

工作完成。

分支管理策略

合并分支时Git默认使用“快进模式”,删除分支后会丢失分支信息。如果要强制禁用“快进模式”,Git就会在合并时生成一个新的commit(记得带上-m参数添加描述),这样我们可以从分支历史看到分支信息。

在使用命令git merge合并时,加上--no-ff参数即可用普通模式合并分支:

https://starrycat.me/wp-content/uploads/2018/08/04045.png

分支策略:master分支应稳定,用来发布新版本,dev分支不稳定,用来工作,每个人的工作分支往dev分支合并。

Bug分支

当你在dev分支上工作,工作没有完成提交,但突然有一个紧急修复Bug的任务issue-101,可以通过Git提供的stash功能把当前工作现场“储藏”,等待完成修Bug任务后恢复继续工作。

https://starrycat.me/wp-content/uploads/2018/08/04051.png

现在工作区是“干净”的,可以放心创建分支来修复Bug。假设需要在master分支修复Bug,就从master分支创建临时分支:

https://starrycat.me/wp-content/uploads/2018/08/04052.png

Bug修复完成,现在回到dev分支继续工作,使用命令git stash list查看:

https://starrycat.me/wp-content/uploads/2018/08/04053.png

现在恢复工作现场(两种方法):

https://starrycat.me/wp-content/uploads/2018/08/04055.png

Feature分支

假设开发实验性新功能Vulcan,新建Feature分支在上面工作,不影响主分支。

https://starrycat.me/wp-content/uploads/2018/08/04056.png

在合并到dev前突然被告知不需要新功能,必须删除该Feature分支,使用-D参数为强制删除:

https://starrycat.me/wp-content/uploads/2018/08/04057.png

多人协作

查看远程库信息:

https://starrycat.me/wp-content/uploads/2018/08/04058.png

推送分支:

如果自己玩,同不同步自选。

抓取分支(另一人抓取你的):

默认情况下,他只能看到master分支,他要在dev分支工作,必须创建远程origindev分支到本地:

现在,他可以在dev分支上工作,可以把dev分支push到远程库。如果有冲突查看说明解决就好啦。

同步 Fork 上游(更新)

点击打开折叠
keyboard_arrow_down

添加 Fork 源仓库为上游远程仓库

合并上游远程仓库到自己的 Fork 仓库

使用子模块 gitmodules(更新)

点击打开折叠
keyboard_arrow_down

主仓库添加其他仓库作为子模块

git clone 含有子模块的项目

Git-工具-子模块

使用 rebase(更新)

点击打开折叠
keyboard_arrow_down

使用 rebase (即“变基”)可以整理 commit 历史,例如将多个 commit 合并为一个 commit等[1]

当操作的 commit 范围包括分支合并(merge)历史时,使用 --rebase-merges 参数[2]

标签管理

切换至要打标签的分支,使用命令git tag <name>即可打上新标签:

https://starrycat.me/wp-content/uploads/2018/08/04060.png

查看所有标签:

默认标签是打在最新的commit上的,要打在历史commit可以使用git log查询commit_id,如下:

https://starrycat.me/wp-content/uploads/2018/08/04061.png

删除本地标签:

推送标签至远程库:

删除远程库标签:

是否删除成功登陆GitHub查看。

使用GitHub

要参与一个开源项目,先Fork项目到自己的GitHub账号,再从自己账号下git clone到本地,例如:

人气极高的开源CSS框架项目地址:https://github.com/twbs/bootstrap

https://starrycat.me/wp-content/uploads/2018/08/04070-1024x487.pnghttps://starrycat.me/wp-content/uploads/2018/08/04072-1024x487.png

打开Git Bash

https://starrycat.me/wp-content/uploads/2018/08/04073.png

使用Win的,建议克隆到其他非系统盘,不然你的C盘迟早要炸,完成后即可再本地修改开源项目。

写在最后

花了好几天的时间,比较系统的学习了Git,不枉费这几天边看教程边搜索,边实战边写博,感觉自己对Git总算有了比较全面的认识,不过对Git的使用才刚刚开始。 :cry:

主要参考以下Git教程,十分感谢!!

Git教程 – 廖雪峰的官方网站

Git – Book

 

赞赏

发表评论

textsms
account_circle
email

喵喵的灿烂星空

Git学习笔记(下)
接上篇:Git基础和GitHub 分支管理 这部分的内容相对较难,也是我过去没记住的,但感觉这是Git的一个核心,需要好好理解。 每次commit形成一个点,这些点按时间先后顺序连成一条线…
扫描二维码继续阅读
2018-08-24