git随手记

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

操作导图

i-git_opc.jpg

常用术语

  • CR: Code Review. 请求代码审查。
  • PR: pull request. 拉取请求,给其他项目提交代码。
  • MR: merge request. 合并请求。
  • LGTM: Looks Good To Me.对我来说,还不错。表示认可这次PR,同意merge合并代码到远程仓库。
  • WIP: Work In Progress. 进展中,主要针对改动较多的 PR,可以先提交部分,标题或 Tag 加上 WIP,表示尚未完成,这样别人可以先 review 已提交的部分。
  • PTAL: Please Take A Look. 请帮我看下, 邀请别人review自己的代码。
  • ACK: Acknowledgement. 承认,同意。表示接受代码的改动。
  • NACK/NAK: Negative acknowledgement. 不同意,不接受这次的改动。
  • RFC: Request For Comment. 请求进行讨论,表示认为某个想法很好,邀请大家一起讨论一下。
  • ASAP: As Soon As Possible. 请尽快完成。
  • IIRC: If I Recall Correctly. 如果我没有记错的话。
  • IMO: In My Opinion. 在我看来。
  • TBD: To Be Done. 未完成,待续。
  • TL;DR: Too Long; Didn’t Read. 太长懒得看。常见于README文档。

Mac下的.DS_Store文件

使用Mac的用户可能会注意到,系统经常会在每个目录下生成一个隐藏的文件——即.DS_Store文件。.DS_Store(全程Desktop Services Store)是一种由苹果公司的Mac OS X操作系统所创造的隐藏文件,目的在于存储目录的自定义属性,例如文件们的图标位置或者是背景色的选择。类似于windows下的desktop.ini文件。

删除.DS_Store文件

如果项目还没有自动生成.DS_Store文件,那么直接将.DS_Store加入到.gitignore文件就可以了。如果项目已经存在.DS_Store文件,那就需要先从项目中将其删除,再将它加入到.gitignore。如下:

1
2
3
4
5
6
find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

echo .DS_Store >> ~/.gitignore

git add --all
# ...

如果只是删除磁盘上的.DS_Store文件,可以使用如下命令来删除当前目录及其子目录下的.DS_Store文件:

1
find . -name '*.DS_Store' -type f -delete

如果使用Github Desktop来创建repository以及publish repository,那么客户端会自己处理此问题,即删除此文件。

禁止或启用.DS_Store生成

禁止:

1
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE

启用:

1
defaults delete com.apple.desktopservices DSDontWriteNetworkStores

gitk

gitk 是 git 提供的一个gui工具,可以很清晰地查看搜索提交历史及 git 相关操作。在终端 git 仓库目录下输入 gitk 命令即可使用。

通过右键我们可以执行一些简单的操作,包括基于当前提交创建tag,创建分支,reset到当前提交、revert当前提交等。

颜色和字体

  • 本地分支名称是绿色背景
  • 远程分支名称是橘色和绿色混合的背景色
  • 当前分支是加粗字体
  • 分支tag是黄色背景
  • 当前HEAD是黄色的圆点
  • 黄色的方块代表提交有notes(git备注是用于给提交补充消息的,但是不会改变提交信息,参考git-notes

有一篇英文的介绍文章:《Use gitk to understand git》

代码库操作

这些操作都作用在提交列表上,也就是最上面的面板。

p-gitk.jpg

右键单击提交信息

  • 创建tag
  • 创建分支
  • 重置当前分支到这个提交(soft/mixed/hard)
  • 挑选(cherry-pick)当前提交给当前分支(这个命令也不常用,我百度了一下关于git的cherry-pick命令)

右键单击分支名称

  • 检出分支
  • 删除分支

主菜单

  • reload: 如果你在其他界面使用命令行操作了一些东西,想通过gitk刷新出来看
  • list/choose references: 要快速到指定分支,点击F2。显示出来的结果可能很多,可以通过下面的过滤框写一下模式。它不会模糊匹配,你要么写完分支名称,要么使用通配符*。 点选一个分支整个gitk就去到新分支了,不过弹出来的窗口还在,可以继续点其他分支。

浏览提交列表

最上面的面板就是提交列表。许多操作都有快捷键绑定。 比如下键可以使用n代替。不过知道了也没啥用。

  • 上下键,还有pageup/pagedown键,作用显而易见;
  • 左右键,上一个/下一个提交;
  • shift+上下键,查下上一个/下一个匹配

浏览diff信息

下面的面板左边部分是diff信息,右面部分是diff的文件列表。

  • 空格键:向前一页
  • 退格键/删除键: 同上,不过反向
  • f:下一个文件,左右两边都会移动
  • b:同上,不过是前一个文件

  • 点击右侧文件:左侧会滚动到对应的diff

计算提交的差别

  • 左键选中一个提交
  • 找到另一个提交(可以使用滚动条,但不能使用键盘)
  • 右键单击选择Diff this -> selected

现在可以和上面一样对比差别了。

查找提交

  • 搜索提交信息:任何时候点击”/“都可以开始搜索提交信息。匹配的提交会被加粗,中文尤其明显。前面说过,可以使用Shift+上下键进行导航。
  • 根据文件搜索:匹配到提交以后,在右下面板右击文件选择Highlight this only。
    如果想匹配多个文件,可以右击其他文件,选择Highlight this too,这些文件不用是同一个提交里的。注意这时候搜索模式就从containing变成了touching paths。
  • 根据代码搜索:把搜索模式改成adding/removing string即可。

导航提交

  • diff面板显示提交的Parent和Child。点击对应的hash码可转过去
  • diff面板显示了当前提交所属的分支信息。点击跳转到对应分支的head。
  • 如果提交图太复杂,连接两个提交的线就会断开。点击线部分(不是圆点或者箭头部分),diff面板会显示这一部分对应的详情。
  • 如果点击了箭头,你会看到箭头翻转了,当前提交没有变。实际上箭头连接的是两部分提交。

.gitignore不生效

当你的项目已经push过后,后添加的文件.gitignore会出现不生效的问题,这是因为本地有文件缓存,清除即可:

1
git rm -r --cached .

.gitignore规则

  • /node_modules:根目录node_modules文件夹
  • /node_modules/*:根目录node_modules文件夹及子目录/child/node_modules文件夹
  • !/node_modules/test.json:代表此文件不忽略;
  • *.zip:过滤所有zip后缀的文件
  • /pages/index.html:过滤具体文件
  • **/node_modules:过滤无论多少层级的node_modules