3-具体学习git--reset回到过去的版本(commit间穿梭),checkout单个文件穿梭
git log --oneline 命令可以在一块儿显示做过的改动。
我在change 2时忘了一条,想在change 1后再添加一个语句或一个操作,然后这个状态再提交仍作为change 2.将这个staged改动作为上一个commit中。
将1.py复制了一份重命名为2.py,然后git add 2.py,我如果直接用git commit -m “备注”就不行,可以用 git commit --amend --no-edit
虽然change 2的注释没变,但是前面的指针地址变了,可以看出来。
从staged状态返回到modified状态:git reset 1.py
--
-----------------------------
另一种情况是我改变代码文档后add 到了staged状态,也commit成unmodified状态了,那我怎样返回到add前改变代码的状态呢?用指针移动啊。
首先看看有几个版本,git log --oneline,发现有三个:
可以用 git reset --hard HEAD来重新回到add之前,这个HEAD就代表了07e8eb5这个指针,回到了初始的commit状态,
然后查看状态:
发现没有任何回应,说明是commit状态(即commit后的unmodified状态)
如果我想回到上一个commit状态,我用 git reset --hard HEAD^ 或git reset --hard HEAD~1 或用git reset --hard 7efe439 ,最后一个是id号码。
如果我现在想回到未来,但是看不到change 2 的id号了,怎么办呢?用 git reflog命令找到所有的id号,然后通过id号回到以前有过的将来。
也可以把指针复制过来,
单个文件回到从前:
git checkout 7efe439 -- 1.py 7efe439是id号,1.py是要操作的文档。
发现1.py内容变了。
但是2.py还是之前的内容。
checkout还可以在branch分支之间切换。
我现在修改1.py:
执行:
这时发现1.py的change 2还存在,并没有被覆盖,我们仍然可以回到那个过去。不过现在仍处在:
-----------------------------------------------------
reset和checkout的区别:
1.reset是整个目录回到从前的commit,创造另外一个未来,checkout是单个文件回到从前的commit,回到以前的未来。
2.reset回到从前某个时间点,这个时间点将来直到现在时间的变化不会显示在log 中,而checkout仍然显示在log中。