admin 发表于 2017-10-2 07:25:50

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




data/attachment/forum/img/085237a7effata6ashkfek.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 master 和 git pull origin master 间接就用 git psm 和 git plm 取代了,能否是很方便?
别的这里给大师保举一个很强大的 alias 号令,我们晓得我们输入 git log检察日志的时辰是类似这样的:


data/attachment/forum/img/085238v637lecjjqu336wh.jpg


告诉大师一个比力屌的号令,输入
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%Creset' --abbrev-commit --date=relative
然后日志这样了:


data/attachment/forum/img/155643uaym24kkoziil46a.jpg


能否是比力清楚,全部分支的走向也很明白,可是每次都要输这么一大串能否是也很烦?这时辰你就该想到 alias 啊:
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%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 号令检察。
4diffdiff 号令算是很常用的,利用处景是我们经常在做代码修改,可是有的时辰2天前的代码了,做了哪些修改都忘记了,在提交之前需要确认下,这个时辰便可以用diff来检察你到底做了哪些修改,举个例子,比如我有一个 a.md 的文件,我现在做了一些修改,然后输入 git diff 就会看到以下:


data/attachment/forum/img/155643vbbhqozkguggc5cl.jpg


红色的部分前面有个 - 代表我删除的,绿色的部分前面有个 + 代表我增加的,所以从这里你们能了如指掌的晓得我到底对这个文件做了哪些修改。
值得一提的是间接输入 git diff 只能比力当前文件缓和存区文件差别,什么是缓存区?就是你还没有履行 git add 的文件。
固然跟暂存区做比力之外,他还可以有其他用法,如比力两次 commit 之间的差别,比力两个分支之间的差别,比力缓存区和版本库之间的差别等,具体用法以下:
git diff # 比力两次提交之间的差别
git diff
..
# 在两个分支之间比力
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
rebase 跟 merge 的区分你们可以了解成有两个书架,你需要把两个书架的书整理到一路去,第一种做法是 merge ,比力粗鲁暴力,就间接腾出一块地方把另一个书架的书全数放进去,虽然暴力,可是这类做法你可以晓得哪些书是来自另一个书架的;第二种做法就是 rebase ,他会把两个书架的书先辈行比力,依照购书的时候来给他重新排序,然后重新放置好,这样做的益处就是合并以后的书架看起来很有逻辑,可是你很难清楚的晓得哪些书来自哪个书架。
只能说各有益处,分歧的团队按照分歧的需要以及分歧的习惯来挑选就好。
8处理抵触假定这样一个场景,A和B两位同学各自开了两个分支来开辟分歧的功用,大部分情况下城市只管互不干扰的,可是有一个需求A需要修改一个根本库中的一个类的方式,不巧B这个时辰由于营业需要也修改了根本库的这个方式,由于这类情况比力特别,A和B都以为不会对他人形成影响,等两人各自把功用做完了,需要合并的到主分支 master 的时辰,我们假定先合并A的分支,这个时辰没题目标,以后再继续合并B的分支,这个时辰想想也晓得会有抵触了,由于A和B两小我同时变动了同一个地方,Git 自己他没法判定你们两个谁变动的对,可是这个时辰他会智能的提醒有 conflicts ,需要手动处理这个抵触以后再重新停止一次 commit 提交。我随意在项目搞了一个抵触做下示例:


data/attachment/forum/img/190506ezq9s99e9inki1l9.jpg


以上截图里就是抵触的示例,抵触的地方由 ==== 分出了高低两个部分,上部分一个有 HEAD 的字样代表是我当前地点分支的代码,下半部分是一个叫 baidu_activity分支的代码,可以看到 HEAD 对 gradle 插件停止了升级,同时新增了一个插件,所以我们很轻易判定哪些代码该保存,哪些代码该删除,我们只需要移撤除那些老旧代码,而且同时也要把那些 >>>>>baidu_activity 这些标志标记也一并删除,最落后行一次 commit 就ok了。
我们在开辟的进程中一般城市约定只管大师写的代码不要相互影响,以削减出现抵触的能够,可是抵触总归没法避免的,我们需方法会并把握处理抵触的方式。
文章作者:stormzhang
页: [1]
查看完整版本: 从0开始学习 GitHub 系列之「Git 进阶」