11

好吧,我做了一些愚蠢的事情。

  • 我分叉了一个我应该贡献的回购。
  • 所以我随后创建了一个名为“blafile”的文件来检查我可以提交(显然我不明白什么是 fork)并提交了一条消息“检查我可以提交”。
  • 我推到我的 github forked repo 并忘记了它。
  • 第二天我开始修复一个错误。
  • 我提交了我的修复并推送到我的分叉仓库,并带有消息“fixed bug xyz”。

现在我想发出一个拉取请求,突然间我看到了我的“检查我可以提交”提交。我不希望它出现在拉取请求中。:)

我可以完全删除该提交吗?我可以在单个提交上发出拉取请求,还是会拉取我所有的提交?

我知道我可以在本地git reset --hard HEAD~1(这是一个我可以快速重做的小修复),但这只能修复我的本地仓库,而不是我的 github(分叉)仓库。

4

2 回答 2

12

很多选择。

最好的选择可能是创建一个新分支并在该分支中挑选你的修复:

git checkout -b my-fix-branch origin/master
git cherry-pick master
git push -u origin my-fix-branch

my-fix-branch然后在 GitHub 上做一个拉取请求。(这假设您的工作分支名为master,基于远程master;根据需要更改分支名称)。


如果没有人拉出或克隆你的分叉,你可以强行重写历史。执行git rebase -i HEAD~2并删除有问题的提交,然后git push --force. 这将破坏基于您的 fork 的任何其他 repo,因此如果您怀疑其他人正在使用您的 repo,请要这样做。

于 2013-03-26T22:22:00.033 回答
3

我相信以下命令序列应该可以工作,假设您的无效提交只是当前 HEAD 之前的一次提交,并且分支名称是master.

注意:以下命令将重写历史记录,如果有人已经克隆了您的存储库,则不建议这样做。如果不是这样,那push -f应该没什么大不了的。

# Switch the current working tree to master branch
git checkout master
# Soft reset to get all the changes since HEAD~2 into the index/staging area
git reset --soft HEAD~2
# Remove the blafile from the staging area
git rm --cached blafile
# Commit the changes you actually intended to make
git commit
# Update the refs on the remote forcefully to push the newer commit.
# Note that if any one else has pulled master already with your blafile
# commit, they would be really pissed off with you now.
git push -f origin master
于 2013-03-26T22:21:49.477 回答