Git Tips#

文件管理#

工作区#

工作区 即整个工作空间的根目录, 也就是 .git 目录存在的那一级目录. 对每个文件的修改都在这里进行.

特殊地, 被 .gitignore 排除的文件或目录不属于工作区. 这些文件将被彻底排除出 git 的管理, 对他们的操作也无法使用 git 回退或恢复.

暂存区#

当在工作区进行操作后, 使用 git add 命令将修改的文件 添加 (add)暂存区. 暂存区可以继续添加或移除文件, 直到使用 git commit 命令将区内的文件一次性 提交 (commit) 到版本库中.

文件状态#

git 管理的文件有以下几种状态:

  • U, untrack: 未跟踪
    这是新创建的文件, 此前在工作区从未出现. 例如在工作区新建某一源代码文件, 并且写入部分内容, 这个文件就处于未跟踪状态.
  • M, modified: 已修改
    这是之前已被提交过的文件, 但是经过了一些修改, 使其与之前不同了. 例如在更改某一方法的实现等等.
  • staged: 已暂存
    当把工作区的文件添加到暂存区后, 其状态就变为已暂存.
  • committed: 已提交
    当把暂存区的文件提交到仓库后, 其状态就变为已提交.

快速操作#

git 设置代理#

git config --global http.proxy "http://127.0.0.1:7890" # 端口待定
git config --global https.proxy "https://127.0.0.1:7890"

查看提交历史#

git log

或以 ascii 图形的方式展示树状分支结构:

git log --graph

显示操作历史#

git reflog

通过这个命令可以检查做过的所有操作, 包括提交, 切换分支, 撤销文件修改, 回滚版本等等.

给当前版本打标签#

git tag <tag-name>

标签可以帮你快速定位版本信息, 或者标记最后一个可以被成功运行的版本.

拆分提交#

一个已修改的文件 (注意, 不包含未跟踪的文件) 可以被拆分, 有选择地提交. 使用

git add -p <file>

在命令行中交互式地操作. 输入命令后将展示文件中被细分出的修改, 同时出现如下操作菜单.

(1/5) Stage this hunk [y,n,q,a,d,e,?]?

最左边 (1/5) 显示了当前是第几个修改以及修改总数;

  • y: 将当前修改放入暂存区
  • n: 跳过当前修改, 不放入暂存区
  • q: 退出, 跳过后面所有修改, 但是保留之前放入暂存区的修改
  • a: 暂存当前以及之后的所有修改
  • d: 与 q 相似, 但只跳过当前文件, 继续操作下一个文件
  • e: 尝试继续拆分修改, 更细致地进行操作
  • ?: 显示帮助

现代编辑器也提供了图形化的操作.

压缩提交#

使用交互式 变基 (rebase) 来指定要压缩的那些提交, 在指定的提交之后的都可以被操作:

git rebase -i <commit>

在打开的编辑器中将开头的 pick 修改为 squash ( 缩写 s ) 或 fixup ( 缩写 f ). 两者的区别在于:

  • squash: 保留提交消息, 允许合并后编辑.
  • fixup: 丢弃提交消息, 直接合并到前一个提交.

撤销修改#

  • 完全放弃暂存区和工作区的所有修改, 无论有没有提交: git reset --hard HEAD

  • 将文件恢复成上一次提交或暂存时的状态. 注意, 如果文件是新创建的, 则不会对他进行任何操作并报错: git restore <file>

  • 将所有修改都变为未跟踪状态; 也就是清空暂存区, 但是修改仍然保留: git restore --staged . git reset --mixed HEAD

  • 取消暂存指定的文件, 保留修改: git restore --staged <file>

撤销本地提交#

远程提交几乎不可撤销.

如果你已经推送了, 放弃或者使用 git revert (但这毕竟不是真的撤销).

  • 撤销到某次提交. 注意, 这将删除那次提交之后的一切修改: git reset --hard <commit> 例如, 撤销最后一次提交1: git reset --hard HEAD^
  • 撤销到某次提交, 将之后的修改与当前暂存区内的修改移回工作区: git reset --mixed <commit>
  • 撤销到某次提交, 将之后的修改移到暂存区内: git reset --soft <commit>
  • 通过创建一个恰恰相反的新提交, 来重置一个提交: git revert <commit>

修改提交#

远程提交同上, 几乎无法修改.

直接修改上次提交:

git commit --amend

如果要修改的提交是几次之前, 则只能重新排序提交, 将要修改的那次移动到上一次, 再进行修改.

重新排序的操作可以使用交互式 变基 (rebase) 完成:

git rebase -i <commit>

更多#

不妨看看:

Git Cheat Sheet: 一份 git 命令速查表

Git Book: 官方中文 git 教程


  1. 使用了 祖先引用 ↩︎

Created in January 22, 2025 Last modified in January 22, 2025