最近,我通过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)
到目前为止,下面是我已经运行到此阶段的命令
git rebase -i HEAD^^
。 pick <message of B4>
和pick <message of B3>
行。git rebase
。---编辑
最好的问候, Tidus
答案 0 :(得分:0)
我假设您想保留提交B4
,但删除B2
和B3
。我还假设您想将M6
保留在master
上。一种方法是首先编辑branch
。首先将branch
返回到B4
:
git checkout branch
git reset --hard B4
(请注意,在我回答的所有命令中,都应使用实际的SHA1哈希替换提交引用,例如B4
。)
接下来删除B2
和B3
git rebase -i M1
此命令将打开一个带有文件的文本编辑器,您可以在其中编辑每次提交的命令。对于B2
和B3
,用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 reset
,git rebase
和git cherry-pick
之类的工具来获得我想要的结果比用一个命令来完成所有任务要容易得多。
请注意,如果您在任何时候犯了错误,则可以使用git reflog
查看最新命令的历史记录。这还会显示您最近检出的SHA1哈希值,以便您可以轻松地重新获得它们。