Git 还原一些提交(包括合并),然后稍后重新提交

Posted

技术标签:

【中文标题】Git 还原一些提交(包括合并),然后稍后重新提交【英文标题】:Git Revert a few commits (including merges) then recommit them later 【发布时间】:2021-06-14 20:42:33 【问题描述】:

我有一个登台服务器,我使用来自 git 服务器的git pull 更新代码。这里有一个可能相关也可能不相关的细节是,在某些时候它开始发生,每次我拉它时都会要求我合并。我还没有足够的时间弄清楚为什么。无论如何,如果我查看git log,每次拉动后都会合并。无论如何,不​​是真正的问题。我只需要暂时恢复 2 个以前的提交(有 2 个相应的合并)。我对如何使用 git revert 出现在 git 日志中然后提交的 2+2 = 4 哈希值非常有信心。

问题是我想在以后重新提交还原,因为我们稍后需要这些更改,但不是现在。我是否需要做一些特别的事情以免丢失我恢复的提交?

【问题讨论】:

【参考方案1】:

revert 可能不是你想要的; revert 添加了一个撤消一组更改的新提交。 reset 更像是它,用于修改分支历史,但在做任何粗鲁的事情之前请阅读。

我建议的第一件事是尝试使用pull -r 自动将您的本地更改重新定位到更新后的分支HEAD(即分支的远程副本)。

您还可以使用rebase -i origin/mybranch 启动交互式rebase。 Rebase 是 git 最强大的功能,它允许你重写历史。这也有点危险,所以要小心。

rebase上的教程:https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase

无论你对本地 git 目录做什么,reflog 都会让你看到你的 repo 之前的状态(提交)。当我搞砸了 rebase 或 reset 时不小心“丢失”了一次提交,它救了我一两次。

【讨论】:

我明白了,我意识到我不需要真正重写历史本身。事实上,我的官方源代码在远程服务器上。我不想改变它。我只需要暂时回退一些本地提交。现在我想我可以在本地恢复和提交,然后一旦我准备好,我就可以再次从服务器上拉下来,该服务器应该有我之前恢复的所有更改。你觉得这行得通吗? 或者我应该做的是首先在本地恢复,这样我就有了我需要的东西。然后,一旦我想回到原始源代码,我可以更早地重置回相当多的提交,以便本地头 i 在远程头之前,然后再次拉取以恢复最新状态。这听起来怎么样? @jeffery_the_wind 听起来可行,试试吧! @jeffery_the_wind 当你不再认为使用 git 是一个循序渐进的过程,并开始将你的提交历史视为一系列独立的更改,你可以重写、润色、修剪和重新排列成你喜欢的任何结构,你就会成为我同事所说的“git Jedi”,你将不再被这些类型的问题所困扰。练习可视化你的回购历史(我使用tig OFTEN),并练习使用rebase。如果您曾经修改过提交,那么您已经开始了这段旅程。 :-) 是的,谢谢你的好建议。通过这个问题,我了解了一些关于 git 的知识。我意识到最好的办法是回到开发周期的前端,在开发服务器中做正确的事情,并将更改推送到整个管道。 (而不是尝试在登台服务器上进行更改)我能够使用 revert 恢复我在开发服务器中所做的那些错误更改。然后,我在登台服务器中,将 git 历史记录重置为较早的少数提交并重新拉取。繁荣,瞧,现在我也不再被要求在每次拉动时合并。感谢您的帮助!

以上是关于Git 还原一些提交(包括合并),然后稍后重新提交的主要内容,如果未能解决你的问题,请参考以下文章

git 开发测试分支失误合并到了master分支,怎么还原?

git无法提交,存在未提交的修改,在重新合并前或者撤销更改

如何修复还原的 git 提交?

还原合并提交时 1 和 2 的意义

git merge仓

忽略或跳过 Git 上的某些提交 [重复]