如何撤消对特定文件的已提交更改而不进行变基?

Posted

技术标签:

【中文标题】如何撤消对特定文件的已提交更改而不进行变基?【英文标题】:How to undo committed changes to specific files without rebasing? 【发布时间】:2021-08-31 17:17:03 【问题描述】:

我在这个分支上做了大约 20 次左右的提交。在这些提交中的某个地方,我不小心对不应该出现在我的拉取请求中的文件进行了多次重构更改。我不想为每个有不需要的更改的文件一个一个地变基,这将是一个令人头疼和一场噩梦,因为现在这些文件中存在合并冲突,我知道我想撤消 all 我对特定文件的更改。

我只想创建一个提交,以还原我在我无意更改的文件中所做的所有更改。

【问题讨论】:

如果你不赞成,你能分享一下为什么吗? 【参考方案1】:

您似乎想要完全恢复对目标文件的更改,并将它们重置为根提交中的状态(您使用 HEAD~20 指向的那个)。

一个简单的方法是:

git checkout <that sha> -- file1 file2 file3 ...
# you can also checkout those files one by one, or if you have a list :
git checkout <that sha> -- $(cat list.txt)

# check the content, then run :
git commit

【讨论】:

嗯..我下次试试这个。【参考方案2】:

到目前为止,我最好的解决方案是从我当前的分支创建一个分支,软重置我所做的所有提交。

git checkout -b <newBranch> <currentBranch>
git reset --soft HEAD~20
git reset

暂存并提交不需要的文件。

git add <unwantedFile1>
git add <unwantedFile2>

然后提交这些更改,然后为这些更改创建一个还原提交。

git commit -m "Unwanted refactoring"
git log

然后复制该提交的 sha,然后创建一个恢复提交:

git revert <sha>

然后复制该提交,然后切换回第一个分支并选择恢复提交。

git cherry-pick <revertSha>

【讨论】:

所以您似乎知道所有文件的名称以及它们“正确”的提交的 SHA。那么为什么不直接从该提交中恢复它们呢?不需要这个加沃特...查看其他答案。

以上是关于如何撤消对特定文件的已提交更改而不进行变基?的主要内容,如果未能解决你的问题,请参考以下文章

如何撤消两次提交之间的更改?

如何撤消 git 中的最后一次提交,但保持我的更改未暂存?

我分享了我的提交历史?

如何列出更改特定文件的所有提交?

git:撤消所有工作目录更改,包括新文件

git revert 回到某个提交而不更改历史记录并创建一个新的提交,如 git revert