从Git Pull Request中删除一个文件

63

我不小心将本地更改添加到现有文件中,现在想撤销此文件的更改,但不删除本地文件。我只想让它不在拉取请求中显示,而不想创建新分支,因为很多人已经评论了此PR中的其他文件。

16个回答

92

如果您更新了一个已经存在的文件,想要将其从PR中移除:

假设您正在staging分支上工作,并且您向PR提交了一个名为validate_model.py的文件。

要从PR中删除此文件并撤消其更改,只需执行以下操作:

git checkout staging -- validate_model.py

2
错误:路径规范文件与 Git 已知的任何文件不匹配。 - GorvGoyl
听起来你在错误的目录或者文件名拼写错误了! - Jared Wilber
我也遇到了这个错误。我在顶层目录中,使用 GitHub UI 中的复制按钮,所以知道它是正确的。如果显示“error:pathspec”,那么可以安全地假设此文件在 main 中不存在,我可以直接删除它吗? - Ollie Williams
1
不要使用暂存区,而是使用我们的“branch_name”进行操作。我就是这样做的,它对我起作用了:git checkout campaign_post -- tests/api_tests_new/routes/trafficking/campaign/__data__/test_campaign_post.json - surender pal

45

你可以使用 git reset 取消暂存特定文件,然后修改原始提交:

git reset HEAD^ /path/to/file
git commit --amend --no-edit
git push -f

这不会影响您工作副本中的文件版本。

或者,如果您想要删除多个文件,您可以将分支的头重置为上一个提交并创建一个新的提交:

git reset HEAD^  # move the tip of the branch to the previous commit
git commit -C ORIG_HEAD file1 file2 [...]  # list the required files
git push -f

30
  • 假设你的PR来自于feature-branch,合并到master分支。
  • 确保你在feature-branch分支中。
  • 现在假设你对./abc1.py做了一些不必要的更改,想让它和master分支一样。

运行以下命令:

git checkout origin/master -- ./abc1.py

现在,如果你运行:

git status

你会得到和master分支相同的更改。现在你可以提交你的更改并推送。


4
正是我正在寻找的。 - Cătălina Sîrbu
2
这并没有回答如何从拉取请求中删除文件。 - Krishna Oza

9

git checkout -- 文件名

这将放弃对文件的修改并将其还原为最后提交的更改。

您可以在此处了解更多信息:Git-Basics-Undoing-Things

阅读“取消修改的文件”一节。


8
为了澄清,首先需要获取添加此文件的前一个提交ID(使用git log <filename>)。然后只需运行“git checkout <commit id> <filename>”。然后,如果调用“git status”,您将看到可以将此文件取消检入以从PR中删除它。 - Mr. Blond
@Mr.Blond 把这个作为答案添加。 - quintin

9

可能有很多种方法可以撤销或还原您PR中的文件更改。
我没有找到确切的步骤,所以在这里提供以下内容:

场景:

假设您想要从PR中删除的文件是:
C:\GitRepos\MyProject\SomeFile.cs

该文件可能已修改,也可能没有更改(与主分支相同),但仍显示在您的PR中。

解决方案:

1) 确保您已经检出了创建该PR的特性分支。

2) 搜索文件的提交历史记录:git log "C:\GitRepos\MyProject\SomeFile.cs"

您将看到多个格式为的记录:

   commit <commit id> 
   Author: <author name> 
   Date: <Date of the commit> 
   <commit message>

3) 找到在您对SomeFile.cs进行任何更改之前的提交。 复制commit id

4) 使用先前复制的commit id检出该提交:

git checkout <commit id> "C:\GitRepos\MyProject\SomeFile.cs"

5) 如果您现在检查git status,则会看到SomeFile.cs处于待处理更改状态。

6) 您需要做的最后一件事就是使用以下命令提交这些更改:

git commit -m "从PR中删除SomeFile.cs"

并且推送您的更改。 :)


4

如果要从您的分支中删除已添加的文件,可按照以下步骤操作:

git reset HEAD^ 文件路径

然后执行修改提交,最后进行强制推送。

如果要从您最新的PR中删除已存在(仅在最新PR中进行了修改)的文件,请按照以下步骤操作:

在任何文本编辑器(如记事本或npp)中打开该文件。 将文件内容替换为未修改的版本(可能从源代码中复制最新更新的内容,或者根本没有您的更改)。 然后对该文件进行暂存和修改提交。最后进行强制推送。


3
我猜你的意思是你对某个文件 X 和其他文件 Y, Z 等做了一些更改。现在你只想撤销对 X 的更改,而不想在 push 中显示它(我猜你指的是 push 而不是 pull),所以你不能简单地将 X 编辑回之前的状态(也许你在源文件中意外提交了密码或其他机密信息等)。
如果只有一个提交引入了你对 X 的更改,那么使用 git rebase 来“跳过”该提交就是最简单的方法。假设 previouscommit 是你的更改之前的提交,brokencommit 是你想要删除的提交,则执行以下操作:
git rebase --onto previouscommit brokencommit yourbranch

如果另一方面,对于 X 的更改跨越了许多提交,并且/或者与其他文件的更改组合在一起,那么(其中previouscommit是最后一个“好”的提交):
git checkourbranch
git -i rebase previouscommit

在交互式变基中,对于每一行被更改的部分,选择编辑操作,并手动将其编辑掉。请参考git help rebase以获取更多细节信息,尽管应该很容易知道该怎么做。

2

对我来说,这个命令起作用:

git rm -r --cached pathname/filename

感谢您添加另一种解决方案。 - Ulysses

2

我有一个简单的解决方案:

  • 移除git缓存:git rm -r --cached .
  • 添加:git add --all
  • 提交:git commit -m "<COMMIT_MESSAGE>"
  • 推送:git push origin <BRANCH_NAME>

感谢点赞 - 但我觉得Jared Wilber的git checkout staging -- validate_model.py更短更实用。 - Ulysses
没错。但是我的答案也适用于如果我们想要清除PR中添加的所有文件。在这种情况下,我们不需要指定特定的文件名,这可能会节省很多时间。 - Md. Shahariar Hossen
我希望在被接受的解决方案中,* 可以适用于所有文件- 让我确认一下。 - Ulysses
当然,感谢@zip_lock_throw。我是StackOverflow的新手,很高兴看到我的初始答案正在接受审查。 - Md. Shahariar Hossen

2

请前往您已经推送更改的远程/origin分支(而非master分支),删除该特定文件。

在本地,将您的更改暂存,然后从远程分支拉取所有更改,这将删除该文件,然后弹出您的暂存以获取所有更改和已删除的文件。

以下是步骤:

  1. 从您的远程/origin分支中删除文件并提交(没有此步骤无法进行)
  2. git stash
  3. git pull
  4. git stash pop

备份工作区,然后检出提交前的版本(可能需要先重新分配分支标签),将备份还原到该版本上,然后提交正确的文件/更改,这样不是更容易吗?这将避免额外的提交。 - U. Windl
是的,这是更好的方法。 - Shrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接