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

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


当前回答

简单的分步骤指南如下:

销毁承诺并抛弃任何未承诺的变更

git reset --hard HEAD~1

取消承诺,但保留您的更改

git reset HEAD~1

保存您的文件, 并自动将所有更改都放回后方

git reset --soft HEAD~1

使你们复活,而你们被毁灭;

git reflog #to find the sh

其他回答

使用 SourceTree ( Git 的图形工具) 查看您的承诺和树。 您可以单击右键手动重置它 。

这将添加一个新的承诺, 删除所添加的文件 。

git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

或者您可以重写历史来撤销最后一项承诺 。

警告:此命令将永久删除对.java 文件( 和任何其他文件) 所做的修改 -- 从工作目录中删除所有修改 :

git reset --hard HEAD~1

硬重置为 HEAD-1 将把您的工作副本设定为您错误实施前的行为状态 。

撤消一次承诺重做( R)

$ git commit -m "Something terribly misguided" # (0: Your Accident)
$ git reset HEAD~                              # (1)
[ edit files as necessary ]                    # (2)
$ git add .                                    # (3)
$ git commit -c ORIG_HEAD                      # (4)

git 重新设置是撤销命令的责任。 它会解除您最后的承诺, 同时将您的工作树( 您在磁盘上的文件状态) 保留下来。 您需要重新添加它们才能再次执行 。 对工作树文件进行更正 。 git 添加您想要包含在您新承诺中的任何内容 。 提交修改, 重用旧承诺信件 。 重置旧头部复制到. git/ ORIG_ HEAD; 与 - c ORIG_ HEAD 承诺将打开编辑器, 该编辑器最初包含旧承诺的日志信息, 并允许您编辑它 。 如果您不需要编辑信件, 您可以使用 - C 选项 。

或者,为了编辑上一个承诺(或仅仅是其承诺信息),承诺 -- -- 修正将在当前索引中将修改添加到上一个承诺。

要删除( 不回覆) 被推进到服务器的承诺, 有必要重写历史, 使用 Git 推源主 -- force [- with- level] 重写历史。 使用 -- force; 偏好 -- force- with- level, 几乎总是一个坏主意。 正如 Git 手册中所指出的 :

如果你[重写历史]已经发表,你应该了解重写历史的意义。


继续阅读

您可以使用 git reflog 来确定您想要返回的 SHA-1 承诺的 SHA-1 。 一旦您拥有此值, 请使用上文解释的命令序列 。


HEAD~ 和 HEAD~ 1 相同。 如果您想要解开多次承诺, 文章“ HEAD ” 是否有帮助 。

另一种方式:

检查您想要返回的分支, 然后将本地工作副本重置到您想要在远程服务器上成为最新一份的承诺( 它将在离别后进行的一切) 。 要做到这一点, 请在 SupportTree I右键点击并选中的“ 重置 BranchNAME 以进行此承诺 ” 。

然后导航到仓库的本地目录并运行此命令 :

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

这将删除您本地仓库中当前一个后的所有承诺, 但只删除该分支 。

恢复和放弃承诺是最好的,如果你想在向公共部门等提出补丁时保持历史清洁有用的话。

如果你必须放下最上层的承诺, 那么以下的单行帮助

git rebase --onto HEAD~1 HEAD

但如果你想放弃其中的 多项承诺,你确实说

- > b - > c - > > d - > 硕士

,然后您要放弃“ c” 承诺

git rebase --onto b c

这将使“ b” 成为“ d” 删除“ c” 的新基础