从Git的分支中删除提交
我想知道如何删除提交。
通过“删除”,我的意思是好像我没有做出这样的承诺,而当我在将来推进时,我的改变不会推到远程分支。
我读git帮助,我认为我应该使用的命令是git reset --hard HEAD
。 它是否正确?
小心: git reset --hard
将删除您的工作目录更改 。 运行此命令之前,请务必保留您要保留的任何本地更改 。
假设你坐在那个提交,那么这个命令会怪怪它…
git reset --hard HEAD~1
HEAD~1
表示头部之前的提交。
或者,您可以查看git log
的输出,find要备份的提交的提交ID,然后执行以下操作:
git reset --hard <sha1-commit-id>
如果你已经推动它,你将需要做一个强制推动来摆脱它…
git push origin HEAD --force
但是 ,如果其他人可能拉了它,那么你最好开一个新的分支。 因为他们拉的时候,就会把它合并到自己的工作中,而且你会把它推回去。
如果你已经推动了,那么最好使用git revert
来创build一个“镜像”提交,它将撤销这些改变。 但是,这两个提交都将在日志中。
仅供参考 – git reset --hard HEAD
非常棒,如果你想摆脱正在进行的工作。 它会将您重置为最近的提交,并清除工作树和索引中的所有更改。
最后,如果你需要find一个你已经“删除”的提交,那么它通常出现在git reflog
除非你有垃圾收集你的仓库。
如果你还没有推送提交任何地方,你可以使用git rebase -i
删除提交。 首先,找出这个提交的距离(大约)。 然后做:
git rebase -i HEAD~N
〜N表示重写最后N
提交( N
必须是一个数字,例如HEAD~10
)。 然后,您可以编辑Git提供给您的文件,以删除违规的提交。 在保存那个文件时,Git会重写下面的所有提交,就好像你删除的提交不存在一样。
Git Book有很多关于图片和例子的重新定义部分。
但是要小心,因为如果你改变了你推到别处的东西,除非你打算推动力量,否则就需要另一种方法。
另一种可能性是我个人最喜欢的命令之一:
git rebase -i <commit>~1
这将在交互模式下开始rebase -i
,在你想要敲击的提交之前。 编辑将从此开始列出所有的提交。 删除包含要删除的提交的行并保存该文件。 Rebase将完成剩下的工作,只删除那个提交,并将所有其他的重新放回到日志中。
我附加了这个答案,因为我不明白为什么任何刚刚尝试提交工作的人都会因为使用Git的错误而删除所有这些工作。
如果你想保持你的工作,只是“撤销”那个提交命令(你在推动回购之前抓到的):
git reset --soft HEAD~1
除非你想从上次提交以来摧毁正在进行的工作,否则不要使用–hard标志。
如果您没有发布更改,要删除最新的提交,可以这样做
$ git reset --hard HEAD^
(注意,这也将删除所有未提交的更改;小心使用)。
如果你已经发布了要被删除的提交,请使用git revert
$ git revert HEAD
如果你想修复你最新的提交,你可以撤销提交,并取消其中的文件,通过做:
git reset HEAD~1
这会将你的版本库恢复到git add命令执行前的状态。 您的更改将在您的工作目录中。 HEAD〜1表示分支当前提示下的提交。
如果您想取消提交N个提交,但将代码更改保留在您的工作目录中:
git reset HEAD~N
如果你想摆脱你最新的提交,并不想保持代码的变化,你可以做一个“硬”重置。
git reset --hard HEAD~1
同样,如果你想丢弃最后的N个提交,并且不想保留代码的改变:
git reset --hard HEAD~N
删除整个提交
git rebase -p --onto SHA^ SHA
显然用你想摆脱的引用代替“SHA”。 该命令中的“^”是文字。
git reset --hard commitId git push <origin> <branch> --force
PS:CommitId指的是你想要恢复的那个
要在本地分支中删除,请使用
git reset --hard HEAD~1
要在远程分支中删除,请使用
git push origin HEAD --force
git rebase -i HEAD~2
这里'2'是你想要rebase的提交数量。
'git rebase -i HEAD`
如果你想重新提交所有的提交。
那么你将能够select其中的一个选项。
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
这些线可以重新sorting; 他们是从上到下执行的。 如果你在这里删除一行,那么这个COMMIT将会丢失。 但是,如果您删除了所有内容,那么rebase将被中止。 请注意,空提交被注释掉
你可以简单的使用选项“d”删除那个提交或者删除一个提交的行。
假设你不只是想删除最后一个提交,但是你想删除最后n个提交的具体提交,请使用:
git rebase -i HEAD~<number of commits to go back>
,所以git rebase -i HEAD~5
如果你想看最后五次提交。
然后在文本编辑器中将单词pick
,然后放到要drop
每个提交旁边。 保存并退出编辑器。 瞧!
上面的所有命令都可以在执行提交之前恢复工作树和索引的状态,但不会恢复存储库的状态。 如果你看看它,“删除”的提交并没有被实际删除,它根本就不是当前分支的提示。
我认为没有办法去除瓷器命令的提交。 唯一的办法是从日志中删除它,然后执行git prune --expire -now
。
这是另一种方法来做到这一点:
签出要恢复的分支,然后将本地工作副本重新设置为您希望成为远程服务器上最新的一个提交(在它将会再见之后的所有内容)。 为此,在SourceTree中,我右键单击并select“将BRANCHNAME重置为此提交”。 我觉得命令行是:
git reset --hard COMMIT_ID
既然你刚刚从远程检查你的分支,你将不会有任何本地更改担心失去。 但是,如果你这样做,会失去它们。
然后导航到您的存储库的本地目录并运行以下命令:
git -c diff.mnemonicprefix=false -c core.quotepath=false \ push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
这将清除当前仓库中所有提交之后的所有提交,但仅限于该分支。
如果你只是搞砸你最后一次提交(错误的信息,忘记添加一些更改),并希望解决它之前推到公共回购为什么不使用:
git commit --amend -m "New message here"
如果你有新的变化,他们将与最后一次提交(你试图摆脱)相结合,并将取代提交。
当然,如果你在推送之后修改了一个提交,那么你就是在重写历史,所以如果你这样做的话,一定要明白其意义。
如果您想使用之前提交的消息,也可以传递“–no-edit”选项而不是“-m”。
文档: http : //git-scm.com/docs/git-commit.html
如果你想保持历史,显示提交和还原,你应该使用:
git revert GIT_COMMIT_HASH
input消息说明你为什么还原,然后:
git push
当你发出git log
你会看到“错误的”提交和恢复日志消息。
这个错误:
我git rebase -i --root
'编辑我的分支,无知地认为我可以改写第一个不同于master的提交( GitHub for Windows默认视图是与master的比较,隐藏它的全部)。
我长大了一个硅谷胡子,而900多个承诺装入崇高。 退出没有任何改变,我收取我的电池,然后进行刮脸,因为所有900 +个人承诺无条件地重新启动 – 重置他们的承诺时间到现在。
确定要打Git并保留原来的时间,我删除了本地存储库,并从远程重新克隆。
现在它已经重新添加了一个最近不需要的提交给我想要删除的主,所以就这样继续。
排除选项:
我不希望重新git revert
– 它会创build一个额外的提交,让Git占上风。
git reset --hard HEAD
没有做任何事情,在检查了reflog
,最后一个HEAD
是克隆 – Git获胜。
为了获得最新的SHA,我检查了github.com上的远程仓库 – 小赢。
在思考git reset --hard <SHA>
工作之后,我更新了另外一个分支来掌握和1 … 2 … poof! 提交回来了 – Git获胜。
检查出主人,时间来尝试git rebase -i <SHA>
,然后删除行…无济于事,伤心地说。 “ 如果你在这里删除一行,那么这个提交将会丢失 ”。 啊…掩盖了2.8.3发行说明中的新特性troll n00b 。
解决scheme:
git rebase -i <SHA>
然后d, drop = remove commit
。
为了validation,我签出了另一个分支,瞧 – 没有隐藏承诺提取从主。
https://twitter.com/holman/status/706006896273063936
祝你好日子。
如果你已经推送了,首先find你想要在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
希望这个帮助
假设我们要删除回购中的提交2和4。
注意:因为您正在使用--hard
所以您需要拥有pipe理权限 。
-
git checkout b3d92c5
签出最后一次可用的提交。 -
git checkout -b repair
创build一个新的分支来处理。 -
git cherry-pick 77b9b82
运行通过提交3。 -
git cherry-pick 2c6a45b
运行通过提交1。 -
git checkout master
Checkout master。 -
git reset --hard b3d92c5
主git reset --hard b3d92c5
重置为最后一次可用的提交。 -
git merge repair
合并我们的新分支到主。 -
git push --hard origin master
推送到远程回购。
假设你没有推送到远程仓库,你可以重新克隆仓库。 这是我的select几次。
git reset –hard
git push origin HEAD –force
如果一个或多个提交被标记,则首先删除标记。 否则,标记的提交不会被删除。
把你的代码备份到临时文件夹中。 以下命令将重置与服务器相同。
git reset --hard HEAD git clean -f git pull
然后单独从临时文件夹复制所需的文件,然后提交
使用git恢复https://git-scm.com/docs/git-revert。它将恢复所有的代码,然后你可以做下一个提交。然后头将指向最后一次提交。; 还原的提交从不删除,但不会影响你上次提交。
我知道这个问题已经得到了充分的回答,但是我想总结一下(less数)安全的步骤来为那些在一个不好的commit之后恐慌的人(比如我)
-
进入源代码目录并使用命令备份你的代码:
tar czvf code.tgz *
-
使用以下命令显示git提交列表:
git日志
-
在不需要的提交下获得提交的“sha1-commit-id”,这是你之前提交的id(git日志首先列出了最近的提交)
-
用命令恢复不需要的提交
git reset –hard“sha1-commit-id”
*你可以通过发出anoter git log命令检查你是否正确*
-
使用以下命令取回您的无限代码:
tar xzvf code.tgz
tar命令是用来确保你的努力工作不会被错误的擦除,因为git reset
命令将会删除你的工作目录的改变,所以第一步和第五步被用来隐藏本地的改变。