22

我很难掌握如何使用 rebase/revert 来实现这一点。

我在我的master分支上工作,在某个提交后我的软件停止工作。我不想放弃当时所做的更改,并且我迫于压力要按时达到里程碑,所以我返回了一些提交git checkout并创建了一个名为的新分支working并开始在那里推送我的所有更改。后来我意识到master不需要这些更改(在分支上进行)。现在我想回到我的主分支并删除我用来创建working分支的提交之后的所有提交,然后将我working的分支合并到master分支。

我用在线照片编辑器创建了一张图像,试图解释我想要做什么。我希望它有帮助:

位桶的屏幕截图

我想保留 5cb967f 之后的所有内容。摆脱 5cb967f 和 a0c1de2 之间的所有内容(不包括那些)

4

2 回答 2

21

你有两个选择:

重写历史(破坏性)

你可以git-rebase用来重写历史,省略这些提交。您可以运行交互式变基。根据您的描述,我不确定您在masterand中到底有什么working,但我假设所有历史(想要的和不想要的)都在那里。

  git checkout master
  git rebase -i a0c1de2

此时,您$EDITOR将弹出一个提交列表,其中包含a0c1de2master. 您可以删除对应的行c460070..a3cb10e以将其从历史记录中删除。

您的历史将在本地重写。如果您尝试推送此更改,这将是一个非快进更新。

还原、保存历史(非破坏性)

如果您希望保留历史记录,则可以还原一系列提交:

git checkout master
git revert c460070..a3cb10e

这将创建 7 个新提交,每个提交按顺序还原这些不需要的提交中的更改。

于 2012-12-08T06:30:57.123 回答
1

关于历史图形的某些东西很古怪。通过其中的文本标记,您想要的只是

$ git branch -f master working

因为在 master 上没有任何working你想保留的 post-base 提交。

于 2012-12-08T16:34:47.413 回答