如何修复还原的 git 提交?

Posted

技术标签:

【中文标题】如何修复还原的 git 提交?【英文标题】:How can I fix a reverted git commit? 【发布时间】:2011-07-18 07:14:46 【问题描述】:

我已经对存储库进行了一系列更改,但它们被其他人还原(它们在 Windows 上编译,但在 linux 上不编译)。我认为这些更改仍在历史记录中,但我怎样才能恢复这些更改、修复它们,然后重新提交?

【问题讨论】:

How do I "un-revert" a reverted Git commit?的可能重复 【参考方案1】:

您是否尝试过还原?

他们使用

恢复了您的提交
git revert <your commit id>

revert 本身是一个提交,并且有自己的提交 ID。所以现在你需要做

git revert <the commit id of his revert-commit>

【讨论】:

继续……我需要知道神奇的词,而不仅仅是理论。 如果找不到 ID,请显示提交日志。 找到了那些使用 git log 的。谢谢! 还原还原还原还原还原还原?大声朗读我的答案听起来真的很愚蠢。 :-)【参考方案2】:

您可以尝试使用git revert 还原还原。您还可以使用git checkout 从您的提交中恢复文件。或者您可以使用git cherry-pick -n 重新应用并更改它们。您可以从提交中创建一个新分支,并使用git branch 在其中应用更改。可能性(几乎)是无穷无尽的。 :)

【讨论】:

+1: git cherry-pick --no-commit 是一个不错的选择,尤其是因为您可以重复执行此操作以进行进一步的更改【参考方案3】:

此处的其他答案解决了如何恢复或挑选您的提交,但从这个问题听起来好像您还需要知道如何找到您的提交,所以这里有一些指导。

如果您只运行git log,您应该会看到当前分支历史记录中的提交列表,从最近的开始。每个提交都有一个标识符,技术上称为对象名称(或“提交的 SHA1sum”),如下所示:

commit d2d434beeb03e4ee648ca7ca2a1ea1ed09077306

... 后跟作者姓名、日期和该提交引入的更改的摘要。当您为git revertgit cherry-pick 指定对象名称时,您可以给它d2d434beeb03e4ee648ca7ca2a1ea1ed09077306 或对象名称开头的足够字符以明确(例如d2d434bee

git log许多 选项可以帮助您跟踪您的提交,例如--before-S 等,但在这种情况下您可能特别需要--author=MyLastName

gitk --all 是一个图形化的 git 工具,它可以很好地向您展示历史并在每个平台上都可用。如果您单击要还原的提交,则可以从窗口中间的“SHA1 ID”字段复制并粘贴其对象名称。

【讨论】:

git cherry-pick 与日志中的大提交 id 就像一个魅力.. 再次节省了 3 天的代码编写.. 谢谢【参考方案4】:

您也可以像@MarkLongair 的类似情况回答https://***.com/a/10415744/704008。 Answer 更适合多次提交如果您不希望 git 日志或源代码控制历史记录混乱恢复然后再次恢复恢复。

git revert abcd123
git revert --no-commit wxyz789
git commit --amend -m"you edit commit message"

您还可以在一行中为两个或多个还原提交简洁明了,例如:

git revert abcd123 wxyz789 --no-commit 
git commit --amend -m"you edit commit message"

... 然后编写适当的提交消息来描述恢复两个提交的综合效果。

所有这些都将显示为带有给定消息的单个提交,而不是 git 日志或源代码控制日志中的多次还原提交(如 bitbucket/TFS/JIRA git 集成)。

【讨论】:

以上是关于如何修复还原的 git 提交?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个 Git 提交(已推送)还原到已发布的存储库?

在 Git 中,如何恢复在提交之前还原的暂存文件?

如何 git 还原一个特定文件的更改,而我的提交更改也涉及其他文件? [复制]

如何还原某些用户在 GIT 存储库中所做的更改

如何完成还原提交,以及如何还原大量提交

无论如何都可以查看所有以前的 GIT 还原