Git命令使用遇到的那些坑收集

Git命令使用遇到的那些坑

Git是一款强大的版本管理工具,网上有很多Git教程,但是很多资料让人一知半解,不得要领。所以,还是阅读Git官方使用教程https://git-scm.com/book/zh/v2,或者通过终端git help命令来仔细研究各个命令,然后积累经验,熟能生巧。记住,踩坑是成长的必由之路!

配置Git

Git使用一系列配置文件来保存你自定义的行为。 它首先会查找/etc/gitconfig 文件,该文件含有系统里每位用户及他们所拥有的仓库的配置值。 如果你传递–system选项给git config,它就会读写该文件。

接下来Git会查找每个用户的~/.gitconfig文件(或者~/.config/git/config文件)。 你可以传递–global选项让Git读写该文件。

最后 Git 会查找你正在操作的版本库所对应的 Git 目录下的配置文件(.git/config)。 这个文件中的值只对该版本库有效。

以上三个层次中每层的配置(系统、全局、本地)都会覆盖掉上一层次的配置,所以.git/config 中的值会覆盖掉/etc/gitconfig中所对应的值。

Note:
Git的配置文件是纯文本的,所以你可以直接手动编辑这些配置文件,输入合乎语法的值。 但是运行git config命令会更简单些。

客户端配置

Git 能够识别的配置项分为两大类:客户端和服务器端。 其中大部分属于客户端配置——可以依你个人的工作偏好进行配置。尽管Git支持的选项 繁多,但其中大部分仅仅在某些罕见的情况下有意义。 我们只讲述最平常和最有用的选项。 如果想得到你当前版本的 Git 支持的选项列表,请运行

$ man git-config

这个命令列出了所有可用的选项,以及与之相关的介绍。 你也可以在 http://git-scm.com/docs/git-config.html 找到同样的内容。

  • core.editor
    默认情况下,Git 会调用环境变量($VISUAL 或 $EDITOR)设置的任意文本编辑器,如果没有设置,会调用vi来创建和编辑你的提交以及标签信息。 你可以使用core.editor选项来修改默认的编辑器:

$ git config –global core.editor emacs

现在,无论你定义了什么终端编辑器,Git都会调用Emacs编辑信息。

Note:
如果是在windows系统下,比如设置编辑器为VS code,可能会遇到各种坑。

坑1: git config --global core.editor D:\Program Files (x86)\Microsoft VS Code\Code.exe,此时会报错bash: syntax error near unexpected token `(‘,表明git bash里面不支持(符号,因此得想办法回避这个问题;

坑2:在踩过坑1,可能会git config --global core.editor "D:\Program Files (x86)\Microsoft VS Code\Code.exe",即用英文的引号将VS code的路径包裹起来,这样不会确实不会报错了。但是当git commit或其他编辑的时候,报错如下:

$ git config --global --edit
D:\Program Files (x86)\Microsoft VS Code\Code.exe: -c: line 0: syntax error near unexpected token `('
D:\Program Files (x86)\Microsoft VS Code\Code.exe: -c: line 0: `D:\Program Files (x86)\Microsoft VS Code\Code.exe "$@"'
error: There was a problem with the editor 'D:\Program Files (x86)\Microsoft VS Code\Code.exe'.

表明,其实真正在执行的时候还是无法绕过(符号。因此不能直接使用这样的路径。得想其他办法,比如设置上面提到的$VISUAL 或 $EDITOR,将VS Code的路径赋值进去;或者将VS Code的路径添加到PATH环境变量里面。

坑3:在坑2的基础上,改用git config --global core.editor code,然后git commit或其他编辑的时候,VS Code编辑器确实被自动打开了,但是commit的时候却提示:

$ git commit
Aborting commit due to empty commit message.

这是因为git commit的工作原理如下:

1.创建新的编辑器进程;
2.将COMMIT_EDITMSG文件传递给这个进程(可阻塞等待进程结束,也可直接返回,这里取决于配置时的参数);
3.读取COMMIT_EDITMSG文件。

关键在第二步,这种情况下,默认是没有等待VS Code进程结束就直接返回,而此时COMMIT_EDITMSG还并没有编辑,所以才是empty commit message,从而导致退出commit操作。
此时,我们可以使用git config --global core.editor "code -w",-w参数表示阻塞commit并等待VS Code进程结束。这样就成功解决了问题。

Note:
最后发现,其实也可以直接在全局的.gitconfig文件(可以搜索找到它,一般情况下路径是%HOME%.gitconfig)里面直接编辑如下格式来解决上述问题。请注意必须在路径前后加上转义的引号,即"D:/Program Files (x86)/Microsoft VS Code/Code.exe"是不行的。
[core]
editor = “\”D:/Program Files (x86)/Microsoft VS Code/Code.exe\””