如何从Github上的关闭拉取请求中删除/替换提交

时间:2018-02-24 19:03:45

标签: git github

我在这里看到了类似的话题,但从那里的答案来看,他们都在处理公开的PR。我的情况有点不同。

我试图向Github做出我的第一个贡献,我检查了一些教程,分叉,克隆,提交,推送和创建PR。 然后我意识到我提交了我的主要电子邮件,我不想公开。所以我更新了git config,运行git commit --amend --author="new name <new@e.mail>"然后强制推送到远程仓库(fork)。 但在那次推动之前我关闭了PR(猜测这是一个错误)。 现在,当我去那个PR我可以看到(通过提交哈希)它仍然引用旧提交,并且出于某种原因(Github策略)我不能重新打开PR,因为分支被强制推送。 / p>

有解决方法吗?

编辑:我可以通过克隆原始项目并将fetch = +refs/pull/*/head:refs/remotes/origin/pr/*添加到.git/gitconfig来从原始项目中获取我的PR。 但当然,我无法推动它: git push origin pr/<pr_id> 给出错误: remote: Permission to original/project.git denied to <username>. fatal: unable to access 'https://github.com/original/project.git/': The requested URL returned error: 403

2 个答案:

答案 0 :(得分:0)

PR只是一个分支的包装器 - 所以当你制作PR时,有一个与之关联的分支。如果修改分支,则PR也将被修改。

假设您可以执行分支new_pr

# Checkout the branch
git checkout new_pr

# Make sure your default email address is correct
git config --global user.email you@example.com

# Change any commits to remove email, i.e.:
git commit --amend --reset-author
# (or if it's wrong for several commits, use 'rebase')

# force push this branch over the 'wrong' one on github
git push origin new_pr --force

现在github分支中将包含正确的电子邮件地址,PR(如果无法访问)将“自动更新”以指向更新分支的内容。

答案 1 :(得分:0)

好的,我找到了解决方案。 :) 首先,简要总结一下问题: 1)PR已关闭,这就是为什么它没有从fork repo自动更新的原因; 2)PR无法重新打开,因为fork repo已被强制推送。

现在,要解决问题:

  1. 克隆固定的叉子回购。
  2. 删除修复提交。对我来说很简单:git reset --hard HEAD~1。现在分支处于原始状态 - PR没有变化。
  3. 从原始仓库获取PR分支到本地fork仓库。我已经在本地获取了所有PR的repo,因此我添加了本地远程:git remote add localorigin ..\<original_repo>\然后git checkout --track localorigin/pr/<id>。检查这是否是正确的PR。
  4. 结帐工作分支并合并'旧'PR git merge pr/<id>。现在本地fork repo中有错误的提交。
  5. 强制推叉。
  6. 重新打开PR(现在PR可以重新打开,因为'原始PR分支'已经在fork repo中恢复。
  7. 转到fork repo并应用修复程序。对我来说是git commit --amend --author="new_name <new@e.mail>"
  8. 再次强行推叉。现在修复出现在远程fork repo中,因为PR已打开,更改会自动复制到原始repo的PR分支。