0%

Git 非常规操作

前言

记录使用 Git 时一些不常用,但是很值得了解的命令

为了数据的多样性和丰富度,这里以滴滴开源的 DoraemonKit[1] Github 开源库作为进行 git 相关操作演示的仓库 。

Q & A

  • 某个 git 仓库有哪些人做过 commit

    1
    git shortlog -sn
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     skye@Engineer MINGW64 /d/workspace/DoraemonKit (master)
    $ git shortlog -sn
    377 yixiangboy
    262 jackjintai
    228 yixiang
    42 wanglikun7342
    41 ydlsl
    26 LY
    25 zhuzhiyong
    ...

    可以看到通过 git shortlog -sn 可以显示当前仓库的所有提交者,并且会按提交 commit 的数量进行降序排列。(当然,这个 commit 数量并不能说明什么,但是可以简单了解一下这个仓库有哪些人做过贡献)。

    git shortlog 简单来说就是对 git log 的内容的总结。git shortlog 会就 git commit 按照提交者的名字及邮箱进行归类。

    除了 -sn 参数外,还有 -e (邮箱相关) 等其他参数可用。

  • 查看某个文件的提交历史

    1
    2
    git log filename
    git show commit-id filename
  • 查看某个文件的某几行代码的提交历史

1
git blame filename

会按行显示提交记录

1
git blame -L startline,endline filename 

特定行数的提交记录

这里以 DoraemonKit 内 CONTRIBUTING.md 为例

1
git blame -L 1,20

output

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PS D:\workspace\DoraemonKit> git blame -L 1,20 .\CONTRIBUTING.md
1ae505691 (Tiger Wang 2018-08-27 13:47:08 +0800 1) # Contribution Guideline
1ae505691 (Tiger Wang 2018-08-27 13:47:08 +0800 2)
2c9c76304 (Tiger Wang 2018-08-27 13:45:51 +0800 3) Thanks for considering to contribute this project. All issues and pull requests are highly appreciated.
2c9c76304 (Tiger Wang 2018-08-27 13:45:51 +0800 4)
1ae505691 (Tiger Wang 2018-08-27 13:47:08 +0800 5) ## Pull Requests
1ae505691 (Tiger Wang 2018-08-27 13:47:08 +0800 6)
2c9c76304 (Tiger Wang 2018-08-27 13:45:51 +0800 7) Before sending pull request to this project, please read and follow guidelines below.
2c9c76304 (Tiger Wang 2018-08-27 13:45:51 +0800 8)
b7b0d77a5 (Tiger Wang 2018-08-27 13:47:36 +0800 9) 1. Branch: We only accept pull request on `master` branch.
1ae505691 (Tiger Wang 2018-08-27 13:47:08 +0800 10) 2. Coding style: Follow the coding style used in DoraemonKit.
1ae505691 (Tiger Wang 2018-08-27 13:47:08 +0800 11) 3. Commit message: Use English and be aware of your spell.
1ae505691 (Tiger Wang 2018-08-27 13:47:08 +0800 12) 4. Test: Make sure to test your code.
1ae505691 (Tiger Wang 2018-08-27 13:47:08 +0800 13)
2c9c76304 (Tiger Wang 2018-08-27 13:45:51 +0800 14) Add device mode, API version, related log, screenshots and other related information in your pull request if possible.
2c9c76304 (Tiger Wang 2018-08-27 13:45:51 +0800 15)
1c8c215ee (Tiger Wang 2018-08-27 14:21:50 +0800 16) NOTE: We assume all your contribution can be licensed under the [Apache License 2.0](https://github.com/didi/DoraemonKit/blob/master/LICENSE).
1ae505691 (Tiger Wang 2018-08-27 13:47:08 +0800 17)
1ae505691 (Tiger Wang 2018-08-27 13:47:08 +0800 18) ## Issues
2c9c76304 (Tiger Wang 2018-08-27 13:45:51 +0800 19)
2c9c76304 (Tiger Wang 2018-08-27 13:45:51 +0800 20) We love clearly described issues. :)
PS D:\workspace\DoraemonKit>

可以这个文件的按照行数列出了所有的记录。

之后通过 git show commit-id 就可以查看详细的提交记录了。

  • 恢复已经被 reset 或删除的 commit 记录
1
git reflog

git reflog 很多时候都是 git 误操作的后悔药。

  • 不小心删除的 commit 记录,
  • merge 代码时误操作干掉的 commit ,
  • git reset –hard 之后又想找回来的提交记录,
  • 被删除的分支找不到 commit-id 了,无法恢复时

统统可以通过 git reflog 找回来。

git reflog 显示的内容本质上是 git commit 的在本地的所有操作记录。因此,并不能百分之百保证所有提交记录可以被恢复,因此 git 有定期进行 commit 自动清理的策略

因此,不能过度依赖 git reflog, 对仓库进行随意的操作。

参考文档

  1. DoraemonKit
  2. Git 官方文档
加个鸡腿呗.