- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这个问题在这里已经有了答案:
How to undo “git commit --amend” done instead of “git commit”
(12 个回答)
3年前关闭。
我不小心输入了 git commit --amend。这是一个错误,因为我意识到提交实际上是全新的,应该使用新消息提交。我想做一个新的提交。如何撤消此操作?
最佳答案
PetSerAl's comment 是关键。这是执行您想要的操作的两个命令序列:
git reset --soft @{1}
git commit -C @{1}
a123456...
)(通过 HEAD
,它为我们提供当前分支)。我们将此 ID 称为 C(代表 Current)。请注意,当前提交有一个父提交;让我们称其为 P(对于 Parent)。 --amend
Git 时会稍微改变这个过程。它仍然像以前一样写一个新的提交,但在第 3 步中,不是用 parent = C 写新提交,而是用 parent = P 写它。
P--C
结尾的提交图开始,由
branch
指向:
...--P--C <-- branch
N
时,我们得到:
...--P--C--N <-- branch
--amend
时,我们会得到这个:
C
/
...--P--N <-- branch
C
仍在存储库中;它只是被推到一边,让开,以便新提交
N
可以指向旧的父级
P
。
git commit --amend
之后,你意识到你想要的是让链看起来像:
...--P--C--N <-- branch
N
;一旦任何提交(或任何其他对象)存储在 repo 中,Git 就永远不能更改它——但请注意,
...--P--C
链仍然在那里,完全完好无损。你可以通过 reflogs 找到 commit
C
,这就是
@{1}
语法所做的。 (具体来说,这是
currentbranch@{1}
,2 的缩写,意思是“
currentbranch
一步前指向的地方”,即“提交
C
”。)
git reset --soft @{1}
,它执行以下操作:
C <-- branch
/
...--P--N
branch
指向
C
,后者又指向
P
。
N
会发生什么?与之前发生在
C
上的事情相同:它通过 reflog 保存了一段时间。
--soft
的
git reset
标志使索引/暂存区保持不变(以及工作树)。这意味着我们现在可以再次进行新的提交,只需运行另一个
git commit
。它将经历相同的四个步骤(从
HEAD
读取 ID、创建树、创建新提交和更新分支):
C--N2 <-- branch
/
...--P--N
N2
将是我们新的(第二个新的?)提交。
git commit
重用来自 commit
N
的提交消息。
git commit
命令有一个
--reuse-message
参数,也拼写为
-C
;我们所要做的就是给它一些东西,让它找到原始的新提交
N
,从中复制消息,制作
N2
。我们怎么做?答案是:它在 reflog 中,就像我们需要执行
C
时的
git reset
一样。
@{1}
!
@{1}
的意思是“刚才的位置”,而
git reset
刚刚更新了它,将它从
C
移动到
N
。我们还没有进行新的提交
N2
。 (一旦我们这样做,
N
将是
@{2}
,但我们还没有。)
git reset --soft @{1}
git commit -C @{1}
HEAD
被分离,使得没有当前分支,则含义变为
HEAD@{1}
。请注意,
@
本身是
HEAD
的缩写,因此
@{n}
指的是当前分支而不是
HEAD
本身这一事实有点不一致。
git checkout develop
后跟
git checkout master
(假设两个分支都存在)。第一个
checkout
将
HEAD
更改为指向
develop
,第二个将
HEAD
更改为指向
master
。这意味着
master@{1}
是在最后一次更新
master
之前提交
master
指向的任何提交;但是
HEAD@{1}
是
develop
现在指向的提交——可能是其他一些提交。
git checkout
命令之后,
@{1}
现在表示
master@{1}
,
HEAD@{1}
现在表示与
develop
相同的提交,而
@
表示
HEAD
。如果你感到困惑,那么,我也是,显然我并不孤单:见评论.)
关于git - 如何撤消 git commit --amend,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38001038/
我正在寻找一种方法来编写 Signed-off-by:当我提交时自动标记。 我尝试通过 .git/config 文件配置它 (Reference) .我把这些代码行: [alias] comm
我使用的是 visual studio 2013,在提交 C# 代码时我面临 3 个选项。我需要解释每个选项之间关于我的本地存储库与 GitHub 存储库发生的情况的差异。 选项 1 表示提交 选项
我刚从 classes12.jar 升级到新的 jdbc 驱动程序到 ojdbc7.jar 我的应用在使用 ojdbc7.jar 运行时抛出异常: java.sql.SQLException: Cou
我问的是 Oracle SQL*PLUS ... 最佳答案 没有 :-) Oracle says The WORK keyword is supported for compliance with s
我必须在许多分支、许多存储库上恢复对文件所做的更改。我知道我可以使用 git checkout 哈希文件名,然后推送该更改。 问题是,我只知道在我想要恢复的实际提交之前有两次提交。 我怎样才能在这之前
看起来很简单,但我就是不明白。我在我的应用程序的根目录中。 这是我的工作流程。 git add . git commit -m "added a new feature some files chan
假设我有一个 git 分支,在共享它之前的最后审查中,我发现了一些小错误,例如拼写错误。我想做的是将那个补丁应用为“修复”,但它实际上会影响许多提交,因此在最终历史记录中没有错误的迹象。 也就是说,如
当我运行hg commit时,Mercurial会为我的提交消息生成一个文件,如下所示: HG: Enter commit message. Lines beginning with 'HG:' a
我已经为项目创建了一个新的存储库,并向其中添加了一些现有的代码库 (llvm)。该代码库大约有 18,000 个文件,这使得我的初始提交花费了大量时间。 (阅读5小时) 有没有办法将这个巨大的提交分成
我在 git review 上得到以下内容: git review You are about to submit multiple commits. This is expected if you
我一直在寻找一种替代解决方案来压缩分支中的一系列提交。我过去所做的是使用 git rebase -i HEAD~然后选择哪个 promise 进行压缩。通常我 pick编辑最新的提交,并压缩其间的冗余
把玩Git和GitHub,我发现有时候一个 git commit -a 需要提交修改过的文件。 (此文件已添加到项目中)。 但有时候,只是一个 git commit 会起作用。如果使用 Mercuri
我正在努力思考 Git 的复杂性。 我使用“git clone [url here]”从 GitHub 下载了一个存储库。 我做了一些更改,尝试使用“git commit”提交它们。这似乎没有将更改推
当试图恢复到之前的提交时,我尝试了: git revert --no-commit 0766c053..HEAD 然而这给出了一个错误: empty commit set passed 问题错误是什么
我的存储库的历史非常复杂。我经常发现自己想知道过去的某个提交是“在”还是“可从”某个修订版(通常是我的一个头脑)“进入”或“可访问” 我该怎么做呢? 最佳答案 您可以使用 revsets syntax
我有:http://windows.github.com/ 我当前的项目有大约 20k 个文件,大约 150MB(并且不说它有多慢而且我现在什么也做不了)它甚至不允许我提交!我收到此错误:提交失败:无
我正在运行 postgres 9.2 服务器并有一个使用 psycopg 2.5 的 python 客户端。 我进行了一些测试,因为我在日志文件中遇到了很多警告:没有正在进行的事务条目。 我有一些代码
我的主要问题是总是执行 git commit -am 而不是 git add 是否有意义。然后是 git commit -m? 我知道 -am 表示它将添加修改后的 TRACKED 文件的所有更改。所
如果我想查看 之间的差异和工作目录 (WD),我运行 % git diff 这通常会做我想做的事,但如果 WD 包含在 时被跟踪的文件,它就会这样做。已创建,但现在(或在当前分支中)未被跟踪,则
我正在阅读有关 git 对象的信息:blob、树、提交、标签。为了更好地理解 git 的工作原理,我尝试了一些低级命令,如 write-tree 和 commit-tree。 mkdir 测试; cd
我是一名优秀的程序员,十分优秀!