我知道这是重写历史,这是糟糕的亚达亚达。
但是如何从远程分支中永久删除一些提交?
答案 0 :(得分:279)
您'git reset
'您当地的分支机构,并且git push --force
您修改后的本地分支到遥控器。 (other solution here,涉及删除远程分支,并重新推送它)
这个SO answer说明了这种命令的危险性,特别是如果人们依赖于他们自己的本地回购的远程历史。
您需要准备好将人们指向RECOVERING FROM UPSTREAM REBASE手册页的git rebase
部分
答案 1 :(得分:135)
请注意在还原非工作提交时使用last_working_commit_id
git reset --hard <last_working_commit_id>
因此,我们不能重置为我们不想要的commit_id
。
然后确定,我们必须推送到远程分支:
git push --force
答案 2 :(得分:131)
this tutorial中显示了三个选项。如果链接断开,我将在此处留下主要步骤。
1还原完整提交
git revert dd61ab23
2删除最后一次提交
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
或者,如果分支在本地可用
git reset HEAD^ --hard
git push <<remote>> -f
其中+ dd61 ...是你的提交哈希,git将x ^解释为x的父级,而+作为强制非快速推送的推送。
3从列表中删除提交
git rebase -i dd61ab23^
这将打开,编辑器显示所有提交的列表。删除你要删除的那个。完成rebase并推动力量回购。
git rebase --continue
git push <remote_repo> <remote_branch> -f
答案 3 :(得分:11)
例如,如果您要删除最后一个 3
提交,请运行以下命令从文件系统(工作树)中删除更改并在您的计算机上提交历史记录(索引)本地分支机构:
git reset --hard HEAD~3
然后(在本地计算机上)运行以下命令以强制远程分支重写其历史记录:
git push --force
恭喜!全部完成!
一些注意事项:
您可以通过运行
检索所需的提交ID。git log
然后您可以像这样将HEAD~N
替换为<desired-commit-id>
:
git reset --hard <desired-commit-id>
如果要保留文件系统上的更改并仅修改索引(提交历史记录),请使用--soft
标志,例如git reset --soft HEAD~3
。然后,您将有机会检查您的最新更改并保留或删除全部或部分更改。在后一种情况下,runnig git status
显示自<desired-commit-id>
起更改的文件。如果使用--hard
选项,git status
会告诉您本地分支与远程分支完全相同。如果您既不使用--hard
也不使用--soft
,则使用默认模式--mixed
。在此模式下,git help reset
说:
重置索引,但不重置工作树(即,更改后的文件为 保留但未标记为提交),并报告未记录的内容 已更新。
答案 4 :(得分:9)
这可能太晚了,但是对我有帮助的是“核”选项。基本上使用命令filter-branch
,您可以在整个git历史记录中删除文件或更改大量文件。
最好解释here。
答案 5 :(得分:7)
从pctroll的答案中简化,同样基于此blog post。
{{1}}
答案 6 :(得分:3)
有时解决此问题的最简单方法是从您知道代码良好的地方创建一个新分支。然后你可以单独留下错误的分支历史记录,以防你以后需要从中挑选其他提交。这也确保您不会丢失任何提交历史记录。
来自您当地的错误分支:
git log
复制您希望分支所在的提交哈希并退出git log
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
现在您可以按照自己的方式拥有一个新分支。
如果您还需要保留不在新分支上的错误分支的特定提交,您可以选择您需要的特定提交:
git checkout the_errant_branch
git log
复制您需要提交到好分支的一个提交的提交哈希并退出git日志。
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
拍拍你自己。
答案 7 :(得分:0)
git reset --soft commit_id
git stash save "message"
git reset --hard commit_id
git stash apply stash stash@{0}
git push --force
答案 8 :(得分:0)
TL:DR;
git switch -C branch_name origin/branch_name~n
git push --force
完成,远程分支将被 n
次提交还原。
说明:
使用 git switch
,将分支重置为 n 次提交。
branch_name
替换为您的分支名称,n
(在命令的末尾)替换为您要还原的提交数。命令 #1: git switch -C branch_name origin/branch_name~n
示例:git switch -C feature/dashboard origin/feature/dashboard~1
// 此命令在 dashboard 分支中恢复 1 提交。
强制推送本地更改
命令 2: git push --force