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 教程