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

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


当前回答

撤销最后一次承诺的最简单方式是

git reset HEAD^

这将带来项目状态 之前,您已经做出承诺。

其他回答

尝试此选项, 硬重置到未添加文件的上一个任务, 然后 :

git reset --hard <commit_hash>

确保您有备份的更改, 以防万一, 因为它是一个困难的重置, 这意味着它们会丢失( 除非您更早隐藏) 。

头:

在重置承诺之前, 我们应该知道关于 HEAD... HEAD 在您的工作目录中只是您目前的状况。 它由承诺编号代表 。

Git 承诺 :

在由独有标记表示的一承诺下指定的每项更改。 无法删除提交。 所以, 如果您想要您最后的承诺, 您可以使用 git 重设来跳入它 。

您可以使用两种方法跳入最后一个承诺 :

方法1:(如果不知道承诺编号,但想移动到第一个)

git reset HEAD~1  # It will move your head to last commit

方法2: (如果知道您只需将承诺重置到您已知的承诺上)

git 重置 0xab3 # 提交编号

注意: 如果您想要了解最近一个尝试 git 日志 - p - 1 的最近运行尝试

以下是图形表达式 :

为了将一些文件从 Git 承诺中移除, 请使用“ - 软” 选项的“ git 重置” 命令, 并在 HEAD 之前指定此承诺 。

$ git reset --soft HEAD~1

当运行此命令时, 您将会看到最近任务( HEAD) 中的文件, 您将能够执行它们 。

现在您的文件在中转区, 您可以使用“ git reset” 命令再次删除它们( 或取消它们) 。

$ git reset HEAD <file>

注意: 这次, 您正在从 HEAD 中重新设置文件, 因为您只是要将文件从您的中转区域中排除 。

如果您对该文件不再感兴趣,请使用“git rm” 命令从索引(也称为中转区)中删除文件。

$ git rm --cached <file>

修改完成后,您可以使用“修正”选项再次进行修改。

$ git commit --amend

要验证文件是否正确从仓库中移除文件, 您可以运行“ git Is- 文件” 命令, 检查文件是否在文件中出现( 如果是新的文件) 。

$ git ls-files

 <file1>
 <file2>

使用 Git 恢复从文件中删除文件

自 Git 2. 23 以来, 有一种将文件从承诺中移除的新方式, 但是您必须确保您使用的 Git 版本大于或等于 2. 23 。

$ git --version

2.244.1 Git 版本

注: Git 2.23 于2019年8月发布,

要安装更新版本的 Git, 您可以检查此教程 。 要将文件从承诺中删除, 请使用“ git reform” 命令, 使用“ 源代码” 选项指定源代码, 并指定要从仓库中删除的文件 。

例如,为了将名为“ Myfile” 的文件从HEAD 删除, 您将写入以下命令

$ git restore --source=HEAD^ --staged  -- <file>

举例来说, 让我们假装您编辑了您最近在您的“ 主管” 分支上的承诺中的文件 。

文件已正确执行, 但您想要从您的 Git 仓库中删除它 。

要从 Git 仓库中删除您的文件, 您需要先恢复它 。

$ git restore --source=HEAD^ --staged  -- newfile

$ git status

在分支“ 校长” 上

您的分支比“ 来源/ 主管” 提前 1 个承诺 。 (使用“ 提供推动” 来发布您本地的承诺 )

拟承诺的修改:

 (use "git restore --staged <file>..." to unstage)
    modified:   newfile

未准备进行的更改:

 (use "git add <file>..." to update what will be committed)
 (use "git restore <file>..." to discard changes in working directory)
      modified:   newfile

如你所见 你的档案又回到了中转区

从那里,您有两个选择, 您可以选择编辑您的文件, 以便重新重新打开它, 或者简单地从您的 Git 仓库中删除它 。

从 Git 仓库中删除文件

在本节中,我们将描述从您的 Git 仓库中删除文件的步骤。

首先,您需要卸载您的文件, 因为如果它被摆放, 您将无法删除它 。

要卸载文件, 请使用“ git 重置” 命令, 并指定 HEAD 为源代码 。

$ git reset HEAD newfile

当您的文件被正确卸载时, 请使用“ git rm” 命令, 使用“ cached” 选项来从 Git 索引中删除此文件( 这不会删除磁盘上的文件)

$ git rm --cached newfile

r m ' newfile' (新文件)

如果您现在检查了仓库状态, 您将可以看到 Git 正在准备删除承诺 。

$ git status

在分支“ 校长” 上

您的分支比“ 来源/ 主管” 提前 1 个承诺 。 (使用“ 提供推动” 来发布您本地的承诺 )

拟承诺的修改:

 (use "git restore --staged <file>..." to unstage)
    deleted:    newfile

现在您的文件已经准备就绪, 只需使用“ 授权承诺” 和“ 修正” 选项, 以修正您仓库中的最新承诺 。

`$ git commit --amend

 [master 90f8bb1] Commit from HEAD
  Date: Fri Dec 20 03:29:50 2019 -0500
  1 file changed, 2 deletions(-)
  delete mode 100644 newfile

`如你所见,这不会产生新的承诺,但将从根本上修改最近的承诺,以便包括您的更改。

从 GitCroud 中删除指定文件

某些情况下,你不希望所有文件再次出现:你只有一个文件可以修改一个非常具体的存储库文件。

要从 Git 承诺中删除特定文件, 请使用“ 软” 选项中的“ git 重置” 命令, 指定 HEAD 之前的承诺, 以及您要删除的文件 。

$ git reset HEAD^ -- <file>

修改完成后,您的文件就会回到中转区

首先,您可以选择使用“ Git 重置” 命令从中转区域删除文件,并指定您要从 HEAD 中重置。

$ git reset HEAD <file>

注意: 这并不意味着您会丢失此文件中的更改, 只是文件会被从中转区删除 。

如果您想要从索引中完全删除文件, 您就必须使用“ git rm” 命令, 并使用“ cached” 选项 。

$ git reset HEAD <file>

为了确保您的文件被正确从中转区移除, 请使用“ git Is- files” 命令来列出属于索引的文件 。

$ git ls-files

当您的修改完全完成后, 您可以使用“ git deform” 命令和“ amend” 选项来修改您删除文件的承诺 。

$ git commit --amend

撤消上一个任务

在很多情况下,你真的想撤销你代码中的最后一项承诺。例如,因为你想对它进行广泛的重组,甚至完全抛弃它!

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

$ git reset --soft HEAD~1

以上命令( 重置) 将把您当前的 HEAD 分支倒回指定的修改 。 在以上的例子中, 我们想回到当前修改前的修改中, 有效地取消我们上次的修改 。

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

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

$ git reset --hard HEAD~1

如果你们在本地做出你们不喜欢的事,而他们还没有被推倒,而你们却可以把事情重现为以往的善事。这好像坏事从未发生过。下面是这样的:

在您的终端中( 终端、 Git Bash 或 Windows 命令提示) , 浏览到您的 Git repo 的文件夹中。 运行 git 状态, 并确保您有干净的工作树。 每个承诺都有一个独特的散列( 看起来像 2f5451f ) 。 您需要找到最后一件好事的散列( 您想要返回到哪个地方 ) 。 这里有两个地方您可以看到要承诺的散列 : 在 GitHub 或 Bitbucket 网站或网站的承诺历史中 。 在您的终端中( 终端、 Git Bash 或 Windows 命令快递) 运行命令 git 日志 -- 在线, 一旦您知道最后一件好事的仓列( 您想要返回到哪个地方) , 请运行以下的命令( 将 2f5451f 与您的承诺重写 ) :

git reset 2f5451f
git reset --hard 2f5451f

注意 : 如果您确实重置承诺, 将会删除, 但更改将显示为未承诺, 允许您访问代码 。 这是最安全的选项, 因为也许您想要一些代码, 现在您可以做出一些好的更改和新承诺 。 通常您会想要撤销承诺, 丢弃代码, 这正是 Git 重置 -- hard 所做的 。