我无意中把错误的文件给了Git, 但还没有把承诺推到服务器上。

我如何从当地存储库撤销这些承诺?


当前回答

撤消上次承诺 :

git 重设 -- s软 HEADQ 或 git 重置 -- s软 HEAD~

这将撤销最后一项承诺 。

在这里 -- 软意味着重置中。

HEAD~ 或 HEAD_ 意思是移动 在 HEAD 之前承诺。


替换上次承诺的新承诺 :

git commit --amend -m "message"

它将以新承诺取代最后一项承诺 。

其他回答

如何使用,重置 -- 软的或重置 -- 硬的?

@Kyralessa的回答:

如果您不确定该使用什么 -- Soft (我用这个公约来记住它 -- 安全性 -- 软性) 。

为什么?

如果您选择 -- 错误地选择 -- 错误地选择, 您将会失去以前没有的更改。 如果您选择 -- 错误地选择 -- 错误地选择 -- 软, 您可以通过应用额外命令而实现同样的结果 -- 硬

git reset HEAD file.html
git checkout -- file.html

完整示例

echo "some changes..." > file.html
git add file.html
git commit -m "wrong commit"

# I need to reset
git reset --hard HEAD~1 (cancel changes)
# OR
git reset --soft HEAD~1 # Back to staging
git reset HEAD file.html # back to working directory
git checkout -- file.html # cancel changes

感谢@Kyralessa。

在这种情况下,"重置"命令就是你最好的朋友:

git reset --soft HEAD~1

重置将会将您当前的 HEAD 分支倒带到指定的修改 。 在以上的例子中, 我们希望回到当前修改之前的修改 - 有效地取消我们最后的承诺 。

注意 -- soft 旗号 : 这样可以确保未撤销修改的更改被保存。 在运行命令后, 您会发现您的工作副本中这些更改是未承诺的本地修改 。

如果您不想保留这些更改, 请使用 -- 硬旗 。 确定只有在您确定不再需要这些更改时才这样做 。

git reset --hard HEAD~1

认为我们已经有了 code. txt 文件。 我们对其做了一些修改并承诺。 我们可以以三种方式撤销此承诺, 但首先, 您应该知道什么是预置文件... 一个预设文件是一个可以承诺的文件。 如果您运行 git 状态, 此文件将会显示为绿色颜色, 如果它没有被预设用于承诺, 将会显示为红色颜色 :

意思是如果您承诺更改, 此文件中的更改没有被保存 。 您可以在您的舞台上添加此文件, 添加 code. txt , 然后进行更改 :

撤消上次承诺 :

现在,如果我们想要在不做其他任何更改的情况下撤销承诺, 我们可以使用 git 重设 -- soft HEAD * 如果我们想要撤销承诺及其更改( THIS 是危险的, 因为您的更改将会丢失) , 我们可以使用 git 重置 -- 硬 HEAD * 如果我们想要撤销承诺并删除舞台上的更改, 我们可以使用 git 重置 -- mixed HEAD* 或短格式的 git 重置 HEAD***

撤销一项承诺是有点吓人,如果你不知道它是如何运作的。 但如果你理解的话,它其实很容易。我会告诉你4种不同的方式, 你可以解除一项承诺。

说你们有这个,C是你们的总部,(F)是你们档案的状态。

   (F)
A-B-C
    ↑
  master

选项1: git 重设 -- hard

您想要销毁C实施者, 并丢弃任何未承诺的更改 。 您这样做 :

git reset --hard HEAD~1

结果是:

 (F)
A-B
  ↑
master

B现在是 HEAD 。 因为您使用 -- hard 键, 您的文件被重置为在承诺 B 状态 。

备选2:Git重置

实施 C 可能不是一场灾难, 只是有点不对劲 。 您想要撤销此承诺, 但要在做出更好的承诺之前先保留您的更改, 然后再进行编辑 。 从这里重新开始, 以 C 为主机 :

   (F)
A-B-C
    ↑
  master

做到这一点, 离开 -- hard :

git reset HEAD~1

在这种情况下,结果是:

   (F)
A-B-C
  ↑
master

在两种情况下, HEAD 都只是最新承诺的指针。 当您重置 HEAD~ 1 时, 您会告诉 Git 将 HEAD 指针移回一个。 但是( 除非使用 -- hard) 您会离开文件原样。 因此, Git 状态显示您检查到 C 的更改 。 您没有丢失任何东西 !

备选方案3: git 重设 -- 软

对于最轻的触摸,你甚至可以撤销你的承诺,但留下你的文件和索引:

git reset --soft HEAD~1

这不仅留下您的文件, 甚至留下您的索引 。 当您做 Git 状态时, 您就会看到相同的文件在索引中 。 事实上, 在此命令之后, 您就可以做 Git 承诺, 您就会重做您刚刚做的同样的事情 。

选项 4: 您确实重置了 git -- hard 重置, 并且需要将代码调回

还有一件事:假设你像第一个例子一样摧毁一个承诺,但发现你毕竟需要它?运气不好,对吧?

不,还有办法把它拿回来,按这个键

git reflog

你将看见一份你所迁入的沙子(部分),你将看见它。你应当发现你所破坏的,你应当做这件事:

git checkout -b someNewBranchName shaYouDestroyed

承诺在Git不会在90天内被摧毁 所以你通常可以回去 拯救一个你本不想除掉的人

如何修正上一个本地承诺

使用 git- gui (或类似) 执行 git- committee -- amend 。 您可以从 GUI 中添加或删除承诺中的单个文件。 您也可以修改承诺信件 。

如何撤销上一个本地任务

只需将分支重置到上一个位置( 例如, 使用 gitk 或 git 重新基准 ) 即可。 然后重新应用保存的副本中的更改 。 在本地仓库收集垃圾后, 它会像未发生不想要的操作一样。 要在单一个命令中完成所有这些, 请使用 git 重置 HEAD~ 1 。

警告的话: 粗心使用 Git 重置是一个很好的方法, 让你的工作副本陷入混乱状态 。 我建议Git Novice 尽量避免这种情况 。

如何撤销公开承诺

执行反向樱桃选取( git- revert) 以撤销更改 。

如果你还没有在你的分支上做其他的修改, 你可以简单地做。 。 。

git revert --no-edit HEAD

然后将更新的分支推至共享仓库 。

承诺历史将分别显示两个承诺。


高级:对公共储存库中的私营分支机构的更正

这可能很危险 -- -- 请确定您有该分支的本地副本要反射 。

备注:如果有其他人在为分支工作,您不想这样做。

git push --delete (branch_name) ## remove public version of branch

清理你的分行 在当地,然后冲...

git push origin (branch_name)

通常情况下, 您可能不需要担心您的私人部门 将历史变为原始历史。 只要催促后续承诺( 参见上面的“ 如何撤销公共承诺 ” ) , 然后再做壁球合并来隐藏历史 。