Git 状态重置 或者 回滚

单词

  • reset
  • checkout
  • HEAD HEAD^ HEAD~n

语法

git 工作区还原到 暂存区的状态,也就是说 取消最近新添加的文件修改

  1. git checkout . //还原工作区 <所有> 文件 为暂存区状态暂存区状态
  2. git checkout -- filename //还原工作区 <指定> 文件 为暂存区状态暂存区状态
  3. 补充说明:暂存区状态(最近一次commit 或者 暂存区回滚到的 commit 状态)

git暂存区 恢复到 commit 状态

  1. git reset HEAD // 恢复暂存区到 HEAD 指针指向的位置
  2. git reset HEAD^ // 恢复暂存区到 HEAD 的上一次 commit
  3. git reset HEAD~4 // 恢复暂存区到 HEAD 的上第4次 commit
  4. git reset <hash> // 恢复暂存区到 指定hash commit处
  5. git reset 缺省值为 mixed //将HEAD reset 没有修改 工作区 但是修改了 暂存区
  6. git reset --soft //将HEAD reset 没有修改 工作区 与 暂存区
  7. git reset --hard //将HEAD reset 同时修改工作区与暂存区

git reset 后 git log 只显示到 HEAD commit 处,以往的不显示,但是 可以到 项目的 .git/logs/refs中去寻找 一般记录保存 30天

找到后可以 使用 git reset ,来重置

语义

单线型 版本迭代演进 与回滚演示

演示前的准备

  1. git init Test 初始化 一个Test 用于 git 演示

  2. 建立 hello.c文件 用于版本迭代

  3. git ad hello.cgit commit -m ‘Write a Hello World C Language file'

  4. git log --oneline 结果:

    1. b2e1368 Write a Hello World C Language filWrite a Hello World C Language fil
  5. vi hello.c 在文件里面 return 0 前 补充 getchar() 并提交

  6. git log --oneline 结果:

    1. eb96dee At the end insert getchar() to make a wait
    2. b2e1368 Write a Hello World C Language fil
  7. vi hello.c 在文件里面 补上 // Author: XXXX 提交

  8. git log --oneline 结果:

  1. 550f417 (HEAD -> master) insert author information into the file
  2. eb96dee At the end insert getchar() to make a wait
  3. b2e1368 Write a Hello World C Language fil


修改开始

代码最初为:

  1. #include 'stido.h'
  2. int main() {
  3. printf('Hello World! \n');
  4. return 0;
  5. }
  1. 当前 hello.c 源码 如下:

    1. #include 'stido.h'
    2. // Author: Leobod
    3. int main() {
    4. printf('Hello World! \n');
    5. getchar();
    6. return 0;
    7. }
  2. 修改后

    1. #include 'stido.h'
    2. // Author: Leobod
    3. // Description: A C language demo
    4. int main() {
    5. printf('Hello World! \n');
    6. getchar();
    7. return 0;
    8. }

    情况1

    若 使用 git checkout . 或者 git checkout -- Hello.c 后 恢复到 2处样式

    情况2

    若 使用 git reset --hard b2e1368 恢复到 代码最初样子 且 工作区 暂存区代码都一样

    git log

    1. b2e1368 Write a Hello World C Language fil

    可以使用 git reset --hard 550f417 返回 最后一次修改状态

    找不到 hash 请前往 .git/logs/refs 中寻找

    情况3

    若使用 git reset b2e1368 工作区 代码 仍为 4处 样式, 暂存区与版本库为 代码最初样式

    此时 使用 git status 可以发现提示

    若想 工作区也 还原 多执行一步 git checkout .

    回到 最新状态 依然是 git reset 550f417

    此处 550f417 对应最后一次commit的 hash 值

本文部分内容参考引用了 Domon-Git Reset 三种模式