如何重新编写已在另一个分支中合并的提交

时间:2014-03-28 14:36:24

标签: git

我有这种情况

master    A--B--C
                 \
fix-15            D
                   \
other1        ...--(merged)--E

我在D工作时遗漏了一些东西,我需要在同一次提交时修复它,因为我已经发送了一个github pull请求,项目所有者想要每次拉取请求一次提交。如果D未合并other1,我可以再次resetcommit,然后push -f我的更改。但由于other1git reset并非取消提交 D

1 个答案:

答案 0 :(得分:2)

如果您想更改提交D,您必须进行替换提交E,并且可能需要新的提取请求。如果项目所有者需要一次提交拉取请求,您可以修改提交D,这将要求您将 other1 品牌替换为全新的品牌,这可能会给已经拉过它的人带来问题,如果他们是任何人。

首先,让我在你的图表上标记一些提交:

master    A--B--C
                 \
fix-15            D
                   \
other1         X -- Y (merge) -- E

那么,你可以做什么:

git branch other1_copy other1 # make a copy
git checkout other1
git reset --hard X # get to the state before merge
git checkout fix-15
# do your changes
git commit --amend # make commit D'
git checkout other1
git merge fix-15 # make a replacement merge commit Y'
git checkout other1_copy
git rebase --onto other1 Y # rebase your changes in 'other1' onto Y'
git checkout other1
git merge other1_copy # now you have 'other1' as E'
git branch -d other1_copy # delete the temporary branch

这就是最后的样子

master    A--B--C
                 \
fix-15            D'
                   \
other1         X -- Y' (merge) -- E'

尽管这样做符合您的要求,但它有点复杂,很有可能它们可以解决您的问题,而不会像这样弄乱您的分支机构。其中一个是向 fix-15 添加另一个提交,并通过正常合并将其合并到 other1

master    A--B--C
                 \
fix-15            D ------ F
                   \        \
other1         X -- Y -- E -- G

然后,如果你有一个分支跟踪你的上游,你可以创建一个提交拉取请求,如下所示:

git fetch upstream # let's call your upstream remote `upstream`
git checkout -b pull-branch upstream/master
    # ^ you'll be using this to create a pull request
git merge --squash other1 && git commit
    # ^ creates a squashed commit will all the changes from `other1`
# now create a pull request from this branch