title

从0开始学习 GitHub 系列之「Git 进阶」

[复制链接]
发表于 2017-10-2 07:25:50 | 显示全部楼层 |阅读模式
1487219431-2532-Cia80iapTM915Xr0PJoZKWib2icA.jpg

阅读本文大要需要 5 分钟。

关于 Git 相信大师看了之前一系列的文章已经初步会利用了, 可是关于Git还有很多常识与技能是你不晓得的,明天就来给大师先容下一些 Git 进阶的常识。

1用户名和邮箱

我们晓得我们停止的每一次 commit 城市发生一条 log,这条 log 标志了提交人的姓名与邮箱,以便其他人方便的检察与联系提交人,所以我们在停止提交接码的第一步就是要设备自己的用户名与邮箱。履行以下代码:

git config --global user.name "stormzhang"

git config --global user.email "stormzhang.dev@gmail.com"

以上停止了全局设置,固然有些时辰我们的某一个项目想要用特定的邮箱,这个时辰只需切换到你的项目目录,以上代码把 --global 参数去除,再重新履行一遍就ok了。

PS:我们在 GitHub 的每次提交理论上城市在主页的下面发生一条绿色小方块的记录,假如你确认你提交了,可是没有绿色方块显现,那必定是你提交接码设置的邮箱跟你 GitHub 上的邮箱纷歧致,GitHub 上的邮箱可以到Setting -> Emails 里检察。

2alias

我们晓得我们履行的一些 Git 号令实在操纵很频仍的类似有:

git commit

git checkout

git branch

git status

...

这些操纵很是频仍,每次都要输入美满能否是有点麻烦,有没有一种简单的缩写输入呢?比如我想间接输入以下号令取代:

git c

git co

git br

git s

...

能否是很简单快速啊?这个时辰就用到了 alias 了,翻译过来就是别名的意义,输入以下号令便可以间接满足以上的需求。

git config --global alias.co checkout # 别名

git config --global alias.ci commit

git config --global alias.st status

git config --global alias.br branch

固然以上别名不是牢固的,你完全可以按照自己的习惯去定制,除此之外还可以设备组合,比如:

git config --global alias.psm 'push origin master'

git config --global alias.plm 'pull origin master'

以后经常用到的 git push origin mastergit pull origin master 间接就用 git psmgit plm 取代了,能否是很方便?

别的这里给大师保举一个很强大的 alias 号令,我们晓得我们输入 git log检察日志的时辰是类似这样的:

1487219431-7044-uy5AMVA6LQXoQfDsE6ZQklYvBwGQ.jpg

告诉大师一个比力屌的号令,输入

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

然后日志这样了:

1487219431-6041-AUsmzYeXZjwticU5aIbXicm2MqcQ.jpg

能否是比力清楚,全部分支的走向也很明白,可是每次都要输这么一大串能否是也很烦?这时辰你就该想到 alias 啊:

git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"

这样今后间接输入 git lg 就行了。

3其他设置

固然还有一些其他有用的设置,默许情况下 git 用的编辑器是 vi ,假如不喜好可以改成其他编辑器,比如我习惯 vim 。

git config --global core.editor "vim" # 设备Editor利用vim

你们假如喜好其他编辑器可自行搜索设置,条件是本机有安装。

有些人疑惑我的终端怎样有各类色彩显现,自己却不是这样的,那是由于你们没有开启给 Git 输出着色,输入以下号令即可:

git config --global color.ui true

还有些其他的设置如:

git config --global core.quotepath false # 设备显现中文文件名

以上的设置根基就差不多了,默许这些设置都在 ~/.gitconfig 文件下的,你可以找到这个文件检察自己的设置,也可以输入 git config -l 号令检察。

4diff

diff 号令算是很常用的,利用处景是我们经常在做代码修改,可是有的时辰2天前的代码了,做了哪些修改都忘记了,在提交之前需要确认下,这个时辰便可以用diff来检察你到底做了哪些修改,举个例子,比如我有一个 a.md 的文件,我现在做了一些修改,然后输入 git diff 就会看到以下:

1487219431-6313-Pdr9jjSksIrrxvvCfaKquxhHq8BQ.jpg

红色的部分前面有个 - 代表我删除的,绿色的部分前面有个 + 代表我增加的,所以从这里你们能了如指掌的晓得我到底对这个文件做了哪些修改。

值得一提的是间接输入 git diff 只能比力当前文件缓和存区文件差别,什么是缓存区?就是你还没有履行 git add 的文件。

固然跟暂存区做比力之外,他还可以有其他用法,如比力两次 commit 之间的差别,比力两个分支之间的差别,比力缓存区和版本库之间的差别等,具体用法以下:

git diff <$id1> <$id2> # 比力两次提交之间的差别

git diff <branch1>..<branch2> # 在两个分支之间比力

git diff --staged # 比力暂存区和版本库差别

5checkout

我们晓得 checkout 一般用作切换分支利用,比如切换到 develop 分支,可以履行:

git checkout develop

可是 checkout 不但用作切换分支,他可以用来切换 tag,切换到某次 commit,如:

git checkout v1.0

git checkout ffd9f2dd68f1eb21d36cee50dbdd504e95d9c8f7

# 前面的一长串是commit_id,是每次commit的SHA1值,可以按照 git log 看到。

除了有“切换”的意义,checkout 还有一个撤消的感化,举个例子,假定我们在一个分支开辟一个小功用,刚写完一半,这时辰需求变了,而且是大变化,之前写的代码完全用不了了,幸亏你刚写,甚至都没有 git add 进暂存区,这个时辰很简单的一个操纵就间接把原文件复原:

git checkout a.md

这里稍微提下,checkout 号令只能撤消还没有 add 进暂存区的文件。

6stash

设想一个场景,假定我们正在一个新的分支做新的功用,这个时辰忽然有一个告急的bug需要修复,而且修复完以后需要立即公布。固然你说我先把刚写的一点代码停止提交不就行了么?这样理论上固然是ok的,可是这会产物渣滓commit,原则上我们每次的commit都要有现实的意义,你的代码只是刚写了一半,还没有什么现实的意义是不倡议就这样commit的,那末有没有一种比力好的法子,可以让我临时切到此外分支,修复完bug再切返来,而且代码也能保存的呢?

这个时辰 stash 号令就大有用处了,条件是我们的代码没有停止 commit ,哪怕你履行了 add 也没关系,我们先履行

git stash

什么意义呢?就是把当前分支一切没有 commit 的代码先暂存起来,这个时辰你再履行 git status 你会发现当前分支很清洁,几近看不到任何修改,你的代码修改也看不见了,但实在是暂存起来了。履行

git stash list

你会发现此时暂存区已经有了一笔记录。

这个时辰你可以切换回其他分支,赶紧把bug修复好,然后公布。以后一切都处理了,你再切换返来继续做你之前没做完的功用,可是之前的代码怎样复原呢?

git stash apply

你会发现你之前的代码全数又返来了,就似乎一切都没发生过一样,紧接着你最好需要把暂存区的此次 stash 记录删除,履行:

git stash drop

就把比来一条的 stash 记录删除了,能否是很方便?实在还有更方便的,你可以利用:

git stash pop

来取代 apply 号令,pop 跟 apply 的唯一区分就是 pop 不单会帮你把代码复原,还自动帮你把这条 stash 记录删除,省的自己再 drop 一次了,虽然更方便,可是利用起来也需要加倍谨慎,为了考证你可以紧接着履行 git stash list 号令来确认能否是已经没有该记录了。

最初还有一个号令先容下:

git stash clear

就是清空一切暂存区的记录,drop 是只删除一条,固然前面可以跟 stash_id 参数来删除指定的某笔记录,不跟参数就是删除比来的,而 clear是清空。

7merge & rebase

我们晓得 merge 分支是合并的意义,我们在一个 featureA 分支开辟完了一个功用,这个时辰需要合并到主分支 master 上去,我们只需要停止以下操纵:

git checkout master

git merge featureA

实在 rebase 号令也是合并的意义,上面的需求我们一样可以以下操纵:

git checkout master

git rebase featureA

rebasemerge 的区分你们可以了解成有两个书架,你需要把两个书架的书整理到一路去,第一种做法是 merge ,比力粗鲁暴力,就间接腾出一块地方把另一个书架的书全数放进去,虽然暴力,可是这类做法你可以晓得哪些书是来自另一个书架的;第二种做法就是 rebase ,他会把两个书架的书先辈行比力,依照购书的时候来给他重新排序,然后重新放置好,这样做的益处就是合并以后的书架看起来很有逻辑,可是你很难清楚的晓得哪些书来自哪个书架。

只能说各有益处,分歧的团队按照分歧的需要以及分歧的习惯来挑选就好。

8处理抵触

假定这样一个场景,A和B两位同学各自开了两个分支来开辟分歧的功用,大部分情况下城市只管互不干扰的,可是有一个需求A需要修改一个根本库中的一个类的方式,不巧B这个时辰由于营业需要也修改了根本库的这个方式,由于这类情况比力特别,A和B都以为不会对他人形成影响,等两人各自把功用做完了,需要合并的到主分支 master 的时辰,我们假定先合并A的分支,这个时辰没题目标,以后再继续合并B的分支,这个时辰想想也晓得会有抵触了,由于A和B两小我同时变动了同一个地方,Git 自己他没法判定你们两个谁变动的对,可是这个时辰他会智能的提醒有 conflicts ,需要手动处理这个抵触以后再重新停止一次 commit 提交。我随意在项目搞了一个抵触做下示例:

1487219431-8366-cR6n9kfKhIjtNXT82bzkbvsZEdjQ.jpg

以上截图里就是抵触的示例,抵触的地方由 ==== 分出了高低两个部分,上部分一个有 HEAD 的字样代表是我当前地点分支的代码,下半部分是一个叫 baidu_activity分支的代码,可以看到 HEAD 对 gradle 插件停止了升级,同时新增了一个插件,所以我们很轻易判定哪些代码该保存,哪些代码该删除,我们只需要移撤除那些老旧代码,而且同时也要把那些 <<< HEAD==== 以及 >>>>>>baidu_activity 这些标志标记也一并删除,最落后行一次 commit 就ok了。

我们在开辟的进程中一般城市约定只管大师写的代码不要相互影响,以削减出现抵触的能够,可是抵触总归没法避免的,我们需方法会并把握处理抵触的方式。

文章作者:stormzhang



回复

使用道具 举报

发表于 2018-8-5 14:07:17 | 显示全部楼层
感谢分享,正好需要这个课程
回复

使用道具 举报

发表于 2018-9-5 23:28:51 | 显示全部楼层
非常好非常好非常好非常好非常好非常好非常好
回复

使用道具 举报

发表于 2018-10-23 13:11:30 | 显示全部楼层
感谢分享,一直想学习这,不错不错
回复

使用道具 举报

发表于 2018-10-30 16:18:43 | 显示全部楼层
学习学习学习学习学习学习
回复

使用道具 举报

发表于 2018-11-22 14:47:23 | 显示全部楼层
论坛视频真全,谢谢分享喽
回复

使用道具 举报

发表于 2018-11-27 16:42:33 | 显示全部楼层
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
回复

使用道具 举报

发表于 2019-6-19 16:33:11 | 显示全部楼层
非常好的资源,感谢楼主的分享,
回复

使用道具 举报

发表于 2019-11-2 02:07:48 | 显示全部楼层
非常好的资源,感谢楼主的分享
回复

使用道具 举报

发表于 2019-11-11 21:07:24 | 显示全部楼层
Good!支持
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表