实用Git快捷命令

Photo by Roman Synkevych 🇺🇦 on Unsplash

在我们使用Git作为版本管理的时候,可以将一些经常使用的操作命令或者命令组合通过别名的方式添加git alias或者shell alias以此来缩短输入,减少git command help的时间,提高开发效率。

添加别名的方式主要分为两种:

1、git alias

以Mac OS为例,在当前用户目录下的.gitconfig文件中添加alias模块,

[http]
        cookiefile = /Users/xxx/.gitcookies
[color]
        ui = auto
[user]
        name = nitro hsu
[alias]
        xxx = ...

在alias下添加对应的操作指令组合或者快捷操作指令,使用时键入:git xxx

2、shell alias

以Mac OS的默认zsh为例,在当前用户目录下的.zshrc文件中添加对应alias命令或者函数,

alias grcd='cd $(git root)'

使用时终端键入:grcd

下面介绍几个经常使用的Git命令或者Git命令组合来提升我们的开发效率:

1、导航到当前Git仓库的根目录

这个命令在查看某些文件后想回到根目录时不用再通过cd一级级的返回或者记忆绝对目录位置,

// git alias
[alias]
    root = rev-parse --show-toplevel

// shell alias
alias grcd='cd $(git root)'

2、设置远程跟踪分支

当我们在本地创建了分支以后如果需要推送到远程,大概率会直接调用git push推动到远程,此时如果没有设置本地分支与远程分支的对应关系,通常会出现如下报错:

fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

我们需要执行上述提示的命令设置本地分支与远程分支的对应关系,此时可以使用如下命令组合,读取当前分支自动关联远程分支,

// git alias
[alias]
    set-upstream = !git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`

symbolic-ref  HEAD,读取当前分支,默认返回refs/head/master,如果添加--short参数,只返回master;

--set-upstream-to,设置跟踪的远程分支;

3、更直观的查看分支

通过定制分支输出格式,添加颜色配置,更直观。

// git alias
[alias]
    branches = for-each-ref --sort=-committerdate --format=\"%(color:blue)%(authordate:relative)\t%(color:red)%(authorname)\t%(color:white)%(color:bold)%(refname:short)\" refs/remotes

for-each-ref,遍历所有分支

--sort=committerdate,以提交时间降序

refs/remotes,仅查看远程分支

refs/heads,仅查看本地分支

4、查看远程仓库文件的变化

有时我们需要追溯某个文件为什么被删除了、如何修改的、什么时候添加的,这些都可以通过log -diff-filter来处理。

// git alias
[alias]
    whatadded = log --diff-filter=A

--diff-filter,A=添加,D=删除,M=修改,R=重命名,支持组合,比如AD,同时查看添加&删除

5、查看当前分支与目标分支的差异

// shell alias
gbc() {
  git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative $@..$(git rev-parse --abbrev-ref HEAD)
}

gbbc() {
  git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative $(git rev-parse --abbrev-ref HEAD)..$@
}

gbc,查看当前分支有但目标分支没有的差异;

gbbc,查看目标分支但当前分支没有的差异;

--pretty,输出格式

--date=relative,输出相对时间

$@,目标输入分支

--abbrev-ref,输出短的commit-hash

5、rebase当前分支

更新并rebase当前分支

// shell alias
gqrb() {
    git set-upstream
    git fetch origin "$@:$@" && git pull && git rebase "$@"
}

先fetch代码,然后pull代码,再做rebase。

参考资料:

Powerful Git Macros For Automating Everyday Workflows
Improve your everyday git workflows by automating the boring stuff.