代码之家  ›  专栏  ›  技术社区  ›  Arnis Lapsa

如何从远程分支永久删除几个提交

git
  •  330
  • Arnis Lapsa  · 技术社区  · 14 年前

    我知道这是对历史的改写,很糟糕。

    但是如何从远程分支中永久删除几个提交呢?

    7 回复  |  直到 7 年前
        1
  •  458
  •   VonC    4 年前

    git reset --hard 您的本地分支将从工作树和索引中删除更改,然后 git push --force 你的本地分支到远程( other solution here

    这个 SO answer
    你要准备好给别人指路 RECOVERING FROM UPSTREAM REBASE 剖面图 git rebase


    使用git2.23(9年后的2019年8月),您将使用新命令 git switch .
    即: git switch -C mybranch origin/mybranch~n
    (替换 n

    这将恢复索引和工作树,就像 git重置--硬
    documentation adds

    -C <new-branch>
    --force-create <new-branch>
    

    类似 --create <new-branch> 已存在,将重置为 <start-point> .
    这是一个方便的快捷方式:

    $ git branch -f <new-branch>
    $ git switch <new-branch>
    
        2
  •  350
  •   hd84335    8 年前

    注意使用 last_working_commit_id

    git reset --hard <last_working_commit_id>
    

    所以我们不能重设为 commit_id 我们不想要的。

    当然,我们必须推到远程分支:

    git push --force
    
        3
  •  155
  •   Elias Dorneles    6 年前

    [*]

    中显示了三个选项 this tutorial

    1. 恢复完全提交
    2. 删除最后一次提交

    1恢复完全提交

    git revert dd61ab23
    

    2删除最后一次提交

    git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
    

    或者,如果分支在本地可用

    git reset HEAD^ --hard
    git push <<remote>> -f
    

    其中+dd61。。。是您的提交哈希,git将x^解释为x的父级,将+解释为强制的非fastforwared推送。

    3从列表中删除提交

    git rebase -i dd61ab23^
    

    这将打开一个显示所有提交列表的编辑器。删除你想除掉的那个。完成再基础和推力回购。

    git rebase --continue
    git push <remote_repo> <remote_branch> -f
    
        4
  •  66
  •   Abdollah    5 年前

    例如,如果要删除最后一个 3

    git reset --hard HEAD~3
    

    git push --force
    

    祝贺 你!一切就绪!

    您可以通过运行

    git log
    

    然后你可以替换 HEAD~N 具有 <desired-commit-id>

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

    如果您想保留文件系统上的更改并只修改索引(提交历史记录),请使用 --soft git reset --soft HEAD~3 . 然后你有机会检查你的最新更改,并保留或删除所有或部分更改。在后一种情况下,runnig git status <所需提交id> . 如果你使用 --hard git状态 会告诉你你的本地分支和远程分支完全一样。如果你不使用 --硬的 也不是 --mixed . 在这种模式下, git help reset 说:

    重置索引,但不重置工作树(即,更改的文件

        5
  •  12
  •   ted.strauss    9 年前

    从pctroll的答案简化,同样基于此 blog post .

    # look up the commit id in git log or on github, e.g. 42480f3, then do
    git checkout master
    git checkout your_branch
    git revert 42480f3
    # a text editor will open, close it with ctrl+x (editor dependent)
    git push origin your_branch
    # or replace origin with your remote
    
        6
  •  11
  •   cmaher MSeifert    5 年前

    filter-branch 您可以在整个git历史中删除文件或更改大量文件。

    这是最好的解释 here .

        7
  •  4
  •   Douglas.Sesar    8 年前

    git log
    

    复制您希望分支所在的提交哈希并退出git日志

    git checkout theHashYouJustCopied
    git checkout -b your_new_awesome_branch
    

    现在你有了一个你想要的新分支。

    如果您还需要保留不在新分支上的错误分支的特定提交,您可以选择您需要的特定提交:

    git checkout the_errant_branch
    git log
    

    将一个提交的提交哈希复制到good分支并退出git日志。

    git checkout your_new_awesome_branch
    git cherry-pick theHashYouJustCopied
    

        8
  •  0
  •   ayushgp    6 年前
     git reset --soft commit_id
     git stash save "message"
     git reset --hard commit_id
     git stash apply stash stash@{0}
     git push --force