记录git知识点,方便随时查看
1. 关键词:同一文件 | 暂存区(stage) | 工作区(work director) | 同时修改
现有一分支master ,其中有一个文件common.txt,内容如下(工作区是clean的),
然后修改放入暂存区
接下来继续修改工作区中的common.txt文件内容
通过上图可以看到,工作区和暂存区都不是clean的,如果要将暂存区的文件内容移回(unstage)工作区,可以以下两种不同的操作过程,结果是否一样呢?
1)第一种是直接使用命令 git restore --staged common.txt , 然后查看文件状态和内容,如下图
可以看到该方式暂存区已经clean了,但是暂存区的内容并没有移回工作区
。
2)第二种方式是先clean工作区,然后在移回暂存区文件内容,如下图
可以看出先restore工作区文件,然后在restore --staged 暂存区文件,可以使暂存区文件内容移回工作区
。
-------------------------------------------------------------------------------------------------------------------------------------------
2. 关键词:切换分支 | 暂存区
暂存区不属于某个分支,就像工作区不属于某个分支一样,如果暂存区有内容待提交,切换分支时,会看到暂存区的文件,如下图所示
如果此时(当前已切换到master)进行提交操作(commit),则暂存区的改动被提交到master分支。
-------------------------------------------------------------------------------------------------------------------------------------------
3. 关键词:合并分支 | fast forwadr --no-ff
合并分支中有 fast forward 和–no-ff,两种方式。两者有何区别?
1)首先看fast forward方式。dev分支有两次提交,如下图所示
然后将dev合并到master分支(git默认是fast-forward),使用git log --graph命令查看
从上图可以看出,使用fast-forward无法看到在dev分支有哪些提交记录。 注意:dev分支的每个提交点信息都存在,没有丢失,只是无法识别哪些提交点信息是由dev分支贡献。
2)第二种方式–no-ff。使用命令 git merge --no-ff dev 将dev合并到master分支,合并后查看log如下图
从上图可以看出, --no-ff 合并方式可以看出哪些提交点由分支dev贡献。注意:合并后会产生一个新的提交点(上图中为6ff57)。
-------------------------------------------------------------------------------------------------------------------------------------------
4. 关键词: reset --soft --hard --mixed
现有一条分支master,新增一文件 a.txt,然后对a.txt增加内容并提交4次,4次提交内容如下图:
第一次提交后:
第二次提交后:
第三次提交后:
第四次提交后:
1)如下图所示,如果使用 git reset --mixed head~2(默认是–mixed),则回到第二个提交点,第二个提交点之后的提交的内容,都会挪到工作区。经过测试,如果执行该命令之前,工作区和暂存区都有内容(不是clean状态),则工作区,暂存区,第二次提交点之后提交的内容,这三部分全部回到工作区。
上面的提交是每次新增一行内容,如果第三次提交和第四次提交都是对第二行的内容做修改,比如第三次提交将“222”改为“333”,第四次提交将“333”改为“444”。执行上述命令,则只保留最新内容,如下图
2)如果使用 git reset --soft head~2,则回到第二个提交点,第二个提交点之后的提交的内容,都会挪到暂存区。经过测试,如果执行该命令之前,工作区和暂存区都有内容(不是clean状态),则暂存区,第二次提交点之后提交的内容,这两部分全部回到暂存区。工作区的内容回到工作区。
和前面一样,如果每次提交都是修改已有的内容,而不是新增内容,则执行该命令后,只保留最新内容。
3)3中方式里,最容易理解的是–hard,如果使用get reset --hard head~2,则回到第二个提交点,第二个提交点之后的提交的内容,都会被擦除。经过测试,如果执行该命令之前,工作区和暂存区都有内容(不是clean状态),则工作区,暂存区,第二次提交点之后提交的内容,这三部分全部被擦除。
如果最后一次提交后,有大量文件被修改,部分修改文件已到暂存区,此时想恢复到最后一次提交的内容状态,可以直接使用命令 git reset --hard head。
经过以上测试,总结如下
--mixed | --soft | --hard | |
---|---|---|---|
工作区 | 工作区 | 工作区 | 擦除 |
暂存区 | 工作区 | 暂存区 | 擦除 |
快照(已提交) | 工作区 | 暂存区 | 擦除 |