我每天要用git敲很多命令,其中很多是重复了同样的流程。比如上班来到公司,先checkout到master,pull下来,checkout到自己的分支,rebase一下,以保证和master同步。我很懒,每天上班都在各种找办法偷懒,今天学到一招,可以自定义git命令。

自定义一个命令分三步:

  • 写一个脚本,放到PATH的路径下,脚本名字是git-command
  • 编辑脚本
  • 增加执行权限

下面举一个例子。我经常要做的操作是,提了一个PR,然后测试,review出现问题,改一下自己的commit,再提交一下。对于flake8和lint错误,一般用ammend,流程如下:

ZSH

1

2

3

git add -A

git commit --amend --no-edit

git push -f

第一步。通过echo $PATH命令可以看你的执行路径,这里以/usr/bin为例。(其实更好的方法是将用户命令和系统命令分开,我的自定义脚本路径是~/bin/。)

ZSH

1

sudo touch /usr/bin/git-amd

第二步,在脚本写以下内容,保存退出。(脚本也支持python ruby等)

ZSH

1

2

3

4

5

#!/bin/zsh

git add -A

git commit --amend --no-edit

git push -f

第三步,增加执行权限。

ZSH

1

sudo chmod +x /usr/bin/git-cmd

完成,现在修改一些小问题,我们可以直接修改之后使用git cmd命令推送更新了。(注意这个命令用到-f推送所以有点危险不建议学我)

另外还有一个偷懒的办法是alias。这里的alias不需要使用shell的,git提供了这个feature。直接在~/.gitconfig路径下对git的子命令进行alias即可。如下面这个.gitconfig文件所示:

YAML

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

[user]

name = Your Name

email = your.name@mail.com

[color]

ui = true

[core]

    excludesfile = ~/.gitignore_global

    editor = /usr/local/bin/mvim -f

[mergetool "p4merge"]

    cmd = p4merge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"

    keepTemporaries = false

    trustExitCode = false

    keepBackup = false

[diff]

    tool = opendiff

    #external = p4diff

    #external = meldDiff

[github.com]

    user = github-username

    token = your-token

[java.net]

    user = username

[color]

    diff = auto

    branch = auto

    status = auto

[http]

    sslVerify = false

[alias]

    st = status

    d = diff --color-words

    dw = diff --word-diff

    ci = commit -v

    cia = commit -v -a

    ca = commit -a -m

    co = checkout -b

    cp = cherry-pick

    l = log

    ll = log -p

    lod = log --oneline --decorate

    lgraph = log --oneline --decorate --graph

    b = branch

    pom = push origin master

    pullit = pull --rebase

    ads = submodule add

    rem = remote add origin

    headless = !sh -c 'git symbolic-ref HEAD refs/heads/$0 && rm .git/index && git clean -fdx'

    unstash = stash branch

[git-tmbundle]

gitx-path = /Applications/GitX.app

[push]

default = simple

[commit]

template = /Users/youuser/.gitmessage.txt