常用操作
暂存区基本操作
添加到暂存区
将文件添加到暂存区有三种方式:
- 特定文件,例如
git add utils/tools.py; - 特定目录,例如
git add utils/,递归搜索utils下面的所有文件并添加到暂存区; - 通配符匹配,例如
git add ./*.py。
使用后两种方式的时候,只会将未被.gitignore匹配到的文件加入暂存区,第一种方式的优先级高于.gitignore。
从暂存区回退
.git/obejcts目录下的文件不会被改变,从暂存区删除只是从.git/index中修改工作文件与blob文件的关联关系而已。
操作命令:git restore --staged <file>。<file>同样可以使用上述的三种方式指定。
停止追踪文件
很好理解,从.git/index中删除对应的关联关系即可。
操作命令:git rm --cached <file>。<file>同样可以使用上述的三种方式指定。
.gitignore
.gitignore是git仓库根目录下的一个
引用提交
引用提交可以理解为使用某种标识定位到特定的提交。有三种常见的方式:
- 通过分支、标签或者HEAD指针;
- 直接通过提交的hash值;
- 在1或者2的基础上进行相对定位。
git中以提交为作用对象的命令都可以使用这些引用方式,以git log -n 1 <commit>(这个命令输出<commit>的概要信息,-n 1表示只输出当前提交的信息,不沿parent指针向上回溯)为例,可以使用下面的几种命令:
git log -n 1 HEAD # HEAD区分大小写
git log -n 1 main
git log -n 1 <hash> # 只需要【可以唯一确定一个提交】的长度即可
git log -n 1 main^
git log -n 1 HEAD^2~3
git log -n 1 main^2^
^和~是相对定位。
^表示向上回溯一次,如果存在多个父提交(合并时产生),默认回溯到第一个父提交,可以用^<index>指定具体要回溯到哪个父提交。父提交的顺序可以使用git log --pretty=%P -n 1 <commit>查看。
~<n>表示连续向上回溯n个提交(使用沿第一个父提交进行回溯)。
分支基本操作
git branch:列出所有本地分支。git branch <new_branch> [<branch>]:新建一个分支<new_branch>,和<branch>分支指向同一提交。如果<branch>未指定,则与HEAD指向同一提交。git branch -d <branch>:删除分支。git switch <branch>:切换到<branch>指向的提交,同时HEAD与<branch>绑定,也就是切“切换到了<branch>分支”。
切换是一个相对复杂的过程,需要做3件事情:修改工作区、重建index文件、HEAD绑定。
一个提交对应一个工作区快照,那么快照中的文件和当前工作区中的文件就有4种可能的情况:
- 快照中有,工作区中没有:直接将快照中的文件写入工作区。
- 快照中没有,工作区中有:工作区的文件保留原样。
- 两者都有,内容一致:这还用说吗。
- 两者都有,内容不一致:git会要求将当前的改动提交,否则拒绝执行切换。
这样切换之后的工作区的内容就是目标提交(分支)的内容了,同时当前分支的改动也被妥善保存。
[!TIP]
可以用
git switch -c <new_branch>新建一个分支的同时切换到该分支。
[!NOTE]
在Git 2.23之后的版本,请使用switch进行分支切换,不要再用checkout。