我很难掌握如何使用rebase / revert来实现这一目标。
我正在我的master
分支上工作,经过一定的提交,我的软件停止了工作。我不想放弃当时所做的更改,我被迫按时达到里程碑,所以我回到了git checkout
的一些提交,并创建了一个名为working
的新分支并开始推送所有我在那里的变化。后来我意识到不需要这些更改(在master
分支上进行)。现在我想回到我的主分支并在我用于创建working
分支的提交之后删除所有提交,然后将我的working
分支合并到master
分支。
我用在线照片编辑器创建了一个图像,试图解释我正在尝试做什么。我希望它有所帮助:
我希望在5cb967f之后保留所有内容。摆脱5cb967f和a0c1de2之间的一切(不包括那些)
答案 0 :(得分:16)
您有两种选择:
重写历史(破坏性)
您可以使用git-rebase
重写历史记录,省略这些提交。您可以运行交互式rebase。根据您的描述,我不确定您在master
和working
中的具体内容,但我假设所有历史记录(通缉和不需要的)都存在于那里。
git checkout master
git rebase -i a0c1de2
此时,您的$EDITOR
会弹出一个从a0c1de2
到master
的HEAD的提交列表。您可以删除与c460070..a3cb10e
对应的行,将其从历史记录中删除。
您的历史记录将在本地重写。如果您尝试推送此更改,则将是非快进更新。
还原,保留历史(非破坏性)
如果您希望保留历史记录,则可以恢复一系列提交:
git checkout master
git revert c460070..a3cb10e
这将创建7个新提交,每个提交按顺序还原这些不需要的提交中的更改。
答案 1 :(得分:0)
关于历史图形的一些东西很棘手。通过文本标记,你想要的只是
$ git branch -f master working
因为没有任何关于你想要保留的主人的working
- 基础提交。