我已经分叉某人的项目并做了一些提交。我填写了一个pull请求,但它没有被接受(要么改变不可取,要么作者重写了与“他的风格”一致的功能)。现在我坚持使用我的本地fork有一些额外的提交,永远不会进入上游。我可以退出更改集,但之后我有两倍的额外提交,并且必须永远推送它们。这太丑了!
放弃这些没有人想要的提交并让我的分支回到上游跟踪的最佳方法是什么?我知道我可以完全删除它并重新分叉,但这真的很笨重,而且我将失去我正在做的任何其他工作。
答案 0 :(得分:22)
您可以将您的回购状态重置为先前的提交。首先找出要将回购重置为哪个提交:
git log
将您的回购重置为该状态:
git reset --hard <commit_hash>
如果你有一个分叉的远程仓库,你可以将这些变化推回去:
git push -f <remote> <branch>
您可能希望更改工作流程,以便将来更轻松。
当我分叉回购并对其进行自己的更改时,我首先设置了两个遥控器。一个遥控器将指向我的分叉仓库(例如:origin
),并将另一个远程点添加到分叉的原始仓库(例如:original_repo
)。所以我可能有类似的东西:
$ git remote
origin
original_repo
我创建了一个分支来完成我的所有工作,例如:feature
。在发出拉取请求时,我会从feature
分支到original_repo
master
分支执行此操作。如果拉取请求被拒绝,就像您的示例一样,您可以放弃此分支。如果您想进行更多修改,只需从master
创建另一个分支并使用它来工作。
我也不会将任何本地更改提交或合并到master
分支。我只使用master
分支与original_repo
master
分支同步。例如:
git checkout master
git fetch original_repo
git merge original_repo/master
这可确保master
分支始终与原始repo的master
分支同步。例如,如果拉取请求被接受并合并,则当获取和合并发生时,本地master
也将拥有原始仓库中使用的所有“已批准”代码。
基本上使用master
与原始回购的master
同步,并且当您想要进行编辑时始终从主分支。使用这些分支来处理对原始仓库的拉取请求。
答案 1 :(得分:2)
返回你的主分支几步(假设你想跳过三次提交)并用-f推送重写你的github仓库。
git reset --hard HEAD~3
git push -f origin master