hap*_*497 3035 git git-rebase git-reset
我想知道如何删除提交.
通过delete
,我的意思是,如果我没有做那个承诺,当我将来做一推,我所做的更改不会推到远程分支.
我读了git help,我认为我应该使用的命令是git reset --hard HEAD
.它是否正确?
gah*_*ooa 3858
小心: git reset --hard
将删除您的工作目录更改.在运行此命令之前,请务必隐藏要保留的任何本地更改.
假设你正坐在那个提交上,那么这个命令就会搞砸......
git reset --hard HEAD~1
Run Code Online (Sandbox Code Playgroud)
这HEAD~1
意味着在头之前提交.
或者,您可以查看输出git log
,找到要备份的提交的提交ID,然后执行以下操作:
git reset --hard <sha1-commit-id>
Run Code Online (Sandbox Code Playgroud)
如果你已经推了它,你需要做一个强制推动来摆脱它......
git push origin HEAD --force
Run Code Online (Sandbox Code Playgroud)
但是,如果其他人可能已经拉了它,那么你最好开始一个新的分支.因为当他们拉动时,它会将它合并到他们的工作中,并且你会再次将它推回去.
如果您已经推送过,最好使用git revert
创建"镜像"提交来撤消更改.但是,两个提交都将在日志中.
仅供参考 - git reset --hard HEAD
如果您想摆脱WORK IN PROGRESS,那就太棒了.它会将您重置为最近的提交,并清除工作树和索引中的所有更改.
最后,如果您需要查找"已删除"的提交,则通常会将其存在,git reflog
除非您收集了存储库的垃圾.
Gre*_*ill 677
如果您尚未将提交推送到任何位置,则可以使用git rebase -i
删除该提交.首先,找出提交的回程(大约).然后做:
git rebase -i HEAD~N
Run Code Online (Sandbox Code Playgroud)
修改~N
最后N
提交的方法(N
例如,必须是数字HEAD~10
).然后,您可以编辑Git提供给您的文件以删除违规提交.保存该文件后,Git将重写所有以下提交,就好像您删除的提交不存在一样.
Git Book有一个很好的部分,有关图片和示例的变基础.
小心这一点,因为如果你改变的东西,你已经在别处推,就需要另一种方法,除非你打算做一个力推.
180*_*ION 477
另一种可能性是我最喜欢的命令之一:
git rebase -i <commit>~1
Run Code Online (Sandbox Code Playgroud)
这将在-i
您想要重置的提交之前的点处以交互模式启动rebase .编辑器将从那时开始列出所有提交.删除包含要删除的提交的行并保存文件.Rebase将完成剩余的工作,仅删除该提交,并将所有其他提交重新放回日志中.
Rob*_*Rob 328
我正在追加这个答案,因为我不明白为什么那些刚刚尝试提交工作的人会因为使用Git的一些错误而删除所有工作!
如果你想保留你的工作并且只是'撤消'那个提交命令(你在推送回购之前就抓住了):
git reset --soft HEAD~1
Run Code Online (Sandbox Code Playgroud)
除非您想要销毁自上次提交以来正在进行的工作,否则请勿使用--hard标志.
rai*_*tes 91
删除整个提交
git rebase -p --onto SHA^ SHA
Run Code Online (Sandbox Code Playgroud)
显然用您想要删除的引用替换"SHA".该命令中的"^"是文字.
http://sethrobertson.github.io/GitFixUm/fixup.html
Jak*_*ski 50
如果您没有发布更改,则可以执行删除最新提交
$ git reset --hard HEAD^
Run Code Online (Sandbox Code Playgroud)
(请注意,这也会删除所有未提交的更改;请谨慎使用).
如果您已经发布了要删除的提交,请使用git revert
$ git revert HEAD
Run Code Online (Sandbox Code Playgroud)
小智 37
git reset --hard commitId
git push <origin> <branch> --force
Run Code Online (Sandbox Code Playgroud)
PS:CommitId指的是您想要恢复的那个
tk_*_*tk_ 37
假设我们要从repo中删除提交2和4.
commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>
Run Code Online (Sandbox Code Playgroud)
注意:您需要拥有对repo的管理权限,因为您正在使用--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
将主站推送到远程仓库.Ili*_*asT 33
有力地改变历史
假设您不只是想删除最后一次提交,但想要删除最后n次提交的特定提交,请执行以下操作:
git rebase -i HEAD~<number of commits to go back>
,所以git rebase -i HEAD~5
如果你想看到最后五个提交.
然后在文本编辑器中字改变pick
到drop
旁边的每一个承诺,你想删除.保存并退出编辑器.瞧!
附加改变历史
试试git revert <commit hash>
.Revert将创建一个撤消指定提交的新提交.
Jav*_* C. 33
你有很多选择,例如:
备选方案 1:
git rebase -i <YourCommitId>~1
Run Code Online (Sandbox Code Playgroud)
将 YourCommitId 更改为要恢复的提交编号。
备选方案 2:
git reset --hard YourCommitId
git push <origin> <branch> --force
Run Code Online (Sandbox Code Playgroud)
将 YourCommitId 更改为要恢复的提交编号。
我不推荐此选项,因为您可能会丢失正在进行的工作。
备选方案 3:
git reset --soft HEAD~1
Run Code Online (Sandbox Code Playgroud)
您可以保留您的工作并仅撤消提交。
Anu*_*rma 30
如果要修复最新的提交,可以通过执行以下操作来撤消提交,并取消暂存其中的文件:
git reset HEAD~1
Run Code Online (Sandbox Code Playgroud)
这将使您的存储库返回到分阶段执行文件的git add命令之前的状态.您的更改将在您的工作目录中.HEAD~1指的是分支当前尖端下面的提交.
如果要取消提交N提交,请在工作目录中保持代码更改:
git reset HEAD~N
Run Code Online (Sandbox Code Playgroud)
如果你想摆脱最新的提交,并且不想保持代码更改,你可以进行"硬"重置.
git reset --hard HEAD~1
Run Code Online (Sandbox Code Playgroud)
同样,如果要丢弃最后的N次提交,并且不想保持代码更改:
git reset --hard HEAD~N
Run Code Online (Sandbox Code Playgroud)
nav*_*gar 26
如果您想删除当前正在进行的提交但不想删除数据-
git reset --soft HEAD~1
Run Code Online (Sandbox Code Playgroud)
如果您想删除当前所在的提交并希望删除相关数据-
git reset --hard HEAD~1
Run Code Online (Sandbox Code Playgroud)
PS:这些命令只会删除本地提交。
Siv*_*een 19
git rebase -i HEAD~2
Run Code Online (Sandbox Code Playgroud)
这里'2'是您要重新设置的提交数.
'git rebase -i HEAD`
Run Code Online (Sandbox Code Playgroud)
如果你想重新提交所有提交.
然后,您将能够选择其中一个选项.
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"或删除具有提交的行来删除该提交.
the*_*tar 16
要在本地分支中删除,请使用
git reset --hard HEAD~1
Run Code Online (Sandbox Code Playgroud)
要在远程分支中删除,请使用
git push origin HEAD --force
Run Code Online (Sandbox Code Playgroud)
Fra*_*ank 13
在这里我只是发布一个明确的管道来做到这一点
步骤1:使用git log获取提交ID。
git log
Run Code Online (Sandbox Code Playgroud)
Step2:使用 git reset 返回到之前的版本:
git reset --hard <your commit id>
Run Code Online (Sandbox Code Playgroud)
sag*_*thi 10
来源:https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
例如您的最后一次提交
git push origin + aa61ab32 ^:master
现在您要删除此提交,然后执行以下简单操作
脚步
首先将分支重置为当前提交的父级
强制将其推到遥控器上。
Run Code Online (Sandbox Code Playgroud)git reset HEAD^ --hard git push origin -f
对于特定的提交,您想重置以下内容
git reset bb676878^ --hard
git push origin -f
Run Code Online (Sandbox Code Playgroud)
这是另一种方法:
签出要还原的分支,然后将本地工作副本重置回您希望成为远程服务器上最新版本的提交(之后的所有内容将再次发生).为此,在SourceTree中我右键单击并选择"将BRANCHNAME重置为此提交".我认为命令行是:
git reset --hard COMMIT_ID
Run Code Online (Sandbox Code Playgroud)
由于您刚刚从远程检出了您的分支,因此您不会有任何本地更改以担心丢失.但如果你这样做会失去它们.
然后导航到存储库的本地目录并运行以下命令:
git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
Run Code Online (Sandbox Code Playgroud)
这将删除本地存储库中当前提交之后的所有提交,但仅删除该一个分支.
错误:
我git rebase -i --root
是我的分支,无知地认为我可以改写与主服务器不同的第一个提交(GitHub for Windows默认视图是与master的比较,隐藏它的全部).
我长大了一个硅谷的胡子,而900多个提交加载到Sublime.在没有任何变化的情况下退出,我对电池进行了充电然后继续刮胡子,因为所有900多个人提交的都是不加协商的 - 重置他们的提交时间到现在.
决定击败Git并保留原始时间,我删除了这个本地存储库并从远程重新克隆.
现在它重新添加了一个最近不需要的提交给master我希望删除,所以继续这样做.
耗尽选项:
我不希望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发行说明中掩盖了新功能巨魔n00b.
解决方案:
git rebase -i <SHA>
然后d, drop = remove commit
.
为了验证,我检查了另一个分支,瞧 - 没有隐藏提交从主服务器获取/拉取.
https://twitter.com/holman/status/706006896273063936
祝你好运
如果你搞砸了你的最后一次提交(错误的消息,忘记添加一些更改)并希望在将其推送到公共仓库之前修复它,为什么不使用:
git commit --amend -m "New message here"
Run Code Online (Sandbox Code Playgroud)
如果你有新的阶段性更改,它们将与最后一次提交(你试图摆脱)相结合,并将替换该提交.
当然,如果您在推送之后修改了提交,那么您将重写历史记录,因此如果您这样做,请务必了解其含义.
如果您希望使用先前的提交消息,也可以传递'--no-edit'选项而不是'-m'.
文档:http: //git-scm.com/docs/git-commit.html
如果要保留历史记录,显示提交和还原,则应使用:
git revert GIT_COMMIT_HASH
Run Code Online (Sandbox Code Playgroud)
输入消息,解释你为什么要还原,然后:
git push
Run Code Online (Sandbox Code Playgroud)
当您发出时,git log
您将看到"错误"提交和还原日志消息.
我已经推了。需要远程返回一些提交。已经尝试了许多变化,但只有这样,从贾斯汀通过git的衬套工作对我罚款:
git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
Run Code Online (Sandbox Code Playgroud)
如果已经推送,则首先在HEAD ($ GIT_COMMIT_HASH_HERE)处找到要提交的提交,然后运行以下命令:
git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
Run Code Online (Sandbox Code Playgroud)
然后,每个仓库都已被克隆,运行:
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)
我提交和推送时通常执行的操作(如果有人推送了他的提交,则可以解决问题):
git reset --hard HEAD~1
git push -f origin
Run Code Online (Sandbox Code Playgroud)
希望这个帮助
小智 5
在本地分支上重置
git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3
Run Code Online (Sandbox Code Playgroud)
强制推送到原点
git push -f origin
Run Code Online (Sandbox Code Playgroud)
// 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2143765 次 |
最近记录: |