常用操作
暂存区基本操作
添加到暂存区
将文件添加到暂存区有三种方式:
- 特定文件,例如
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。