繁体   English   中英

从我的 pr 中删除文件而不从目标分支中删除它?

[英]Remove file from my pr without removing it form target branch?

我不小心将提交的文件添加到我的拉取请求中。 我希望该文件与目标分支中的文件相同,并且下一次推送我希望该文件从我的 pr 中删除。 我试过git rm但看起来它会在合并时从目标分支中删除该文件。 那么我的出路是什么?

要知道的事情:PR 不“包含”文件,因此“从我的 PR 中删除文件”的概念是无稽之谈。 PR 只是您打算合并到另一个分支的分支。 分支也不包含文件; 它们包含提交。 从某种意义上说,提交确实包含文件,但不是以单独的方式; 每个提交都包含您的所有文件。

可能的意思是您不喜欢 web 界面显示的差异,告诉您此分支威胁要更改您不喜欢的文件。

那么为什么不直接推送一个提交,使文件看起来与目标分支(您打算合并到的分支)相同呢?

拉取请求 web 接口将不会将该文件显示为文件之一已更改,因为它与目标分支的差异将为空。 并且合并不会对目标分支中的文件产生任何影响。 这似乎是目标。

实现这一点的一个好方法是(在拉取请求分支上工作):

git show targetBranch:myFile > myFile
git add myFile
git commit -m 'fixed myFile'
git push

您可以在您的 pr 分支上添加一个新的提交,其中包含恢复的文件更改:

git checkout targetBranch -- file
git commit -m 'Revert file changes'
git push

或者,如果您不想要额外的提交,您也可以随时修改您的提交并强制推送。

git checkout targetBranch -- file
git commit --amend --no-edit 
git push -f

一个分支指向一系列提交的尖端。 每个提交都指向一棵blob或嵌套树。 树描述目录,blob 描述文件内容。 每个 blob 都包含完整的文件内容。 因此,每个提交都描述了您存储库在任何时间点的完整快照

当分支和合并分支时(例如接受 GitHub PR),只有分支的尖端/头部提交之间的差异被合并到目标分支中。


我假设您想在开始分支之前将此文件恢复到目标分支的初始版本。 您可以通过运行checkout / restore并提供合并基础提交和文件路径来执行此操作。 任何一个都应该工作:

git checkout "$(git merge-base target-branch your-branch)" -- path/to/file
git restore --source="$(git merge-base target-branch your-branch)" -- path/to/file

运行上述命令之一后,您会注意到即将在暂存区域提交的“新”更改。 这些更改与您的意外更改相反,会将文件恢复到其初始 state。 运行git commit以将此新快照持久保存在当前分支之上。


高级:之后,您可能想要运行git rebase以将此提交压缩为“错误”提交。 这样,分支的历史将永远不会提及对该文件的更改——就好像它根本没有更改过一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM