工作中能派上用场的GIT命令和HUB命令

作者:natsu1211
同时发布于:http://www.longgaming.com/archives/256
转载请注明

介绍一些工作中能够派上用场的,比起git入门更为实践的一些命令

1.想修改前一个commit的message的时候

git commit --amend
这个大家应该都用过。

2.想要修改之前多个commit的时候

个人在工作中倾向于在比较小的粒度上进行commit,加上不是那么严谨的commit message,最后丢pull request进行code review之前,进行一次rebase将commit的履历弄得漂亮一些。这时候就需要
git rebase -i <commit hash>
之后会打开编辑器,可以对由所指定的commit之后所有的commit进行改变。需要注意的是越往上的commit越旧。
能看到有很多选项,个人比较常用的是fixup,就是将该commit的内容合并到比该commit旧的上一个commit中,message使用的是旧的commit的message。当然你也可以根据需要改变commit的顺序。还有edit可以修改commit本身的内容,在修改typo之类的小修改的时候特别有效。
另外要提醒的一点的是,进行了rebase的那个范围的commit的hash值是会改变的,如果中途merge了别的branch,又想改变merge之前该branch上的commit,千万别直接rebase。

3.想要修改最原始的root commit的时候

上面的介绍的rebase不加option的情况下只能修改到原始commit的后一个commit,这时候就需要
git rebase -i --root <commit hash>

4.想要清理未被git管理的文件时候

想要清理掉还没有被git track的文件的时候。注意这时候git reset --hard HEAD~是没有用的。
这时候我们需要git clean -f
因为是force的,所以不会有提醒。不放心的话可以先运行一次git clean -n,该命令能告诉你有什么文件会被删除

5.想把不需要的文件一次全部清理掉的时候

不管是被git管理的,还是未被git管理的文件,只要还未commit的内容都想一口气清理掉的时候。
git stash -u
git stash drop
算是stash的活用吧。

6.想把已经通过git add添加进stage里的内容进行unstage的时候

git checkout <filename>

7.想把commit取消的时候(还没有上传到远程仓库之前)

git reset HEAD~ 本地工作内容不会丢失,相当于恢复到git add前的状态。
git reset --hard HEAD~工作目录也将回复到前一个commit时的状态,这个命令会使本地的工作丢失。
注意这个只能用于本地工作还没有被别人merge的时候,否则需要使用revert。

8.commit的粒度太大,想要进行分割的时候

和2相反的情况。首先用git reset HEAD~把commit取消,然后
git add -p
进入交互模式选择需要add的hunk(可以理解为行),然后选择出需要commit的行后,
git commit -m <message>

重复上面的add和commit几次,就能将一个commit分割成几个小的commit。

9.想把commit取消的时候(已经上传到远程仓库,能被大家看见)

看过git pro的同学都知道,这时候就不能reset了,否则会把历史弄得一团糟。这时候需要
git revert <commit_want_to_cancel>
与其说是取消了目标commit,不如说revert会产生一个新commit,将目标commit的内容完全抵消了。

10.想修改pull request的commit历史的时候

在该pull request的branch上进行rebase,然后git push -f <remote> <branch>,虽然force push很危险,但是pull request在还没有被merge前是不会有什么影响的,所以公司没有明确禁止的话可以使用。

11.想修改branch名的时候

git branch -m <new_name>

12.想删除branch的时候

git branch -D <branch_name>
执行时应当是要先checkout到别的branch才行,说错勿怪。

13.在错误的branch上进行了commit的时候

工作中有时候会不小心忘记切换branch就开始写,写完commit完才发现branch不对。这时需要先创建新的feature branch,
git branch <feature_branch>
因为新branch是从该branch上创建的,就自然包含了需要的commit,然后将目前branch上的commit取消,
git reset --hard HEAD~
最后checkout到正确的branch上即可,
git checkout <feature_branch>

14.不小心将不该删除的commit内容删掉的时候

往往是因为错用git reset --hard HEAD~造成的。当然git的好处也在这,只要commit了就基本能找回来。
这时就要动用reflog了,先
git reflog查看想要恢复的commit,
然后
git reset --hard HEAD@{<number>}

15.不小心将不该删除的branch删掉的时候

同样也可以用reflog恢复。
git branch <restore_branch> HEAD@{<number>}

16.merge或者pull之后conflict,想恢复到merge之前的时候

merge,pull之后发现有conflict觉得果然暂时还是算了的话,
git reset --hard ORIG_HEAD

17.rebase之后conflict,想要解决的时候

merge之后conflict的解决方法大家应该都知道,把conflict的部分删掉后git add再commit就可以了。
其实rebase只是有些小区别,首先还是把conflict的地方解决掉,然后
git add <conflict_file>
git commit --amend
git rebase --continue

下面介绍一些提升工作效率的hub指令

首先hub是什么,请看这里。说白了就是一个git原生命令的包装,能让github相关的操作更为便捷。
比如大家都知道用git原生的命令来在本地测试别人的pull request的内容有多么麻烦,而用hub就轻松多的。

安装:

安装官网说明即可,mac用户直接brew install hub

1.hub clone

hub clone natsu1211/hoge
相当于
git clone git://github.com/natsu1211/hoge.git
省略用户名则clone当前用户的仓库

2.hub remote add

添加远程仓库的命令。
hub remote add natsu1211
相当于
git remote add natsu1211 git://github.com/natsu1211/<current_repo_name>.git

3.hub fetch

hub fetch natsu1211
相当于
git fetch natsu1211 git://github.com/natsu1211/<current_repo_name>.git

4.hub cherry-pick

在github看到某个好的特性,想直接拉下来试试的时候。
hub cherry-pick https://github.com/natsu1211/hoge/commit/a1981736f4667fb0c797c3b6f473b42db632d016
相当于
git remote add -f natsu1211 git://github.com/natsu1211/hoge.git
git cherry-pick a1981736f4667fb0c797c3b6f473b42db632d016
用过都知道。

5.hub fork

在clone下来的别人的repo目录下,执行该命令相当于在web端按下fork按钮,并且在本地添加该远程仓库。
hub fork
相当于
在github上进行当前repo的fork
git remote add -f <your_user_name> git@github.com:<your_user_name>/<current_repo_name>.git
也就是先在github上面fork当前操作目录下的同名仓库,然后以自己的用户名添加fork好的仓库为远程仓库

6.hub pull-request

命令行也能送pr。杀手级命令。特别是想让ci服务器来送pr的时候。
比如我们当前在本地的hoge repo下面,想从自己的hoge仓库feature1 branch向自己的hoge仓库的master branch送pull request(当然首先你得把本地的feature1 branch推送到远程hoge仓库上), 可以
hub pull-request -b natsu1211:master -h natsu1211:feature1
-b代表工作branch,-h代表目标branch。之后会打开编辑器,让输入pull request的说明。很多情况下我们应当是向别人的远程仓库发pull request,所以-b选项后面的用户名应当做相应的修改。
这里面做了很多工作,没有单纯对应的原生git命令。

7.hub checkout

当你作为一个开源项目管理者,有人送pr过来的时候,这个命令就能提升工作效率。
hub checkout htttps://github.com/natsu1211/hoge/pull/1
首先将送pull request过来的用户的同名仓库添加为远程仓库,然后checkout到该远程仓库相应的feature branch上面进行查看。非常方便。

8.hub create

已有本地仓库,想在github上创建同名的远程仓库时使用。
hub create
相当于
在github上创建同名仓库
git remote add origin git@github.com:<your_user_name>/<current_repo_name>.git
也就是先在github上创建同名仓库,然后将该仓库添加为远程仓库,名为origin。不用再去web端操作,相当便利。

9.hub push

该命令可以同时向多个远程仓库进行push。
hub push origin, qa, new-feature
不用过多解释了吧。

10.hub browse

该命令可以使浏览器打开该仓库的github相应页面。
git browse
相当于
open https://github.com/<your_user_name>/<curret_repo_name>

11.hub compare

使浏览器打开github上相应的diff页面(目前所在的branch和master branch的diff,当然也需要先push到远程仓库)。
hub compare
相当于
open https://github.com/<your_user_name>/<curret_repo_name>/compare/<current_branch_name>

最后用的oh-my-zsh的同学可以善用预设好的alias和hub补全插件,效率倍增。祝大家的git越玩越溜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值