如何从分支中删除提交?
如何从分支历史记录中删除提交?我应该使用 git reset --hard HEAD 吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(30)
如果您尚未将提交推送到任何地方,可以使用 git rebase -i
删除该提交。首先,找出该提交距离(大约)有多远。然后执行以下操作:
git rebase -i HEAD~N
~N
表示重新设置最后 N
提交的基准(N
必须是数字,例如 HEAD~10
代码>)。然后,您可以编辑 Git 向您提供的文件以删除有问题的提交。保存该文件后,Git 将重写所有以下提交,就好像您删除的文件不存在一样。
Git 书籍中有一个很好的关于变基的部分,其中包含图片和示例。
但要小心这一点,因为如果您更改了已推送到其他地方的内容,则需要另一种方法,除非您打算强制推送。
删除整个提交
git rebase -p --onto SHA^ SHA
显然将“SHA”替换为您要删除的引用。该命令中的“^”是字面意思。
http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep
请注意 -p
已被弃用,请改写 --rebase-merges
,请参阅答案下方的注释和 git-rebase - 在另一个基本提示之上重新应用提交 ==> --保留合并:
-p
--preserve-merges [已弃用:使用 --rebase-merges 代替] 重新创建合并提交,而不是通过重放提交来展平历史记录
合并提交介绍。合并冲突解决方案或手动
对合并提交的修改不会被保留。这在内部使用了 --interactive 机制,但将其组合起来
明确使用 --interactive 选项通常不是一个好主意
除非你知道自己在做什么(参见下面的错误)。另请参阅下面的不兼容选项。
以及新参数 git-rebase - 在另一个基本提示之上重新应用提交==> --rebase-merges[=(rebase-cousins|no-rebase-cousins)]:
-r
--rebase-merges[=(rebase-cousins|no-rebase-cousins)] 默认情况下,rebase 只会从待办事项列表中删除合并提交,并将
rebased 提交到单个线性分支。使用--rebase-merges,
相反,变基将尝试保留内部的分支结构
通过重新创建合并提交来重新确定基础的提交。
这些合并中任何已解决的合并冲突或手动修改
提交必须手动解决/重新应用。默认情况下,或者当指定 no-rebase-cousins 时,提交会执行以下操作
没有直系祖先将保留其原始分支
点,即将被 git-log[1] 排除的提交
--ancestry-path 选项将默认保留其原始祖先。如果开启了 rebase-cousins 模式,则此类提交会被替换
重新基于(或 ,如果指定)。--rebase-merges 模式在本质上与已弃用的模式类似
--preserve-merges 但适用于交互式变基,其中提交可以随意重新排序、插入和删除。目前只能使用以下命令重新创建合并提交
递归合并策略;只能使用不同的合并策略
通过显式 exec git merge -s [...] 命令。另请参阅下面的“重定合并基础”和“不兼容选项”。
假设我们要删除提交 2 和 2 4 来自仓库。 (提交的数字越大;0 是最旧的提交,4 是最新的提交)
commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>
注意:您需要对存储库拥有管理员权限,因为您正在使用 --hard< /code> 和
-f
。
git checkout b3d92c5
签出最后一个可用的提交。git checkout -b Repair
创建一个新的分支来工作。gitcherry-pick 77b9b82
运行提交 3。gitcherry-pick 2c6a45b
运行提交 1。git checkout master
签出 master。git reset --hard b3d92c5
将 master 重置为上次可用的提交。git merge Repair
将我们的新分支合并到 master 上。git push -f origin master
将 master 推送到远程仓库。
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
这些行可以重新排序;它们是从上到下执行的。
如果您在此处删除一行,则提交将丢失。
但是,如果删除所有内容,变基将会中止。
请注意,空提交已被注释掉,
您可以使用选项“d”或删除包含您的提交的行来简单地删除该提交。
#[快速解答]
您有很多替代方案,例如:
替代方案1:
git rebase -i
~1 <块引用>
将 YourCommitId 更改为您要恢复到的提交编号。
替代方案 2:
git reset --hard YourCommitId git push <来源> <分支> - 力量
<块引用>
将 YourCommitId 更改为您要恢复到的提交编号。
<块引用>我不推荐此选项,因为您可能会丢失正在进行的工作。
替代方案 3:
<前><代码> git reset --soft HEAD~1
<块引用>
您可以保留您的工作,仅撤消提交。
如果您想修复最新的提交,您可以撤消该提交,并取消暂存其中的文件,方法是:
git reset HEAD~1
这会将您的存储库返回到暂存文件的 git add 命令之前的状态。您的更改将位于您的工作目录中。 HEAD~1 指的是分支当前尖端下方的提交。
如果您想取消提交 N 次提交,但将代码更改保留在工作目录中:
git reset HEAD~N
如果您想删除最新的提交,并且不想保留代码更改,则可以执行“硬”重置。
git reset --hard HEAD~1
同样,如果您想放弃最后 N 次提交,并且不想保留代码更改:
git reset --hard HEAD~N
来源:https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
删除最后一次提交
例如您的最后一次提交
git push origin +aa61ab32^:master
现在您想要删除此提交,然后按照以下
步骤
- 执行此操作的简单方法
首先将分支重置为当前提交的父级
将其强制推送到远程。
git Reset HEAD^ --hard git推送原点-f
对于特定提交,您想要重置如下
git reset bb676878^ --hard
git push origin -f
这是另一种方法:
签出您想要恢复的分支,然后将本地工作副本重置回您想要成为远程服务器上最新版本的提交(之后的所有内容都将成为再见)。为此,我在 SourceTree 中右键单击并选择“将 BRANCHNAME 重置为此提交”。我认为命令行是:
git reset --hard COMMIT_ID
由于您刚刚从远程签出分支,因此您不会担心丢失任何本地更改。但如果你这样做的话就会失去他们。
然后导航到存储库的本地目录并运行以下命令:
git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
这将删除本地存储库中当前提交之后的所有提交,但仅限于该分支。
错误:
我 git rebase -i --root 编辑了我的分支,无知地认为我可以重写与主版本不同的第一个提交(Windows 版 GitHub 默认视图是与大师的比较,隐藏其全部)。
当 900 多个提交加载到 Sublime 中时,我留起了硅谷胡须。退出时没有进行任何更改,我给电池充电,然后继续剃须,因为所有 900 多个个人都漫不经心地重新提交了基础 - 将他们的提交时间重置为现在。
决心击败 Git 并保留原始时代,我删除了这个本地存储库并从远程重新克隆。
现在它已重新添加了我希望删除的最新不需要的提交,因此继续进行。
用尽选项:
我不希望 git revert - 它会创建一个额外的提交,让 Git 占据上风。
git reset --hard HEAD
什么也没做,在检查了 reflog
后,最后一个也是唯一的 HEAD
是克隆 - Git 获胜。
为了获取最新的 SHA,我检查了 github.com 上的远程存储库 -minor win。
在考虑 git reset --hard
回来查看 master,是时候尝试 git rebase -i
解决方案:
git rebase -i
然后d, drop = remove commit
。
为了验证,我检查了另一个分支,瞧 - 没有隐藏从主服务器获取/拉取的提交。
https://twitter.com/holman/status/706006896273063936
祝你有美好的一天。
如果您只是弄乱了上次提交(错误消息,忘记添加一些更改)并且想在将其推送到公共存储库之前修复它,为什么不使用:
git commit --amend -m "New message here"
如果您有新的暂存更改,它们将与上次提交合并(您试图摆脱的)并将替换该提交。
当然,如果您在推送后修改提交,您将重写历史,因此如果您这样做,请务必了解其含义。
如果您希望使用先前提交的消息,您还可以传递“--no-edit”选项而不是“-m”。
git reset --hard HEAD~1
您现在将处于先前的位置。拉树枝。推送新代码。提交将从 git 中删除
// display git commit log
$ git log --pretty=oneline --abbrev-commit
// show last two commit and open in your default editor
// then delete second commit line and save it
$ git rebase -i HEAD~2
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
小心:
git reset --hard
将删除您的工作目录更改。在运行此命令之前,请务必存储您想要保留的任何本地更改。
假设您正在执行该提交,那么此命令将对其进行破坏...
HEAD~1
表示 head 之前的提交。或者,您可以查看 git log 的输出,找到要备份到的提交的提交 ID,然后执行以下操作:
如果您已经推送了它,则需要执行强制推送以摆脱它......
但是,如果其他人可能已经拉动它,那么你最好开始一个新分支。因为当他们拉动时,它只会将其合并到他们的工作中,然后你会再次将其推回原处。
如果您已经推送,最好使用 git revert 来创建一个“镜像”提交来撤消更改。但是,这两次提交都会记录在日志中。
仅供参考:如果您想摆脱正在进行的工作,
git reset --hard HEAD
非常有用。它会将您重置回最近的提交,并删除工作树和索引中的所有更改。git stash
的作用相同,只是您可以在需要时恢复它,而不是通过重置硬模式永久删除。使用 git stash list 和 git stash show 'stash@123' 检查你的存储最后,如果你需要找到你“删除”的提交,它通常是存在的在 git reflog 中,除非您对存储库进行了垃圾收集。
Careful:
git reset --hard
WILL DELETE YOUR WORKING DIRECTORY CHANGES.Be sure to stash any local changes you want to keep before running this command.
Assuming you are sitting on that commit, then this command will wack it...
The
HEAD~1
means the commit before head.Or, you could look at the output of
git log
, find the commit id of the commit you want to back up to, and then do this:If you already pushed it, you will need to do a force push to get rid of it...
However, if others may have pulled it, then you would be better off starting a new branch. Because when they pull, it will just merge it into their work, and you will get it pushed back up again.
If you already pushed, it may be better to use
git revert
, to create a "mirror image" commit that will undo the changes. However, both commits will be in the log.FYI:
git reset --hard HEAD
is great if you want to get rid of WORK IN PROGRESS.It will reset you back to the most recent commit, and erase all the changes in your working tree and index.git stash
does the same except you can restore it later if you need, versus permanently delete with reset hard mode. Check your stashes by usinggit stash list
andgit stash show 'stash@123'
Lastly, if you need to find a commit that you "deleted", it is typically present in
git reflog
unless you have garbage collected your repository.