首页 文章

从Git中的分支删除提交

提问于
浏览
2697

我想知道如何删除提交 .

通过 delete ,我的意思是好像我没有做出那样的提交,而且当我将来做推动时,我的更改将不会推送到远程分支 .

我读了git help,我认为我应该使用的命令是 git reset --hard HEAD . 它是否正确?

27 回答

  • 3

    上面的所有命令都会在进行提交之前恢复工作树和索引的状态,但不会还原存储库的状态 . 如果你看一下,“删除”的提交实际上并没有被删除,它根本就不是当前分支顶端的提交 .

    我认为没有办法删除porcelain commands的提交 . 唯一的方法是从日志和reflog中删除它,然后执行 git prune --expire -now .

  • 33

    如果您尚未将提交推送到任何位置,则可以使用git rebase -i删除该提交 . 首先,找出提交的回程(大约) . 然后做:

    git rebase -i HEAD~N
    

    ~N 表示最后一次 N 提交( N 必须是数字,例如 HEAD~10 ) . 然后,您可以编辑Git提供给您的文件以删除违规提交 . 在保存该文件时,Git将重写所有以下提交,就好像您删除的那个提交不存在一样 .

    Git Book有一个很好的section on rebasing图片和例子 .

    但要小心这一点,因为如果你改变了其他地方的东西,除非你打算做一个强制推动,否则需要采用另一种方法 .

  • 5

    Forcefully Change History

    假设您不只是想删除最后一次提交,但是想要删除最后n次提交的特定提交,请使用:

    git rebase -i HEAD~<number of commits to go back> ,所以 git rebase -i HEAD~5 如果你想看到最后五次提交 .

    然后在文本编辑器中将要删除的每个提交旁边的单词 pick 更改为 drop . 保存并退出编辑器 . 瞧!

    Additively Change History

    试试 git revert <commit hash> . Revert将创建一个撤消指定提交的新提交 .

  • 0

    如果您已经推送过,首先找到您想要在HEAD($ GIT_COMMIT_HASH_HERE)的提交,然后运行以下命令:

    git reset --hard $GIT_COMMIT_HASH_HERE
    git push origin HEAD --force
    

    然后每个地方克隆了repo,运行:

    git reset --hard origin/master
    
  • 3

    将代码备份到临时文件夹中 . 以下命令将重置为与服务器相同 .

    git reset --hard HEAD
    git clean -f
    git pull
    

    如果您想保留更改,请删除最近的提交

    git reset --soft HEAD^
    git pull
    
  • 59
    git reset --hard commitId
    
    git push <origin> <branch> --force
    

    PS:CommitId指的是您想要恢复的那个

  • 7

    错误:

    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 release notes中掩盖了n00b的新功能巨魔 .

    解决方案:

    git rebase -i <SHA> 然后 d, drop = remove commit .

    为了验证,我检查了另一个分支,瞧 - 没有隐藏提交从主服务器获取/拉取 .

    https://twitter.com/holman/status/706006896273063936

    祝你好运

  • 5

    资料来源:https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

    删除最后一次提交

    For example your last commit

    git push origin aa61ab32 ^:master

    现在您要删除此提交,然后以简单的方式执行此操作

    脚步

    • 首先将分支重置为当前提交的父级

    • 强制将其推入遥控器 .

    git reset HEAD ^ --hard

    git push origin -f

    对于特定提交,您要重置以下内容

    git reset bb676878^ --hard
    
    git push origin -f
    
  • 28

    git reset --hard

    git push origin HEAD --force

    If one or more of the commits is tagged, delete the tag(s) first. 否则不会删除标记的提交 .

  • -2

    如果要修复最新的提交,可以通过执行以下操作来撤消提交,并取消暂存其中的文件:

    git reset HEAD~1
    

    这将使您的存储库返回到分阶段执行文件的git add命令之前的状态 . 您的更改将在您的工作目录中 . HEAD~1指的是分支当前尖端下面的提交 .

    如果要取消提交N提交,请在工作目录中保持代码更改:

    git reset HEAD~N
    

    如果你想摆脱最新的提交,并且不想保持代码更改,你可以进行“硬”重置 .

    git reset --hard HEAD~1
    

    同样,如果要丢弃最后N次提交,并且不想保持代码更改:

    git reset --hard HEAD~N
    
  • 3456

    使用git revert https://git-scm.com/docs/git-revert . 它将恢复所有代码然后你可以做下一次commit.Then head将指向最后一次提交 . 还原提交永远不会删除,但它不会影响您上次提交 .

  • 12

    Removing an entire commit

    git rebase -p --onto SHA^ SHA
    

    显然,将“SHA”替换为您想要的引用摆脱 . 该命令中的“^”是文字 .

    http://sethrobertson.github.io/GitFixUm/fixup.html

  • 0

    在本地分支上重置

    git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3
    

    强制推动原点

    git push -f origin
    
  • 1

    如果要保留历史记录,显示提交和还原,则应使用:

    git revert GIT_COMMIT_HASH
    

    输入消息,解释你为什么要还原,然后:

    git push
    

    当您发出 git log 时,您将看到"wrong"提交和还原日志消息 .

  • 22

    如果你搞砸了你的最后一次提交(错误的消息,忘了添加一些更改)并希望在将其推送到公共仓库之前修复它,为什么不使用:

    git commit --amend -m "New message here"
    

    如果你有新的阶段性更改,它们将与最后一次提交(你试图摆脱)相结合,并将替换该提交 .

    当然,如果您在推送之后修改了提交,那么您将重写历史记录,因此如果您这样做,请务必了解其含义 .

    如果您希望使用先前的提交消息,也可以传递'--no-edit'选项而不是'-m' .

    文件:http://git-scm.com/docs/git-commit.html

  • 22
    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

    这些线可以重新排序;它们是从上到下执行的 . 如果你在这里删除一行,那么COMMIT将会丢失 . 但是,如果删除所有内容,则将终止rebase . 请注意,空提交已注释掉

    您可以使用选项“d”或删除具有提交的行来删除该提交 .

  • 626

    delete local commit

    正如您在上面的图像中看到的,我想删除revert "test change 2" commit(SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (您可以通过在git bash中使用 gitk 命令获取SHA1 ID)) .

    为此,我可以使用(以下所有命令仅在本地工作 . 删除后需要推送):

    • git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 //它备份你到那个提交( test change 4 提交的SHA1 ID是 515b5220c50e3dfbb1063f23789d92ae1d3481a2

    • git reset --hard HEAD~1 //它在一次提交之前备份你 .

    • git reset --hard HEAD^ //从git中删除最后一次提交

    删除后:

    after delete commit

  • 15

    要在本地分支中删除,请使用

    git reset --hard HEAD~1
    

    要在远程分支中删除,请使用

    git push origin HEAD --force
    
  • 2

    这是另一种方法:

    检查要还原的分支,然后将本地工作副本重新设置为您希望成为远程服务器上最新版本的提交(之后的所有内容将再次出现) . 为此,在SourceTree中我右键单击并选择“将BRANCHNAME重置为此提交” . 我认为命令行是:

    git reset --hard COMMIT_ID
    

    由于您刚刚从远程检出了您的分支,因此您不会有任何本地更改以担心丢失 . 但如果你这样做会失去它们 .

    然后导航到存储库的本地目录并运行以下命令:

    git -c diff.mnemonicprefix=false -c core.quotepath=false \
    push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
    

    这将删除本地存储库中当前提交之后的所有提交,但仅删除该一个分支 .

  • 46

    假设您尚未推送到远程存储库,则可以重新克隆存储库 . 这几次是我的选择方法 .

  • 0

    另一种可能性是我最喜欢的命令之一:

    git rebase -i <commit>~1
    

    这将在交互模式 -i 中在您想要敲击的提交之前启动rebase . 编辑器将从那时开始列出所有提交 . 删除包含要删除的提交的行并保存文件 . Rebase将完成剩余的工作,仅删除该提交,并将所有其他提交重新放回日志中 .

  • 0

    我提交和推送时通常做的事情(如果有人推动他的提交,这解决了问题):

    git reset --hard HEAD~1
    
    git push -f origin
    

    希望这个帮助

  • -1

    Careful: git reset --hard 将删除您的工作目录更改 . 运行此命令之前,请务必使用 stash any local changes you want to keep .

    假设你正坐在那个提交上,那么这个命令就会搞砸......

    git reset --hard HEAD~1
    

    HEAD~1 表示在head之前提交 .

    或者,您可以查看 git log 的输出,找到要备份的提交的提交ID,然后执行以下操作:

    git reset --hard <sha1-commit-id>
    

    如果你已经推了它,你需要做一个强制推动来摆脱它......

    git push origin HEAD --force
    

    However ,如果其他人可能已经拉了它,那么你最好开始一个新的分支 . 因为当他们拉动时,它会将它合并到他们的工作中,并且你会再次将它推回去 .

    如果您已推送,最好使用 git revert 来创建将撤消更改的"mirror image"提交 . 但是,这两个提交都将在登录 .


    仅供参考 - 如果您想要摆脱WORK IN PROGRESS,我们很高兴 git reset --hard HEAD . 它会将您重置为最近的提交,并清除工作树和索引中的所有更改 .


    最后,如果您需要找到"deleted"的提交,它通常存在于 git reflog 中,除非您有垃圾收集您的存储库 .

  • 6

    如果您没有发布更改,则可以执行删除最新提交

    $ git reset --hard HEAD^
    

    (请注意,这也会删除所有未提交的更改;请谨慎使用) .

    如果您已发布要删除的提交,请使用git revert

    $ git revert HEAD
    
  • 7

    假设我们要从repo中删除提交2和4 .

    commit 0 : b3d92c5
    commit 1 : 2c6a45b
    commit 2 : <any_hash>
    commit 3 : 77b9b82
    commit 4 : <any_hash>
    

    注意: You need to have admin rights over the 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 将主控推送到远程仓库 .

  • 297

    I'm appending this answer because I don't see why anyone who has just tried to commit work would want to delete all that work because of some mistake using Git!

    如果你想保留你的工作并且只是'撤消'那个提交命令(你在推送回购之前就 grab 了):

    git reset --soft HEAD~1
    

    Do not use the --hard flag除非您想要销毁自上次提交以来正在进行的工作 .

相关问题