2021-06-27 19:12:37 +08:00
[#]: collector: "lujun9972"
[#]: translator: "BoosterY"
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
[#]: subject: "7 Git tricks that changed my life"
[#]: via: "https://opensource.com/article/20/10/advanced-git-tips"
[#]: author: "Rajeev Bera https://opensource.com/users/acompiler"
七个改变我生活的 Git 小技巧
2020-12-04 22:26:30 +08:00
======
2021-06-27 19:12:37 +08:00
接下来这些有用的小技巧将改变你在当前最流行的版本控制系统下的工作方式。
![Computer screen with files or windows open][1]
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
Git 是当前可用的最流行最普遍的版本控制系统之一,它被应用于私有系统和公有网站上各种各样的开发工作。不论我变得对 Git 有多熟悉,似乎总有些功能等待着被发掘。下面分享下和 Git 相关的改变我工作方式的一些小技巧。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
### 1\. Git 中的自动纠错
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
我们每个人都不时在输入时犯拼写错误,但是如果你使能了 Git 的自动纠错功能,你就能让 Git 自动纠正一些输入错误的子命令。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
假如你想用命令`git status`来检查状态,但是你恰巧错误地输入了 `git stats` 。通常情况下, Git会告诉你 ‘ stats’ 不是个有效的命令:
2020-12-04 22:26:30 +08:00
```
$ git stats
git: ‘ stats’ is not a git command. See ‘ git --help’ .
The most similar command is
status
```
2021-06-27 19:12:37 +08:00
为了避免类似情形,只需要在你的 Git 配置中使能自动纠错功能。
2020-12-04 22:26:30 +08:00
```
`$ git config --global help.autocorrect 1`
```
2021-06-27 19:12:37 +08:00
如果你只想对当前的仓库生效,就省略掉选项`--global`。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
这个命令会使能自动纠错功能。在相应的 [Git 官方文档][2] 中可以看到这个命令的详细说明,但是试着敲一下上面的错误命令会使你对这个设置干了什么有个直观的了解:
2020-12-04 22:26:30 +08:00
```
$ git stats
git: ‘ stats’ is not a git command. See ‘ git --help’ .
On branch master
Your branch is up to date with ‘ origin/master’ .
nothing to commit, working tree clean
```
2021-06-27 19:12:37 +08:00
在上面的例子中, Git 直接运行了它建议命令的第一个,也就是 **git status** ,而不是给你展示它所建议的子命令。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
### 2\. 提交计数
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
需要对提交进行计数的原因有很多。例如,一些开发人员利用提交计数来判断什么时候递增工程构建序号,也有一些开发人员用提交计数来对项目进展取得一个整体上的感观。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
对提交进行计数相当简单而且直接,下面就是相应的 Git 命令:
2020-12-04 22:26:30 +08:00
```
2021-06-27 19:12:37 +08:00
`$ git rev-list --count branch-name`
2020-12-04 22:26:30 +08:00
```
2021-06-27 19:12:37 +08:00
在上述命令中,参数 **branch-name** 必须是一个你当前仓库里的有效分支名。
2020-12-04 22:26:30 +08:00
```
$ git rev-list – count master
32
$ git rev-list – count dev
34
```
2021-06-27 19:12:37 +08:00
### 3\. 仓库优化
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
你的代码仓不仅对你来说很宝贵,对你所在的组织也一样。通过少数几个惯例你就能使自己的仓库整洁并且保持最新。[使用 .gitignore 文件][3] 就是这些最好的惯例之一。通过使用这个文件你可以告诉 Git 不要保存一些不需要记录的文件,如二进制文件,临时文件等等。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
当然, 你还可以使用Git的垃圾回收来进一步优化你的仓库。
2020-12-04 22:26:30 +08:00
```
`$ git gc --prune=now --aggressive`
```
2021-06-27 19:12:37 +08:00
这个命令在你和你的团队经常使用 **pull** 或者 **push** 操作的时候很有帮助。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
它是一个内部工具,能清理掉你的仓库里没法访问或者说”空悬“的 Git 对象。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
### 4\. 给未追踪的文件来个备份
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
大多数时候,删除所有未追踪的文件使安全的。但很多时候也有这么一种场景,你想删掉这些未追踪的文件同时也想做个备份防止以后需要用到。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
Git 组合一些Bash命令和管道操作, 可以让你可以很容易地给那些未追踪的文件创建 zip 压缩包。
2020-12-04 22:26:30 +08:00
```
$ git ls-files --others --exclude-standard -z |\
xargs -0 tar rvf ~/backup-untracked.zip
```
2021-06-27 19:12:37 +08:00
上面的命令就生成了一个名字为 backup-untracked.zip 的压缩包文件(当然,在 .gitignore 里面忽略了的文件不会包含在内)。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
### 5\. 了解你的 .git 文件夹
每个仓库都有一个 .git 文件夹,它是一个特殊的隐藏文件夹。
2020-12-04 22:26:30 +08:00
```
$ ls -a
. … .git
```
2021-06-27 19:12:37 +08:00
Git 主要处理两件事情:
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
1. 当前工作树(你当前检出的文件状态)
2. 你的 Git 仓库的文件夹(准确地说,包含版本信息的 .git 文件夹的位置)
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
这个文件夹存储了所有参考信息和一些其他的像配置, 仓库数据, HEAD 状态,日志等更多诸如此类的重要细节。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
一旦你删除了这个文件夹,尽管你的源码没被删,但是类似你的工程历史记录等远程信息就没有了。删除这个文件夹意味着你的工程(至少本地的复制)不再在版本控制的范畴之内了。这也就意味着你没法追踪你的修改;你没法从远程仓拉取或推送到远程仓了。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
通常而言,你需要或者应当对你的 .git 文件夹的操作并不多。它是被 Git 管理而且大多数时候是一个禁区。然而,在这个文件夹内还是有一些有趣的人工产物,比如说当前的 HEAD 状态在内的就在其中。
2020-12-04 22:26:30 +08:00
```
$ cat .git/HEAD
ref: refs/heads/master
```
2021-06-27 19:12:37 +08:00
它也隐式地包含着一个对你仓库地描述:
2020-12-04 22:26:30 +08:00
```
`$ cat .git/description`
```
2021-06-27 19:12:37 +08:00
这是一个未命名的仓库;通过编辑文件 ‘ description’ 可以给这个仓库命令。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
Git 钩子文件夹连同一些钩子文件例子也在这里。参考这些例子你就能知道Git钩子能干什么了。当然, 你也可以[参考这个 Seth Kenlon 写的Git钩子介绍][4]。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
### 6\. 浏览另一个分支的文件
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
有时,你会想要浏览另一个分支下某个文件的内容。这其实用一个简单的 Git 命令就可以实现,甚至都不用切换分支。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
设想你有一个命名为 [README.md][5] 的文件,并且它在 **main** 分支上。当前你正工作在一个名为 **dev** 的分支。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
用下面的 Git 命令,在终端上就行。
2020-12-04 22:26:30 +08:00
```
`$ git show main:README.md`
```
2021-06-27 19:12:37 +08:00
一旦你执行这个命令,你就能在你的终端上看到 **main** 分支上该文件的内容。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
### 7\. Git 中的搜索
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
用一个简单的命令你就能在 Git 中像职业选手一样搜索了。更有甚者,尽管你不确定你的修改在哪次提交或者哪个分支上,你依然能搜索。
2020-12-04 22:26:30 +08:00
```
`$ git rev-list --all | xargs git grep -F ‘ ’ `
```
2021-06-27 19:12:37 +08:00
例如,假设你想在你的仓库中搜索字符串 “font-size: 52 px;" :
2020-12-04 22:26:30 +08:00
```
$ git rev-list – all | xargs git grep -F ‘ font-size: 52 px;’
F3022…9e12:HtmlTemplate/style.css: font-size: 52 px;
E9211…8244:RR.Web/Content/style/style.css: font-size: 52 px;
```
2021-06-27 19:12:37 +08:00
### 试试这些小技巧
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
我希望这些小技巧对你是有用的,或者增加你的生产力或者节省你的大量时间。
2020-12-04 22:26:30 +08:00
2021-06-27 19:12:37 +08:00
你也有一些喜欢的 [Git 技巧][6] 吗?在评论区分享吧。
2020-12-04 22:26:30 +08:00
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/10/advanced-git-tips
作者:[Rajeev Bera][a]
选题:[lujun9972][b]
2021-06-27 19:12:37 +08:00
译者:[BoosterY](https://github.com/BoosterY)
2020-12-04 22:26:30 +08:00
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT ](https://github.com/LCTT/TranslateProject ) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/acompiler
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open)
[2]: https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_code_help_autocorrect_code
[3]: https://opensource.com/article/20/8/dont-ignore-gitignore
[4]: https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6
[5]: http://README.md
[6]: https://acompiler.com/git-tips/