拉取请求后删除特定的远程提交

时间:2018-07-25 15:26:39

标签: git github

最近,我通过pull请求将一个分支合并到master,然后发现该分支的某些提交中的某些文件在远程不需要,因此我考虑仅在那些提交中删除那些文件。但这并不是那么容易,所以我决定只删除那些提交,因为我认为对该分支的拉取请求已被合并。

在摆弄git rebase HEAD^^等之后,我最终只移动了分支的头部,没有删除那些提交,因为我怀疑master仍然依赖整个分支,因此git无法满足我的要求。

有什么想法吗?或者,有什么更好的方法来解决我的问题?

---编辑后

下面是我的示例的ASCII图像。因此,为了进一步详细说明,现在将 branch 通过pull request合并到M5中,我当时正在考虑删除提交B2和B3中的某些文件,但是后来认为删除起来会更容易B2和B3并没有这样做。现在 branch 的HEAD是B2,现在不再是B4。

     B1 -- B2 -- B3 -- B4           (branch)
    /                    \
-- M1 -- M2 -- M3 -- M4 -- M5 -- M6 (master)

到目前为止,下面是我已经运行到此阶段的命令

  1. 分支的HEAD为B4时,我做了git rebase -i HEAD^^
  2. 我删除了pick <message of B4>pick <message of B3>行。
  3. 现在HEAD是B2。但是,B3和B4仍然在那里,好像没有运行git rebase

---编辑

最好的问候, Tidus

1 个答案:

答案 0 :(得分:0)

我假设您想保留提交B4,但删除B2B3。我还假设您想将M6保留在master上。一种方法是首先编辑branch。首先将branch返回到B4

git checkout branch
git reset --hard B4

(请注意,在我回答的所有命令中,都应使用实际的SHA1哈希替换提交引用,例如B4。)

接下来删除B2B3

git rebase -i M1

此命令将打开一个带有文件的文本编辑器,您可以在其中编辑每次提交的命令。对于B2B3,用s标记为“跳过”。

接下来创建一个临时分支以便跟踪M6并将master重置为合并之前的

git checkout master
git branch temp
git reset --hard M4

现在再次合并:

git merge branch

最后,让M6重新获得主人:

git cherry-pick M6

从技术上讲,temp分支不是必需的,因为您可以在重置master之前使用reflog查找M6的哈希,也可以不使用它。创建temp可以更轻松地跟踪您的工作。

也许还可以使用git filter-branch之类的方法来完成所需的工作,但是使用精确的命令则要复杂得多。就我个人而言,我发现结合使用git resetgit rebasegit cherry-pick之类的工具来获得我想要的结果比用一个命令来完成所有任务要容易得多。

请注意,如果您在任何时候犯了错误,则可以使用git reflog查看最新命令的历史记录。这还会显示您最近检出的SHA1哈希值,以便您可以轻松地重新获得它们。