我有这种情况
master A--B--C
\
fix-15 D
\
other1 ...--(merged)--E
我在D
工作时遗漏了一些东西,我需要在同一次提交时修复它,因为我已经发送了一个github pull请求,项目所有者想要每次拉取请求一次提交。如果D
未合并other1
,我可以再次reset
和commit
,然后push -f
我的更改。但由于other1
,git reset
并非取消提交 D
。
答案 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