git 使用指南

Git 作为目前最流行的版本管理工具,有一些平时不太常用但关键时刻又非常有用的命令。这里做一些记录。

进阶功能

保留本地开发改动 - git update-index --skip-worktree

仓库代码在不同地方执行时,有可能需要不同的配置文件,这些不同环境导致的配置更改又不能提交到仓库中,于是总是在本地临时修改,并让git忽略这些改动以避免不小心提交。

git update-index提供两种方式忽略文件改动:

  • --assume-unchanged git忽略文件改动,但是当切换分支(checkout)、重置分支(reset –hard)包含该文件改动时,本地改动将被覆盖!这条命令的正确使用场景是通知git用户不会修改这些文件,比如SDK文件,以提升git性能
  • --skip-worktre 通知git忽略文件改动,因为用户会修改这些本地文件。在切换分支包含该文件改动时,git尝试合并改动而非覆盖(或者提示冲突而拒绝),重置分支也不会修改文件。这条命令才适合于本地修改配置文件。

从git仓库中彻底删除文件 - git filter-branch

有时由于不小心,将敏感的文件如access key,或者不必要的大文件如编译结果文件提交到了git仓库,即便下一次提交删除了这些文件,git作为一个版本管理工具依然会在仓库中保存这些被删除的文件,导致了安全问题,以及git仓库体积变大。

git提供filter-branch指令从仓库中删除文件(注意:仓库修改后历史丢失,不可回退!):

1
2
3
4
5
6
7
$ git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
--prune-empty --tag-name-filter cat -- --all

// produce something like:
// > Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (266/266)
// > Ref 'refs/heads/master' was rewritten

然后对每一个被修改的分支使用 git push --force 强制更新远程仓库。

引用参考