【问题标题】:How to undo the changes in github after deleting a file?删除文件后如何撤消github中的更改?
【发布时间】:2021-12-01 05:25:09
【问题描述】:

今天我提出了一个 PR(来自我的 IDE):其中,在我推送的提交中,有 3 个文件被触摸。

现在我做了什么:我删除了 GitHub 中的一个文件并创建了一个新的提交(现在更改的文件是 2 个)。

您能帮我恢复/撤消文件的删除吗?

(我对 Git 版本控制系统和 GitHub.com 非常陌生)

【问题讨论】:

  • 您需要提供更多详细信息。您从哪个分支删除文件?你是从另一个分支删除文件然后通过拉取请求合并(在这种情况下你可以revert the Pull Request)还是你刚刚从主/主分支中删除并直接在主/主上提交?
  • 我编辑了您的信息,试图使其更清晰,并更正技术术语的使用。我已尽力而为,但请确认其含义已被保留。

标签: git visual-studio github git-pull


【解决方案1】:

这就是我理解你所做的:
(尽管你可能只通过 GitHub.com GUI 完成了它)

git add file1 file2 file3
git commit -m 'add files'
rm file1
git add file1
git commit -m 'removed unnecessary file'
git push origin master

现在你想恢复file1,对吧?

如果是,您可以通过以下方式进行准备:

  • git stash -u 临时删除所有未提交的更改。
  • git checkout master 以确保您位于要将文件恢复到的同一分支中(也可以使用 git loggit show HEAD 来查看上次提交)

那么……

...要真正恢复file1,您可以:

  • git revert HEAD 并确认;这将创建一个新的提交,恢复上次提交带来的所有更改 (HEAD)。这实际上类似于 撤消 操作,将在您的 Git 历史记录中可见(再次参见 git log

  • 您可以签出(恢复)仅特定的file1,而不是恢复整个先前的提交,从提交返回历史记录(HEAD当前/最后一次提交,而HEAD^一次及时提交HEAD^^^3 次及时提交;您可以用git show HEAD^查看它的变化)
    • git checkout HEAD^ -- file1 恢复文件(通过git diff查看创建的更改)
    • git add file1 & git commit -m 'restore the file that was wrongly removed' 以便重新添加文件并重新提交。
    • git push origin master --force-with-lease 覆盖之前的提交
      • 注意:这是非常不鼓励的! 特别是如果您对 Git 没有很大的信心。强制git push 有可能永远抹去您在项目上所做的所有工作。因此,请避免使用此选项,并在以后再次检查。你也可以给this old question of mine支票。

另外

我的印象是您不清楚 Git(通过控制台管理的协议和版本控制系统)和 GitHub.com(用于存储、管理、显示 Git 存储库的 Microsoft 在线门户)。

GitHub.com 提供的界面极其有限,因此您不能仅通过 GitHub.com 用户界面执行revert 的操作。

不幸的是,您将不得不学习如何通过 CLI(命令行界面)管理 Git。一开始会很痛苦,但值得付出努力(如果您是开发人员)。
使用一个 Git GUI 客户端(请参阅 this list)在您尝试理解 Git、它的命令和逻辑时可能会有很大帮助。

PS - 不要忘记将此标记为最佳答案,如果这能澄清您的疑问,请使用 ✅。

【讨论】:

  • 感谢您的回答和解释,我从 vs 代码中提出了 PR,我正在解释我所做的步骤,我在里面创建了一个分支,我只做了两个文件更改,但我没有知道为什么以前的分支更改也反映到 git 然后它变成 3files 在 git PR 中更改,在 GitHub 中我删除了一个文件-3 但现在我需要恢复我在 viscode 中所做的步骤:-1) git checkout 2)createNew分支3)提交消息 4)在 vs 代码中选择一个勾号 5)git push 我在 GitHub 中执行的步骤:-1)单击 PR 2)选择文件更改 3)单击文件 3 并从 vscode 中删除 4)我做了 git pull
  • 当你创建一个新分支时,这是基于当前分支(所以当你从branch-1创建一个PR-branch时,你在Git历史记录中的同一点(你只是现在使用不同的指针,称为PR-branch)。当您在PR-branch 上创建提交时,这将与[branch-1 的历史记录以及PR-branch 指向的1 个提交] 相同。 例如 您的历史记录:INIT-commit
  • 如果那是正确的,那么我认为您的错误是将PR-branch 基于branch-1 的历史记录,而不是将PR-branch 基于@ 的历史记录987654354@ 分支(所以PR-branch 脱离了branch-1 的历史)。