我在github上分叉了一个项目,以便发送拉取请求。问题是我的做法非常......很脏。
我在fork的本地副本上工作,为我的修改创建了一个分支,并将其合并到主服务器上。然后我在github fork上推送master,以便创建一个pull请求。
问题是最近,我的拉取请求被拒绝了。所以现在我从原来的主人那里提前5次提交。为了与原始存储库保持一致,有哪些解决方案?
我是否应该检查新分支中的上游主服务器并使用它创建新的主服务器(如何执行此操作?)
或者更好的是删除我的github fork(我之前已经接受了提交)并重新创建它(你可以在这里看到github repos)https://github.com/cedlemo/ruby-gnome2
答案 0 :(得分:52)
首先,您应该always make your PR form a branch,而不是master
master
用于镜像upstream/master
,其中“upstream
”是您分叉的原始仓库的名称。
在您的情况下,请确保upstream
存在,建立分支以引用当前的修补程序,并将master
重置为upstream/master
:
在:
z--z (upstream/master, with new commits)
/
z--y--y--y (master with local patches, origin/master)
记住当前的工作:
git checkout master
git checkout -b mybranch
git remote add upstream /url/original/repo
git fetch upstream
# reset master to upstream/master
git checkout master
git reset --hard upstream/master
git push --force
y--y--y (mybranch)
/
z--z--z (master, upstream/master, origin/master)
# replay the patches (even they are rejected for now) on top of master
git checkout mybranch
git rebase master
git push -u origin mybranch
y'--y'--y' (mybranch, origin/mybranch)
/
z--z--z (master, upstream/master, origin/master)
此处:git reset --hard upstream/master
会在更新的master
上重置upstream/master
HEAD,以便主人反映与原始仓库中的历史记录完全相同的历史记录。
但是,由于某些提交先前在master
上执行并推送到fork(origin/master
),因此您需要将该历史记录替换为新的master
状态。因此git push --force
。
重新启动mybranch允许这些当前补丁基于原始仓库的最新提交。
答案 1 :(得分:0)
我使用这个小shell脚本将分支重置为其原点
function git_branch_reset_origin() {
branch_name="$(git symbolic-ref HEAD 2>/dev/null)"
branch_name=${branch_name##refs/heads/}
git checkout -b foo
git branch -D ${branch_name}
git checkout ${branch_name}
git branch -D foo
}
简单地将其移至新的“ foo”分支,删除您所在的分支,然后再次将其检出。签出您本地没有的分支会在原始分支的位置创建一个具有该名称的新本地分支。