假设我在git中有以下提交
A---B---C---D---E---F
还假设提交B
和D
为空(不包含文件,即空快照)。
所以,我想摆脱B
和D
;我正在做以下事情:
git filter-branch --prune-empty
我最终得到以下结论:
A---B---C---D---E---F
\
\--C'---E'---F'
然而,这不是我想要的,我想最终得到
A---C'---E'---F'
我该怎么做?
注意:我也试过了:
git rebase -i HEAD~6
但仍然无效。
事实证明我做得对。来自 mu无的aswer激发了我更多关于为什么它为他工作而不是为我工作的调查。我的原始分支从未被删除。经过进一步调查后,我发现C
广告F
中的标签导致分支停留。因此,在运行filter-branch
命令之前,我删除了两个标记并且它有效。
答案 0 :(得分:1)
你实际上已经以正确的提交结束了,现在只做git checkout F'
。
如果您将这些更改推送到远程存储库,则需要使用git push -f origin branch_F':branch_F
强制更新该分支。
示例示例:
创建新的仓库
$ git init
$ touch a && git add a && git commit -m "added a"
$ git commit --allow-empty -m "empty 1"
$ touch b && git add b && git commit -m "added b"
$ git commit --allow-empty -m "empty 2"
$ touch c && git add c && git commit -m "added c"
检查提交历史记录
$ git log --oneline
27196e9 (HEAD, master) added c
24e10de empty 2
a2d3931 added b
88be904 empty 1
564d4e4 added a
运行filter-branch
$ git filter-branch --prune-empty
Rewrite 27196e9bc27e93ff54ebd10a5c8435e7fe496c78 (5/5)
Ref 'refs/heads/master' was rewritten
再次检查日志提交
$ git log --oneline
221f0d0 (HEAD, master) added c
ab6bf5f added b
564d4e4 added a
<强> 修改 强>
正如OP在他的comment中提到的那样,这种情况正在发生,因为中间提交中存在标签。删除标签使这项工作成功。
答案 1 :(得分:0)
有几种方法可以在git中完成它,但首先你必须确保没有人已经拉过分支。如果有人确实拉了你不能而且不应该更改树的历史记录。
如果某人已将其拉出,您只需重新添加“旧”内容并覆盖当前数据。
如果没有人在这里拉过你的一些选择:
键入 git reflog
并在更改前检查上次提交的最佳提交,您将获得一个分离的头,因此创建一个新分支,删除远程分支并再次推送它。
使用 git revert
git format-patch** <number of commit to choose>
然后按照项目符号#1中的说明签出分支并应用所需的提交(删除您要跳过的提交)还有更多选择,但这些选项最简单。