题
我想知道如何删除提交。
经过 delete
, ,我的意思是,就好像我没有进行该提交,当我将来进行推送时,我的更改将不会推送到远程分支。
我读了 git help,我认为我应该使用的命令是 git reset --hard HEAD
. 。它是否正确?
解决方案
<强>小心:强> git reset --hard
将删除工作目录的变化。请务必藏匿要在运行此命令之前保持的修改。
假设你坐在那个承诺,那么这个命令将它怪人...
git reset --hard HEAD~1
在HEAD~1
意味着头之前提交。
或者,你可以看看git log
的输出,发现提交的ID提交要备份到,然后做这样的:
git reset --hard <sha1-commit-id>
如果你已经推它,你将需要做力推摆脱它......
git push origin HEAD --force
然而后,如果其他人可能已经把它,那么你会过得更好开始一个新的分支。因为当他们拉,它只是把它合并到自己的工作,你会得到它推回再升。
如果你已经推,它可能是更好的使用git revert
,创建一个“镜像”承诺,将撤消更改。然而,这两种提交将在日志中。
仅供参考 - 如果你想摆脱工作在进行中git reset --hard HEAD
是很大的。它会重置你回到最近的提交,并删除在您的工作树和索引所有的变化。
最后,如果你需要找到一个承诺,你“已删除”,除非你有垃圾回收你的资料库是典型的git reflog
存在。
其他提示
如果您还没有任何地方推提交,你可以使用 git rebase -i
删除该承诺。首先,找出多远回到那个承诺是(约)。然后执行:
git rebase -i HEAD~N
在~N
意味着变基最后N
提交(N
必须是一个数,例如HEAD~10
)。然后,您可以编辑Git的呈现给你删除有问题的提交文件。在保存该文件,Git会再重写所有如下的提交,如果你删除了一个根本不存在。
在GIT中簿具有良好与图片和衍合部分实例
小心这一点,因为如果你改变的东西,你的的的别处推,另一种方法将需要除非你打算做一个力推。
另一种可能性是我的个人喜爱的命令之一:
git rebase -i <commit>~1
这将在被提交之前要重击点开始在交互模式-i
底垫。编辑器将启动自那以后上市的所有提交的。删除包含要抹杀和保存文件的提交行。变基会做的工作的其余部分,删除只提交和重放所有其他的回数。
我追加这个答案,因为我不明白为什么有人谁刚刚试图提交的工作将要使用删除,因为一些错误的所有的工作混帐!
如果你想保持你的工作,只是“撤消”那个commit命令(你推到回购之前抓到):
git reset --soft HEAD~1
除非你想破坏你的工作正在进行中自上次不要使用--hard 标志提交。
<强>卸下整个提交强>
git rebase -p --onto SHA^ SHA
显然,你想摆脱的引用来代替“SHA”。的“^”在该命令是立即数。
如果您没有发布修改,删除最新提交,你可以做
$ git reset --hard HEAD^
(注意,这也将删除所有未提交的更改;小心使用)。
如果您已经发布将要删除的提交,使用的 GIT中恢复
$ git revert HEAD
git reset --hard commitId
git push <origin> <branch> --force
PS:的commitid指要恢复到一个
假设我们要从存储库中删除提交 2 和 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
运行提交 3。git cherry-pick 2c6a45b
运行提交 1。git checkout master
结账师傅。git reset --hard b3d92c5
将 master 重置为上次可用的提交。git merge repair
将我们的新分支合并到 master 上。git push -f origin master
将 master 推送到远程仓库。
<强>强行更改历史记录强>
假设你不只是要删除的最后一次提交,但你要删除的最后n的具体提交的提交,去:
如果你想看到在过去五年提交git rebase -i HEAD~<number of commits to go back>
,所以git rebase -i HEAD~5
。
然后在文本编辑器改字pick
旁边的每一个承诺,你想删除到drop
。保存并退出编辑器。瞧!
<强>相加地更改历史记录强>
尝试git revert <commit hash>
。 还原将创建一个新提交该撤销指定提交。
如果你想修复你的最新承诺,您可以撤消提交和unstage文件在里面,这样做:
git reset HEAD~1
这将您的资料库恢复到其状态git的添加上演文件的命令之前。您的更改将在您的工作目录。 HEAD〜1指的是提交分支的当前尖端下方。
如果您想取消提交的n条提交,但保持代码的变化在你的工作目录:
git reset HEAD~N
如果你想摆脱你的最新的承诺,并且不希望保持代码的变化,你可以做一个“硬”复位。
git reset --hard HEAD~1
同样的,如果你要放弃最后N个承诺,并且不希望保持代码的更改:
git reset --hard HEAD~N
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”或删除具有行你的提交。
要删除在本地分支,使用
git reset --hard HEAD~1
要删除在远程分支,使用
git push origin HEAD --force
下面是另一种方式来做到这一点:
结帐要恢复分支,然后重置您的本地工作副本回承诺,你想在远程服务器上最新的一个(一切后它会再见)。要做到这一点,在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
'ed我的分支,无知想我可以改写第一个提交从主不同(在 GitHub上的Windows 的默认视图是比较掌握,躲在它的全部)。
我长大硅谷胡须而900+提交加载自己变成升华。没有改变退出,我收费,则我的电池进行刮胡子,因为所有900+单次的提交若无其事地重建基础 - 重置其提交时间到现在
测定击败GIT中并保留原始次,我删除这个本地资源库,并从远程重新克隆
现在它已经重新添加的最近不需要提交掌握我希望删除,所以进行像这样。
排出选项:
我不希望git revert
- 它会造成额外的提交,给予GIT中上风
git reset --hard HEAD
什么也没做,检查reflog
后,最后只有HEAD
是克隆 - Git的胜
要获得最新的SHA,我查了github.com远程仓库 - 未成年人赢
想git reset --hard <SHA>
工作过之后,我更新了另一个分支掌握和1 ... 2 ...噗!所述提交回来 - GIT中获得
检查回给主人,时间去尝试git rebase -i <SHA>
,然后取出线......都无济于事,痛心地说。 “如果你删除这里行提交会丢失的”。啊......掩盖了新功能的巨魔中的的> 2.8.3释放说明。
在解决方案:
git rebase -i <SHA>
然后d, drop = remove commit
。
要验证的,我检出到另一个分支,瞧 - 没有隐藏致力于获取/从主拉
https://twitter.com/holman/status/706006896273063936
你的好日子。
所有的命令恢复你的工作树和索引的状态,因为他们是在提交前,但不恢复仓库的状态。如果你看一下吧,“删除”的承诺实际上未被删除,它根本就不是当前分支的末端的一个。
我认为不存在任何手段来移除与瓷的命令提交。的唯一方法是从日志中移除,然后引用日志,然后执行git prune --expire -now
。
来源: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
删除最后一次提交
例如你的最后一次提交
git push origin +aa61ab32^:master
现在您想删除此提交,然后可以通过以下简单方法来执行此操作
脚步
首先将分支重置为当前提交的父分支
用力将其推至遥控器。
git reset HEAD^ --hard git push origin -f
对于特定提交,您想要重置如下
git reset bb676878^ --hard
git push origin -f
如果你只是搞砸了上次提交(错误信息,忘记添加一些变化),并希望它推到公共回购,为什么不使用前解决它:
git commit --amend -m "New message here"
如果您有新上演,他们将与之合并的改变最后提交的(你试图摆脱),将取代该提交。
当然,如果你修改提交你推后,你改写历史,所以如果你是一定要了解的含义。
您也可以通过代替“-M”的“--no编辑”选项,如果你希望使用以前提交的消息。
如果你想保留历史记录,显示了承诺和还原,你应该使用:
git revert GIT_COMMIT_HASH
进入的消息解释为什么你还原,然后:
git push
当你发出git log
你会看到无论是“错误”的承诺,并恢复日志信息。
如果您已经推,先找到你想在HEAD提交的($ GIT_COMMIT_HASH_HERE)的,然后运行以下命令:
git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
然后,每个回购已被克隆的地方,运行:
git reset --hard origin/master
我通常会做什么时,我提交并推送(如果有人推他犯这个解决问题):
git reset --hard HEAD~1
git push -f origin
希望这有助于
在本地分支复位
git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3
强制推到原点
git push -f origin
到临时文件夹你的代码中采取备份。下面的命令将重置相同服务器。
git reset --hard HEAD
git clean -f
git pull
如果您想保留更改和删除最新提交
git reset --soft HEAD^
git pull
正如您在上图中看到的,我想删除恢复“测试更改 2”提交(SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2(您可以使用以下方式获取 SHA1 ID gitk
git bash 中的命令))。
为此,我可以使用(以下所有命令仅适用于本地。删除后需要推送):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
//它支持您进行该提交(SHA1 ID 测试变更4 提交是 515b5220c50e3dfbb1063f23789d92ae1d3481a2)git reset --hard HEAD~1
// 它会在一次提交之前为您提供备份。git reset --hard HEAD^
// 从 git 中删除最后一次提交
删除后:
GIT中的复位 - 硬
git的推原点HEAD --force
如果在提交的一个或多个被标记,删除(多个)标签的第一,否则被标记的提交不会被删除。
// 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中恢复 https://git-scm.com/docs/git-revert 。它会恢复所有的代码,那么你可以做下一个commit.Then头将指向最后一次提交。退耕犯下从不删除,但它不会影响你最后一次提交。