觉得比较有用的一些git技巧

2020年12月20号 17:08 — Written by Z1206
#Web Development#Git#学习#WebDev

悉尼,又一个下雨的星期天。工作再忙也应该留给自己一点时间用来提高自己。翻看了一会Mosh的一些YouTube视频,看了一会他的git教程,觉得还学到了一些东西。今天我就坐下来整理一下一些git小技巧。

当代码农应该没有人会对git陌生,这是个我们每天都会用到的东西,介绍和初级入门的部分应该可以免去了,只写一些我最近发现的小技巧。

0. 温故知新

Git config flags:

  • system: all users.
  • global: all repositories of the current user.
  • local: the current repository.

1. 在自定义编辑器中编辑git信息

git默认采用vim编辑信息,考虑到vim陡峭的学习曲线,也许并不是所有人都喜欢使用它。不过我们可以在git设置中做一些修改在编辑git信息的时候默认采用我们最喜欢的IDE编辑器进行修改编辑。比如我们可以命令行中输入以下命令,设置成用vs code来编辑git的信息。

git config --global core.editor "code --wait"

其中--wait表示后台会在vs code打开之后等待,并在vs code关闭之后继续。

git的所有的操作其实都可以在它的设置文件里面直接修改,我们需要做的只是输入以下命令,并在打开的设置文件中进行自定义编辑,后面遇到的所有设置基本都可以采用这个方法来进行修改自定义。

git config --global -e

2. CR/LF 在不同的平台的处理

同一个repo如果是两个贡献者协作,并且俩人之中有人采用Windows另一个人采用Linux/Mac的话有时候换行符会成为问题。

Windows中的换行被处理为\r\n (Carriage Return, Line Feed),Mac中换行符被处理为\n (Line Feed)。因此如果我们有很多的协作者对同一个repo提交代码,我们最好做一些设置。

如果你采用的是Windows:

git config --global core.autocrlf true

如果你采用的是Linux/Mac:

git config --global core.autocrlf input

3. 查看帮助文件

这个也许比较多余,应该大多人都知道如何查看帮助文件。如果恰好你还不知道,那你可以通过以下方法查看帮助。

详细的帮助信息:

git config --help

简短的帮助信息:

git config -h

4. 给 .gitignore 添加新文件或者文件夹

也许你习惯打开该设置进行编辑,不过其实有个更简单的办法,可以将文件或者文件夹添加到.gitignore设置文件里面:

在repo根目录下输入以下命令:

echo filename.txt >> .gitignore

其中>>的意思为将内容插入到文件末尾(一个>意为输入,将会替换之前存在的内容)。

类似的你还可以添加文件夹或者文件格式pattern:

echo logs/ >> .gitignore echo *.log >> .gitignore

5. 查看git status

大多人肯定非常熟悉最简单的git status命令,但如果你只是想查看简短的状态,那你可以采用git status -s。如果你想查看staging area里面的修改,你可以采用git status --staged

如果你想在自己定义的IDE里面查看所作的修改,你可以在git config里面进行修改设置。

git config --global diff.tool vscode # `vscode`在这里只是一个名字,你可以替换成你想用的任何名字 git config --global difftool.vscode.cmd "code --wait --diff $LOCAL $REMOTE" # `--diff`表示你要查看改动,`$LOCAL`和`$REMOTE`表示旧和新两份代码的拷贝的placeholder

也许你可能会发现上一条命令没有设置好,那你可以通过git config --global -e在对应的位置再做一次设置修改。

设置好了之后你就可以通过git difftoolgit difftool --staged来查看所作的代码修改。

6. commit你做的修改

很多人习惯用git commit -m后面加一个简短的描述,这么做没有任何的问题,但是如果你想打开编辑器详细描述你做的修改,你可以简单地输入git commit,然后在打开的页面中进行详细描述(注意Line 1和Line 3之间的空换行):

A short description. A long description about the change # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch master # Your branch is up to date with 'origin/master'. # # Changes to be committed: # new file: filename.text #

大多人习惯先用add命令把修改的文件加入到staging area再进行commit,这是个好习惯,但如果你觉得所作的修改很小没有必要分开两步来做,那你也可以这么做:

git commit -a -m "fixed a bug" # or git commit -am "fixed a bug"

其中-a的意思为all。

7. 查看staging area

git ls-files

8. 从staging area移除文件

你可以采用rm filename.txt然后在用git add filename.txt,你也可以直接采用这个命令:

git rm filename.txt

如果你要移除多个文件,也可以采用pattern,比如以下的命令将移除所有的txt文件并更新staging area:

git rm *.txt

有时候我们会不小心把一些本应该忽略的文件添加到了staging area,我们希望保留该文件但同时想从staging area中移除它,那我们可以运行:

git rm --cached bin/app.bin # 如果是文件夹 git rm --cached -r bin/

9. 重命名文件并更新到staging area

和上一条类似,你可以采用:

git mv oldname.js newname.js

10. 查看git log

大多人已经很熟悉git log了。我们还有一些flag可以使用:

git log --oneline --reverse # `--oneline`表示每个commit log显示为一行,`--reverse`表示采用相反的时间顺序显示(先列出老的commits)

11. 查看具体的commit修改

我们可以采用git show来查看某个commit的具体修改内容。

比如我们有以下的commit history:

9d5fe9a (HEAD -> master, origin/master) add new post 5 e46360c add post 4 d236b87 add post 3 ec001a8 add post 2 ce6ebe9 add post 1 # 显示e46360c的改动 git show e46360c git show e46 # 显示HEAD的改动(add new post 5) git show HEAD # 显示HEAD之前一个commit的改动(add new post 4) git show HEAD~1 # 显示HEAD下面某个文件或者文件夹 git show HEAD:src

我们也可以采用git ls-tree,意思为list这个tree下面所有的files。

比如如果我们运行了git ls-tree HEAD~1后得到了:

100644 blob 770457f6335407b394df1c566ced2055f37a7347 LICENSE 100644 blob d3ec9f23ed9df4a4cdeb832fa9ab4c3e73f19572 README.md 040000 tree facf83fe33fa639af93d85e327fbabb5ef45124d archive

blob表示文件,tree表示文件夹,所以如果我们想查看某个具体的文件或者文件夹的内容,我们可以运行:

# 显示README.md的内容,通过其unique identifier(不需要打全,只要输入的部分和其他的uid不冲突即可) git show d3ec

11. git restore & git clean

如果我们想恢复某个修改的文件到初始状态,可以采用git restore filename.txt(我自己之前一直用git checkout filename.txt),如果想恢复所有的文件到初始状态,可以运行git restore .也可以用git checkout .。但是这个并不能移除掉我们新加的文件,因为对于git来讲这些新文件是untracked file,它的记忆里面并不存在这个文件。如果你想不仅恢复到最初的状态,并且移除那些新加入的文件,你可以运行git clean -fd,注意:git clean会提示报错,因为这是个危险的动作,需要你确认这么做的后果,所以我们要加上-f表示force强制执行,-d表示移除整个个directory。

12. 恢复错误删除的文件

我们习惯用revert或者undo commit来恢复被错误删除的文件,但我们也可以运行以下命令:

# 恢复HEAD之前一个commit的filename.txt文件 git restore --source=HEAD~1 filename.txt
Created by Z1206 © 2020