如何从分支中删除提交?

问题描述:

如何从我的分支历史记录中删除提交?我应该使用 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大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值