在某次提交后删除分支中的所有提交

时间:2012-12-07 23:16:27

标签: git bitbucket

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

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

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

screen shot of bitbucket

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

2 个答案:

答案 0 :(得分:16)

您有两种选择:

重写历史(破坏性)

您可以使用git-rebase重写历史记录,省略这些提交。您可以运行交互式rebase。根据您的描述,我不确定您在masterworking中的具体内容,但我假设所有历史记录(通缉和不需要的)都存在于那里。

  git checkout master
  git rebase -i a0c1de2

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

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

还原,保留历史(非破坏性)

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

git checkout master
git revert c460070..a3cb10e

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

答案 1 :(得分:0)

关于历史图形的一些东西很棘手。通过文本标记,你想要的只是

$ git branch -f master working

因为没有任何关于你想要保留的主人的working - 基础提交。