github fork:你的分支提前 5 次提交如何在不推送的情况下清理它

github fork : your branch is 5 commits ahead how to clean this without pushing

我在 github 上分叉了一个项目,以便发送拉取请求。问题是我的做法很……脏

我在分支的本地副本上工作,为我的修改创建了一个分支并将其合并到主分支上。然后我将 master 推送到 github fork 以创建拉取请求。

问题是最近我的拉取请求被拒绝了。所以现在我比原来的主人提前 5 次提交。为了与原始存储库保持一致,有什么解决方案?

我是否必须在新分支中检出上游 master 并用它创建新的 master(怎么做?)

还是删除我的 github 分支(我之前接受了提交)并重新创建它(您可以在此处查看 github 回购协议)https://github.com/cedlemo/ruby-gnome2

首先,你应该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 将在更新的 upstream/master 上重置 master HEAD,以便 master 反映与原始 repo 中完全相同的历史记录。

但是由于一些提交之前在 master 上完成并推送到分叉上 (origin/master),您需要用新的 master 状态替换该历史记录。因此 git push --force.

Rebase mybranch 允许那些当前补丁基于原始 repo 的最新提交。

我使用这个小 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' 分支,删除您所在的分支,然后再次检查它。签出您在本地没有的分支会在原始分支的位置创建一个同名的新本地分支。