git reset - hellcy/python-basic GitHub Wiki

修改已 commit 的版本

有时候我们总会忘了什么, 比如已经提交了 commit 却发现在这个 commit 中忘了附上另一个文件. 接下来我们模拟这种情况. 上节内容中, 我们最后一个 commit 是 change 2, 我们将要添加另外一个文件, 将这个修改也 commit 进 change 2. 所以我们复制 1.py 这个文件, 改名为 2.py. 并把 2.py 变成 staged, 然后使用 --amend 将这次改变合并到之前的 change 2 中.

$ git add 2.py

$ git commit --amend --no-edit // "--no-edit": 不编辑, 直接合并到上一个 commit

$ git log --oneline // "--oneline": 每个 commit 内容显示在一行

reset 回到 add 之前

有时我们添加 add 了修改, 但是又后悔, 并想补充一些内容再 add. 这时, 我们有一种方式可以回到 add 之前. 比如在 1.py 文件中添加这一行:

d = 3 然后 add 去 staged 再返回到 add 之前:

$ git add 1.py

$ git status -s // "-s": status 的缩写模式

$ git reset 1.py

$ git status -s

reset 回到 commit 之前

在穿梭到过去的 commit 之前, 我们必须了解 git 是如何一步一步累加更改的. 我们截取网上的一些图片

回到从前 (reset)

每个 commit 都有自己的 id 数字号, HEAD 是一个指针, 指引当前的状态是在哪个 commit. 最近的一次 commit 在最右边, 我们如果要回到过去, 就是让 HEAD 回到过去并 reset 此时的 HEAD 到过去的位置.

不管我们之前有没有做了一些 add 工作, 这一步让我们回到 上一次的 commit

$ git reset --hard HEAD

$ git log --oneline

$ git reset --hard HEAD^

$ git reset --hard c6762a1

$ git log --oneline

怎么 change 2 消失了!!! 还有办法挽救消失的 change 2 吗? 我们可以查看 $ git reflog 里面最近做的所有 HEAD 的改动, 并选择想要挽救的

$ git reflog

重复 reset 步骤就能回到 commit (amend): change 2 (id=904e1ba)这一步了:

$ git reset --hard 904e1ba

$ git log --oneline

我们又再次奇迹般的回到了 change 2.

Back to Home