先简单了解档案存入 repository(仓库)的流程
Git 简单来说分为三个区域:
1、工作区(working directory): 我们实际操作的资料夹(档案)
2、暂缓区(stage snapshot): 将工作区档案的快照新增到暂存区域
3、git 目录(.git directory): 提交暂存区域的档案快照永久地储存在 Git 目录
git reset --hard and --soft 穿梭你提交的版本之间
-
hard
git reset --hard HEAD
:此种模式完全不保留原始 commit 结点的任何资讯,会连同资料夹中实体档案内容都进行重置,也就是直接将工作区、暂缓区及 git 目录都重置成目标Reset结点的资料内容。
具体操作:
回复到上一个(或更前的)版本。
git reset --hard HEAD
回复到最新提交版本
git reset --hard HEAD~ // 等于 ~1
回复到上一个提交版本
git reset --hard HEAD~n // n 等于往上第几个提交版本
回复之前指定的提交版本
例子一:
假设我发现最新的代码版本有bugs,想回复更前的版本,你可以输入:
git log --oneline -n // (n 是最近几多次的提交记录)
如下所示,便会显示最近5次的提交记录。
Kwokde-MacBook-Pro:test stevechung$ git log --oneline -5 // 最近5次提交记录
ba2f0a4 (HEAD -> master, origin/master) test4 //最新提交的记录
f3a6683 test1 // 上一个提交的记录
4f0f054 test2
6fefa2d test1
77f9ec8 reset
如果你想回复到 f3a6683 test1 ,输入 git reset --hard HEAD~
如果你想回复到 4f0f054 test2 ,输入 git reset --hard HEAD~2
如果你想回复到 6fefa2d test1 ,输入 git reset --hard HEAD~3
如此类推。
假设我回复到 4f0f054 test2 这个版本,输入后便会显示:
Kwokde-MacBook-Pro:test stevechung$ git reset --hard HEAD~2 // 回复到 4f0f054 test2
HEAD is now at 4f0f054 test2 // 这代表成功回复至你指定的版本
小知识:HEAD 是什么 ?
HEAD 是一个指标,指向某一个分支,通常你可以把 HEAD 当做「目前所在分支」看待。
假设你回复之前的版本后,又想回复到最新提交的版本,就可以用:
-
git reflog
:查看所有讯息版本 -
git reset --hard commit_id
: 根据 commit id 回复到指定版本
例子二:
你可以输入 git reflog
查看所有讯息版本,如下所示:
Kwokde-MacBook-Pro:test stevechung$ git reflog // 查看所有讯息版本
4f0f054 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~2 // 这是例子一、回复的当前提交记录
ba2f0a4 (origin/master) HEAD@{1}: commit: test4 // 假设你要回复到例子一、开头使用的这个版本
f3a6683 HEAD@{2}: commit: test1
4f0f054 (HEAD -> master) HEAD@{3}: commit: test2
6fefa2d HEAD@{4}: commit: test1
77f9ec8 HEAD@{5}: commit: reset
58f0631 HEAD@{6}: reset: moving to HEAD
58f0631 HEAD@{7}: commit (initial): gitreset
ba2f0a4 就是 commit id,每个经 git commit -am ""
提交到历史记录区(仓库)都会生成一组 commit id,可以按以下输入:
Kwokde-MacBook-Pro:test stevechung$ git reset --hard ba2f0a4 //回复到的指定commit id 的提交记录版本
HEAD is now at ba2f0a4 test4 // 这代表成功回复至你指定的版本
-
soft
git reset --soft HEAD / commit id
:此模式下会保留工作区资料内容,不会异动到目前所有的实体档案内容;也会保留暂缓区资料内容,让暂缓区与 git 目录资料内容是一致的。
具体操作:
Kwokde-MacBook-Pro:test raykwok$ git reflog // 查看所有讯息版本
ba2f0a4 (HEAD -> master, origin/master) HEAD@{0}: reset: moving to ba2f0a4
4f0f054 HEAD@{1}: reset: moving to HEAD~2
ba2f0a4 (HEAD -> master, origin/master) HEAD@{2}: commit: test4
f3a6683 HEAD@{3}: commit: test1
4f0f054 HEAD@{4}: commit: test2
6fefa2d HEAD@{5}: commit: test1 // 计划回复到前 3 个版本 - 6fefa2d
77f9ec8 HEAD@{6}: commit: reset
58f0631 HEAD@{7}: reset: moving to HEAD
58f0631 HEAD@{8}: commit (initial): gitreset
Kwokde-MacBook-Pro:test raykwok$ git reset --soft HEAD~3 // 回复到 6fefa2d 版本
Kwokde-MacBook-Pro:test raykwok$ git reflog
6fefa2d (HEAD -> master) HEAD@{0}: reset: moving to HEAD~3 // 回复成功
ba2f0a4 (origin/master) HEAD@{1}: reset: moving to ba2f0a4
4f0f054 HEAD@{2}: reset: moving to HEAD~2
ba2f0a4 (origin/master) HEAD@{3}: commit: test4
f3a6683 HEAD@{4}: commit: test1
4f0f054 HEAD@{5}: commit: test2
6fefa2d (HEAD -> master) HEAD@{6}: commit: test1
77f9ec8 HEAD@{7}: commit: reset
58f0631 HEAD@{8}: reset: moving to HEAD
58f0631 HEAD@{9}: commit (initial): gitreset
git revert 撤销一个提交的同时会创建一个新的提交。
-
revert
git revert HEAD
新增一个 Commit 来反转(或说取消)另一个 Commit 的内容,原本的 Commit 依旧还是会保留在历史纪录中。虽然会因此而增加 Commit 数,但通常比较适用于已经推出去的 Commit,或是不允许使用 Reset 或 Rebase 之修改历史纪录的指令的场合。
具体操作:
Kwokde-MacBook-Pro:test raykwok$ git revert HEAD~2 // 提交revert 取消上一次提交
[master 1b6942a] Revert "gitreset" // 增加了一个 Commit 1b6942a 用以代替上次提交的版本
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 README.md
Kwokde-MacBook-Pro:test raykwok$ git reflog
1b6942a (HEAD -> master) HEAD@{0}: revert: Revert "gitreset" // 增加一个 Commit 来取消 6fefa2d
6fefa2d HEAD@{1}: reset: moving to HEAD
6fefa2d HEAD@{2}: reset: moving to HEAD~3
总结:
本文是小弟学习前端写有关于git reset 与 git revert 的用处,请大家多多指教。如有任何意见及交流,可在下方留言,谢谢!