git基础教程(27)git commit --amend撤销方法

Posted 奇妙之二进制

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git基础教程(27)git commit --amend撤销方法相关的知识,希望对你有一定的参考价值。

为了保持git push时只有一个完整的commit,我们经常使用

git commit --amend

但有时想回退其中的某次commit,该怎么办?

好在git有撤销方法,下面的代码拿来举例。


当前代码仓有如下文件:

$ ll
total 4
-rw-r--r-- 1 ****** 1051817 3 九月 13 15:49 1.txt
-rw-r--r-- 1 ****** 1051817 3 九月 13 16:00 2.txt
-rw-r--r-- 1 ****** 1051817 2 九月 13 14:16 3.txt
-rw-r--r-- 1 ****** 1051817 7 九月 13 13:54 README.md

修改1.txt2.txt,并提交。

$ echo "12" >> 1.txt
$ echo "22" >> 2.txt
$ git add .
$ git commit -m "modified 1/2.txt"
[master b82585f] modified 1/2.txt
 3 files changed, 3 insertions(+)
 create mode 100644 3.txt

在未push前,继续修改3.txt,并执行git commit --amend覆盖上一个commit。

$ echo "32" >> 3.txt
$ git add 3.txt
$ git commit --amend
[master 6889e84] modified 1/2/3.txt
 Date: Thu Sep 14 14:18:40 2017 +0800
 3 files changed, 4 insertions(+)
 create mode 100644 3.txt

执行git log发现最新的commit id 已经从b82585f变为了6889e84

$ git log
commit 6889e8402d8f40b38f5e6c0aff686b6b3ca82389 (HEAD -> master)
Author: ******
Date:   Thu Sep 14 14:18:40 2017 +0800
 
    modified 1/2/3.txt
 
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working tree clean,

这就演示到文章开头同事遇到的问题了,amend覆盖了上一个commit,且提交了对文件的修改,只是他未修改description。


撤销开始

如果我们忘记了被覆盖的那个commit id,那就用reflog命令看一下

$ git reflog
6889e84 (HEAD -> master) HEAD@0: commit (amend): modified 1/2/3.txt
b82585f HEAD@1: commit: modified 1/2.txt
 
$ git reset b82585f
Unstaged changes after reset:
M       3.txt
 
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
 
        modified:   3.txt
 
no changes added to commit (use "git add" and/or "git commit -a")
 
$ git log
commit b82585f65b4c467a7e5855191b73a613fcf20892 (HEAD -> master)
Author: ares.wang <ares.wang@seraphic-corp.com>
Date:   Thu Sep 14 14:18:40 2017 +0800
 
    modified 1/2.txt 

可以看出,reset已经恢复到上一个被覆盖的commit id了,且对文件的修改回退到代码仓not staged的状态了

不使用 git reset --hard的目的就是为了保留本地修改,否则修改就会被丢弃!演示如下:

$ git reset --hard b82585f
HEAD is now at b82585f modified 1/2.txt
 
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working tree clean

3.txt的modified没有了,切记慎用--hard参数,除非你确定放弃当前未提交的所有修改!

以上是关于git基础教程(27)git commit --amend撤销方法的主要内容,如果未能解决你的问题,请参考以下文章

git基础教程回退还没push的commit--git reset

git基础教程(17)回退提交push到远端的提交--git revert 详解

git基础教程(26)git rebase -i合并多个提交

Git 基础教程 之 撤销修改

git 教程 --git revert 命令

git基础教程(16)git clean清理未被track的文件和目录