如何将新的(重写的)历史推送到远程仓库?

51

基本上,我有一个开放的拉取请求需要修复,同时我想要创建1个提交包含2个功能并将其分为2个单独的提交。

Github存储库现在看起来像这样,其中fix是一个新分支:

master c-c-c
            \
     fix c-c-c-c

我从修复中创建了一个拉取请求。

我想要将修复中的最后一次提交更改为本地仓库中的2个提交,如下所示:

master c-c-c
            \
     fix c-c-c-n-n

n-n代表我的两个新提交。

为了在本地达到这个点,我做了以下操作:

1. git rebase -i HEAD~2
2. Changed my last commit line to "edit", saved and closed the file
3. git reset HEAD^
4. git stash save
5. Removed the changes I don't want in the first commit
6. git commit -m "commit a" -a
7. git stash apply
8. git commit -m "commit b"

现在我有了两个我想要的提交。问题是,我发现一个错误出现在拉取请求中。由于我已经推送到远程仓库,它不会接受我的新提交(因为原始提交现在已经丢失)。
我运行:
git push origin fix --dry-run

我收到了这条消息:

To git@github.com:<UserName>/<Repository>.git
! [rejected]        fix -> fix (non-fast-forward)
error: failed to push some refs to 'git@github.com:<UserName>/<Repository>.git'

我看到其他帖子建议在再次推送之前从源代码库中拉取我的更改,但这不会将我的两个提交重置为一个吗?

理想情况下,我希望将相同的提交ID分配给最后一个提交,以便它可以替换当前的提交。有什么办法可以做到这一点吗?(请注意,我没有使用--hard运行git reset

1个回答

90

当遇到这个问题时,强制推送对我有用:

git push --force origin fix

1
那个运行得非常好。如果有人阅读这篇文章并想知道我的拉取请求发生了什么,它只是用两个提交替换了一个提交。我在Github上添加了一条评论给项目所有者,让他知道在已经完成的情况下要获取。 - NightOwl888
那么,为了澄清:如果项目所有者已经合并了拉取请求,然后我执行 git push --force origin fix,那么项目所有者端的 git fetch 是否会拉取修复内容? - PonyEars
4
如果更改内容已经被拉取,项目所有者需要进行重置,因为提交将仍然存在于其分支中。请使用命令 git fetch origin 然后再使用命令 git reset --hard origin/master 进行重置。参考链接:https://dev59.com/U3I-5IYBdhLWcg3w48xP - NightOwl888
8
使用 --force-with-lease 代替 --force:只有在没有中间提交时才会强制推送。详情请见:https://developer.atlassian.com/blog/2015/04/force-with-lease/ - Benj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接