觉得比较有用的一些git技巧
悉尼,又一个下雨的星期天。工作再忙也应该留给自己一点时间用来提高自己。翻看了一会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 difftool
和git 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