问题描述:
如何从我的分支历史记录中删除提交?我应该使用 git reset --hard HEAD 吗?
解决方案1:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
小心: git reset --hard 将删除您的工作目录更改。在运行此命令之前,请务必存储您想要保留的任何本地更改。
假设你正坐在那个提交上,那么这个命令会搞砸它…
git reset --hard HEAD~1
HEAD~1 表示 head 之前的提交。
或者,您可以查看 git log 的输出,找到您要备份到的提交的提交 ID,然后执行以下操作:
git reset --hard
如果你已经推了它,你需要用力推才能摆脱它…
git push origin HEAD --force
但是,如果其他人可能已经取消了它,那么你最好开始一个新的分支。因为当他们拉动时,它只会将其合并到他们的工作中,而您会再次将其推回原处。
如果您已经推送,最好使用 git revert 创建一个“镜像”提交,以撤消更改。但是,两个提交都将在日志中。
仅供参考 - 如果您想摆脱 WORK IN PROGRESS,git reset --hard HEAD 非常棒。它会将您重置回最近的提交,并删除工作树和索引中的所有更改。
最后,如果您需要找到您“删除”的提交,它通常出现在 git reflog 中,除非您已对存储库进行垃圾收集。
HEAD~1 或只是 HEAD^。如果你推送,你应该使用 git revert 代替。
显然,您也可以使用 HEAD~n 从您的脑海中“返回”n 提交。也许从这一点您可以将 ... --hard HEAD 也解释为 HEAD~0 =>删除正在进行的工作。
@beamrider9 imho git rebase 几乎总是删除提交的更好方法(如 Greg Hewgill 的回答中所述)——尤其是因为 rebase 实际上包含一个大警告,即您将删除 4realz 的东西。
不过,这不会从提交树中删除更改。 OP 要求已经提交。如果您选择 reset --hard 并选中 log --oneline --all,则提交仍保留在树中。我们如何从树中删除这些提交?谢谢。
使用 reset --soft 删除本地提交而不恢复正在进行的工作!
解决方案2:
huntsbot.com – 高效赚钱,自由工作
如果您尚未将提交推送到任何地方,则可以使用 git rebase -i 删除该提交。首先,找出该提交有多远(大约)。然后做:
git rebase -i HEAD~N
~N 表示对最后的 N 次提交进行变基(N 必须是数字,例如 HEAD~10)。然后,您可以编辑 Git 呈现给您的文件以删除有问题的提交。保存该文件后,Git 将重写所有以下提交,就好像您删除的提交不存在一样。
Git Book 有一个很好的section on rebasing,其中包含图片和示例。
不过要小心这一点,因为如果您更改了已在其他地方推送的内容,则需要另一种方法,除非您打算进行强制推送。
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
注意:如果您在最后一批提交中碰巧有任何 --no-ff 合并,rebase 将屠杀它们 :( 这在 this page 的 -p 下提到。问题是,如果您将 -i 替换为 -p ,您不再会弹出“编辑此提交,压缩那个”等选项。有人知道解决方案吗?
如果你推了它怎么办? (只有我使用远程仓库)
@Costa,您可以使用 push -f 强制推送并将远程分支替换为本地分支。如果它只是你自己的远程仓库,没问题。如果其他人在此期间取来了,麻烦就开始了。
我添加并提交了一个对于 GitHub 来说太大的数据文件(是的,它可能不应该在源代码库中;哦,好吧)。当我尝试推送时,由于文件太大,GitHub 拒绝了。我想做的只是撤消这一次提交,同时保存随后的其他一些不相关的提交。 git rebase -i HEAD~5 命令正是从我的本地存储库中完全删除此提交所需要的!谢谢!
@dumbledad:使用 rebase -i,与已删除提交对应的更改不会保留。
解决方案3:
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
另一种可能性是我个人最喜欢的命令之一:
git rebase -i ~1
这将在您想要敲击的提交之前以交互模式 -i 启动 rebase。编辑器将开始列出从那时起的所有提交。删除包含要删除的提交的行并保存文件。 Rebase 将完成其余的工作,仅删除该提交,并将所有其他提交重放回日志中。
thx,顺便说一句,如果您遇到任何问题(例如空提交),您可以使用 git rebase --continue
更简单:git rebase -i HEAD~1
哇塞。 git rebase -i HEAD~1 真的清理了很多回购!很难确切地说它做了什么,但整个事情看起来更整洁。实际上,有点令人担忧。
我认为值得注意的是,提交并没有被删除,只是从列表中删除。如果您搞砸了,您可以使用 reflog 取回提交。
删除行和d/drop一样吗?
解决方案4:
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
我附上了这个答案,因为我不明白为什么任何刚刚尝试提交工作的人会因为使用 Git 的一些错误而想要删除所有这些工作!
如果您想保留您的工作并只是“撤消”该提交命令(您在推送到 repo 之前捕获):
git reset --soft HEAD~1
不要使用 --hard 标志,除非您想破坏自上次提交以来正在进行的工作。
下面是一个示例:您在提交的开发服务器上做了一小部分工作。然后事实证明,该服务器没有传出 HTTPS 访问权限,因此您无法将提交推送到任何地方。最简单的方法就是假装它从未发生过,然后从本地机器上重做补丁。
@KarthikBose 总会有 reflog。即使在 git reset --hard HEAD~1 之后,您之前的最新提交也可以通过 reflog 获得(直到您过期);另见此处:gitready.com/intermediate/2009/02/09/…
谢谢。这个答案应该排名更高或包含在接受的答案中。删除提交!= 恢复提交。
@RandolphCarter:尽管如此,您仍然会丢失任何未提交的更改。
@Rob,一个例子是当你不小心提交了一个文件,其中包含一个永远不应该在源代码控制中的秘密(例如密码)。本地提交必须被销毁,而不仅仅是撤消,因此它永远不会被推送到服务器。
解决方案5:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
删除整个提交
git rebase -p --onto SHA^ SHA
显然将“SHA”替换为您想要摆脱的参考。该命令中的“^”是文字。
http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep
-p, --preserve-merges 重新创建合并提交,而不是通过重放合并提交引入的提交来展平历史记录。不保留合并冲突解决方案或对合并提交的手动修改。
它说,“将 SHA 替换为您想要摆脱的参考”,但该行中有两次 SHA。这就是我所做的。 git rebase -p --onto 5ca8832c120^ 5ca8832c120 但没有任何改变。我应该使用相同的 SHA 两次吗?如果不是,那么哪个是要删除的提交的 SHA,另一个 SHA 应该是什么?
具体来说,此方法删除了整个提交,包括文件(在我的情况下不需要)
@Rubicksman ^ 必须在 Windows(cmd 窗口)上转义 (^^) - stackoverflow.com/questions/1955985/…
-p [DEPRECATED: use --rebase-merges instead]
解决方案6:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
假设我们要从 repo 中删除提交 2 和 4。 (提交的数字越大;0 是最旧的提交,4 是最新的提交)
commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 :
commit 3 : 77b9b82
commit 4 :
注意:您需要对存储库拥有管理员权限,因为您使用的是 --hard 和 -f。
git checkout b3d92c5 签出最后一个可用的提交。
git checkout -b repair 创建一个新的分支来处理。
git cherry-pick 77b9b82 运行提交 3。
git cherry-pick 2c6a45b 运行提交 1。
git checkout master 结帐大师。
git reset --hard b3d92c5 将 master 重置为最后一次可用的提交。
git merge repair 将我们的新分支合并到 master 上。
git push -f origin master 将 master 推送到远程仓库。
最后一步应该是 git push -f origin master 没有选项 --hard
我猜 commit 0 早于 commit 1。请您告诉我为什么先运行 commit 3(通过樱桃挑选)然后运行 commit 1?结帐 b3d92cd (commit 0) 后,我希望挑选樱桃 commit 1,然后是 commit 3。谢谢。
@JarekC 我认为最重要的提交是这里的最新提交,除非我发现有问题...
这大部分是对的,但有点错误。我只是按照这个过程进行了一些调整。澄清:commit 0 是最新的提交,commit 4 是最旧的。首先检查 commit 5,就在您不想要的提交之前。然后是 cherry-pick commit 3,然后是 cherry-pick commit 1,然后是 commit 0。然后 checkout master 并将其重置为 commit 5 并按照其余步骤操作。
良好的彻底和安全的方法。在单独的分支上管理更改意味着您甚至可以在 repair 分支上进行交互式变基,并在合并回 master 之前合并提交。我唯一的评论是您可以合并前两个步骤:git checkout -b repair b3d92c5
解决方案7:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
如果您没有发布更改,要删除最新提交,您可以这样做
$ git reset --hard HEAD^
(请注意,这也会删除所有未提交的更改;小心使用)。
如果您已经发布了待删除的提交,请使用 git revert
$ git revert HEAD
那没有用。当我 git log 时,一切都还在那里,不管我为什么这样做只是增加了更多的提交。我要清理历史。
@Costa:什么不起作用(即您使用的是哪个版本),以及您是如何 git log 的?
我已经尝试了这个问答中的几乎所有内容。 (我最近尝试了 git revert HEAD)我的 git 日志:tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
@Costa:请注意,对于第一个版本(使用 git reset --hard HEAD^),您只能从当前分支“删除”提交(实际上是移动分支指针),如果有其他分支,则该提交仍然存在。使用 git reset “删除”提交只是将分支指针移回,使提交 dangling 并可用于修剪...如果其他 ref(其他分支、远程跟踪分支或标记)未引用。还是您使用了 git revert HEAD?
我只想删除提交(就像它们从未存在过一样)。我开始了一些奇怪的编码冒险,有几个新的提交,最后都变成了垃圾。我怎样才能从我的 git 日志中删除那些?
解决方案8:
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
git rebase -i HEAD~2
这里的 ‘2’ 是你想要变基的提交数。
'git rebase -i HEAD`
如果你想重新设置所有提交。
然后,您将能够选择这些选项之一。
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit
这些行可以重新排序;它们是从上到下执行的。如果您在此处删除一行,则 COMMIT 将丢失。但是,如果您删除所有内容,rebase 将被中止。请注意,空提交被注释掉
您可以使用选项“d”或删除包含您的提交的行来简单地删除该提交。
在最新的 git 版本中,没有更多选项 d。您只需从 rebase 中删除带有提交的行即可删除它们。
解决方案9:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
git reset --hard commitId
git push --force
PS: CommitId 是指您要恢复的那个
git push --force 。因为没有提及分支名称,它可能会更改远程上的所有文件。
解决方案10:
huntsbot.com – 高效赚钱,自由工作
强制更改历史记录
假设您不仅要删除最后一次提交,而且要删除最后 n 次提交的特定提交,请使用:
git rebase -i HEAD~,如果您想查看最后五次提交,则为 git rebase -i HEAD~5。
然后在文本编辑器中将您要删除的每个提交旁边的单词 pick 更改为 drop。保存并退出编辑器。瞧!
附加更改历史
试试 git revert 。 Revert 将创建一个撤消指定提交的 new 提交。
drop 关键字未定义。要删除提交,只需删除整行。
对我来说 drop 被定义为一个关键字,但是做一个 drop 似乎并没有从历史中删除提交。但是,从交互式变基中删除了该行。
我按照几个地方的建议删除了该行:它没有做任何事情。用 drop 替换单词 pick 确实删除了提交。注意:说明在文本编辑器内容底部的注释部分中。使用 git version 2.24.3 (Apple Git-128)
解决方案11:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
[快速回答]
您有很多选择,例如:
备选方案 1: git rebase -i ~1 将 YourCommitId 更改为要恢复到的提交的编号。
备选方案 2: git reset --hard YourCommitId git push --force 将 YourCommitId 更改为您要恢复到的提交的编号。我不推荐此选项,因为您可能会丢失正在进行的工作。
备选方案 3: git reset --soft HEAD~1 您可以保留您的工作,只撤消提交。
git reset --soft HEAD~1 非常适合我。确保我不会因该提交而丢失更改。感谢您的明确答复。
原文链接:https://www.huntsbot.com/qa/oD7w/how-do-i-delete-a-commit-from-a-branch?lang=zh_CN
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。