我该如何从我的分支历史记录中删除一个提交?我应该使用 git reset --hard HEAD
吗?
我该如何从我的分支历史记录中删除一个提交?我应该使用 git reset --hard HEAD
吗?
注意:git reset --hard
将删除您的工作目录更改。在运行此命令之前,请务必存储任何要保留的本地更改。
假设您正在该提交上,那么此命令将清除它...
git reset --hard HEAD~1
HEAD~1
表示 head 前一次提交。
或者,您可以查看 git log
的输出,找到要备份的提交的提交 ID,然后执行以下操作:
git reset --hard <sha1-commit-id>
git push origin HEAD --force
然而,如果其他人可能已经拉取了它,那么最好新建一个分支。因为当他们拉取时,它将合并到他们的工作中,然后你会再次推送。
如果你已经推送了,使用git revert
可能更好,创建一个“镜像”提交来撤销更改。但是,两个提交都将在日志中。
提示: 如果您想要摆脱"正在进行中",git reset --hard HEAD
非常好用。它可以将您重置回最近的提交,擦除您工作树和索引中的所有更改。
git reflog
中找到,除非你已经进行了垃圾回收操作。HEAD~1
或者 HEAD^
进行回滚操作是不推荐的,如果你已经提交了代码,应该使用 git revert
命令进行撤销。 - Jakub NarębskiHEAD~n
来“回退”到从头部开始的第n个提交。也许从这个角度来看,你可以把... --hard HEAD
理解为HEAD~0
=>删除正在进行中的工作。 - nualareset --hard
,并检查 log --oneline --all
,这些提交仍然会留在树中。那么我们该如何从树中删除这些提交呢?谢谢。 - Igbanamreset --soft
命令可以删除本地提交,而不会撤销正在进行中的工作! - user972946git rebase -i
来删除该提交。首先,确定该提交大致位于什么位置,然后执行以下步骤:git rebase -i HEAD~N
~N
的意思是将最近的N
次提交合并(N
必须为数字,例如HEAD~10
)。然后,您可以编辑Git呈现给您的文件以删除有问题的提交。在保存该文件后,Git将重写所有后续提交,就好像您删除的提交不存在一样。push -f
命令来强制推送并将远程分支替换为本地分支。如果只是你自己的远程仓库,那就没有问题。但如果在此期间有其他人拉取了代码,那么可能会出现问题。请注意。 - Greg Hewgillgit rebase -i HEAD~5
命令完全符合我的需求,它在本地仓库中完全删除了这个提交!谢谢! - aldorebase -i
命令时,与被删除的提交相关的更改不会被保留。 - Greg Hewgill另一个可能性是我个人最喜欢的命令之一:
git rebase -i <commit>~1
这将在交互模式下从您想要删除的提交点之前开始rebase,-i
。编辑器将启动列出此后所有的提交记录。删除包含您想要消除的提交的行并保存文件。Rebase会执行其余的工作,仅删除该提交,并将其他所有提交重新播放回日志中。
git rebase --continue
。 - realgtgit rebase -i HEAD~1
(该命令用于交互式地合并最近的一次提交到当前分支,HEAD~1代表上一个提交) - mmellgit rebase -i HEAD~1
真的让代码仓库整洁了许多!虽然不太清楚具体做了什么,但整个仓库看起来干净多了。有点让人吃惊。 - Charles Wood我追加这个答案,因为我不明白为什么任何尝试提交工作的人都想因为Git的某些错误而删除所有的工作!
如果你想保留你的工作,只需“撤消”那个提交命令(在推送到存储库之前捕获):
git reset --soft HEAD~1
不要使用 --hard 标记,除非你想摧毁上次提交以来的工作进程。
git reset --hard HEAD~1
之后,您仍然可以通过reflog找到以前的最新提交(直到过期为止)。请参见此处:http://gitready.com/intermediate/2009/02/09/reflog-your-safety-net.html。 - codeling移除一个完整的提交记录
git rebase -p --onto SHA^ SHA
显然,用要删除的参考替换“SHA”。该命令中的“^”是字面意义。
http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep
-p, --preserve-merges
重新创建合并提交,而不是通过重播提交来扁平化历史记录。合并冲突的解决或手动修改合并提交将不会被保留。 - raittes-p
[DEPRECATED: use --rebase-merges instead]
- syedelec假设我们想从仓库中删除提交2和4。(数字越高表示提交时间越新;0是最旧的提交,4是最新的提交)
commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>
注意:您需要拥有该存储库的管理员权限,因为您正在使用--hard
和-f
。
git checkout b3d92c5
切换到上一个可用提交。git checkout -b repair
创建一个新分支进行工作。git cherry-pick 77b9b82
运行第三次提交。git cherry-pick 2c6a45b
运行第一次提交。git checkout master
切换到主分支。git reset --hard b3d92c5
将主分支重置为上一个可用提交。git merge repair
将我们的新分支合并到主分支。git push -f origin master
推送主分支到远程存储库。git push -f origin master
,没有选项 --hard
。 - vivexcommit 0
比commit 1
旧。您能告诉我为什么首先要通过cherry-pick
运行commit 3
,然后再运行commit 1
吗?在检出b3d92cd
(commit 0
)之后,我希望首先进行commit 1
的cherry-pick
,然后是commit 3
。谢谢。 - Jarek Ccommit 0
是最新的提交,commit 4
是最早的。从检出不想要的提交之前的 commit 5
开始。然后 cherry-pick
commit 3
,再 cherry-pick
commit 1
,接着按照同样的方式处理 commit 0
。然后,检出 master 并将其重置为 commit 5
并按照剩余步骤进行操作。 - Joshua Swaingit rebase -i HEAD~2
这里的'2'是您想要变基的提交数。
'git rebase -i HEAD`
如果您想使所有提交基于新的基底。
那么您就可以选择以下其中一个选项:
p, pick = 使用此次提交
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
这些行可以重新排序;它们从上到下执行。如果你在这里删除一行,那个提交将会丢失。然而,如果你删除所有东西,rebase 将会中止。请注意,空提交已被注释掉。
您可以使用选项 "d" 或删除包含您提交的行来简单地删除该提交。
#[快速回答]
你有很多选择,例如:
选择1:
git rebase -i <YourCommitId>~1
将YourCommitId替换为您想要恢复到的提交编号。
备选方案2:
git reset --hard YourCommitId
git push <origin> <branch> --force
将YourCommitId更改为您要还原到的提交编号。
我不建议使用此选项,因为您可能会丢失正在进行中的工作。
备选方案3:
git reset --soft HEAD~1
您可以保留您的工作,仅撤消提交。
git reset --soft HEAD~1
对我来说完美地解决了问题。确保我不会丢失该提交所做的更改。感谢您清晰的回答。 - Wilan强制修改历史记录
如果你不仅仅想删除最后一次提交,而是要删除最近n次提交中的特定提交,请使用命令:git rebase -i HEAD~<向后回退几个提交>
,例如,如果你想查看最近的5次提交,则使用git rebase -i HEAD~5
。
然后在文本编辑器中把每个要删除的提交旁边的单词pick
更改为drop
。保存并退出编辑器。大功告成!
逐步修改历史记录
尝试使用命令git revert <commit hash>
。 Revert将创建一个新的提交,以撤消指定的提交。
drop
关键字未定义。要删除提交,请删除整行。 - Shayan Salehian如果您没有发布更改,要删除最新的提交,可以执行以下操作
$ git reset --hard HEAD^
请注意,这也会删除所有未提交的更改;请慎重使用。
如果您已经发布待删除的提交,请使用git revert。
$ git revert HEAD
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 Michailidisgit reset --hard HEAD^
)只会从当前分支中“删除”提交(实际上是移动分支指针),如果该提交还在其他分支上,则仍将存在。使用git reset
“删除”提交只是将分支指针向后移动,使提交悬空并可供修剪……如果没有被其他引用(其他分支、远程跟踪分支或标签)引用。或者您使用了git revert HEAD
? - Jakub Narębski
cherry-pick
和delete
一次性提交,即使这个提交发生在很久以前。 - Chrisgit reset --soft HEAD~1
正是你所需要的。 在这种情况下,你将撤销提交并保存你的工作。reset --hard
将完全删除提交。 - sergpankgit commit -a
,认为它是git commit --amend
的缩写(实际上不是),并且在一个新的空提交消息中。我可以使用空消息取消编辑器(在vim中使用:wq
),git不会创建提交,而是返回“由于空提交消息而中止提交。” - questionto42