如何从远程分支永久删除一些提交

Arn*_*psa 412 git

我知道这是重写历史,这是糟糕的亚达亚达.

但是如何从远程分支中永久删除一些提交?

Von*_*onC 315

你是git reset --hard你的本地分支,git push --force你修改了本地分支到遥控器.(这里的其他解决方案,涉及删除远程分支,并重新推送它)

这个SO答案说明了这种命令的危险,特别是如果人们依赖于他们自己的本地回购的远程历史.
您需要准备好指出人员到手册页的RECOVERING FROM UPSTREAM REBASE部分git rebase

  • @Arnis:那么完美;)`push --force` (7认同)
  • 奇怪的。感觉就像我已经尝试过了。加上一些变基 - 就像魅力一样。谢谢。 (2认同)
  • @MoshFeu True:`git gc`并不总是在远程端运行得足够频繁。例如在 GitHub 上:https://twitter.com/githubhelp/status/387926738161774592?lang=es (2认同)
  • @VonC您能否从您的答案中澄清:新命令是否更好或达到相同的最终结果?(您提到旧命令有一些危险!) (2认同)

hd8*_*335 188

请注意last_working_commit_id在还原非工作提交时使用

git reset --hard <last_working_commit_id>
Run Code Online (Sandbox Code Playgroud)

因此,我们不能重置为commit_id我们不想要的.

那么肯定,我们必须推送到远程分支:

git push --force
Run Code Online (Sandbox Code Playgroud)

  • 完美,优雅,简约的答案.我只是恢复到最后一次stabe提交我需要远程和本地 (6认同)
  • 好的解决方案 轻松干净!! 谢啦! (2认同)
  • 这也使我也失去了本地更改。我没想到这一点。但是,比将您的个人密码提交工作回购要好。 (2认同)
  • 你可以用git stash保存你的本地更改....制作一些东西....并且git stash pop(你的本地更改又回来了) (2认同)
  • 这应该是公认的解决方案 (2认同)

ree*_*tor 139

重要提示:确保在"git push -f"上指定了哪些分支,否则可能会无意中修改其他分支![*]

本教程中显示了三个选项.如果链接断开,我将在这里留下主要步骤.

  1. 恢复完整提交
  2. 删除最后一次提交
  3. 从列表中删除提交

1还原完整提交

git revert dd61ab23
Run Code Online (Sandbox Code Playgroud)

2删除最后一次提交

git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
Run Code Online (Sandbox Code Playgroud)

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

git reset HEAD^ --hard
git push <<remote>> -f
Run Code Online (Sandbox Code Playgroud)

其中+ dd61 ...是你的提交哈希,git将x ^解释为x的父级,而+作为强制非快速推送推送.

3从列表中删除提交

git rebase -i dd61ab23^
Run Code Online (Sandbox Code Playgroud)

这将打开,编辑器显示所有提交的列表.删除你要删除的那个.完成rebase并推动力量回购.

git rebase --continue
git push <remote_repo> <remote_branch> -f
Run Code Online (Sandbox Code Playgroud)

  • 确保在"git push <remote_repo> <remote_branch> -f"上指定了哪些分支,否则可能会无意中修改其他分支! (5认同)

Sai*_*aif 25

TL:博士;

  1. git switch -C branch_name origin/branch_name~n
  2. git push --force

完成后,远程分支将通过提交恢复n


说明:

  1. 使用git switch,将分支重置为 n 次提交。该-C选项将强制创建一个具有相同名称的新分支。

    • 替换branch_name为您的分支名称,
    • 替换n(在命令末尾),替换为您要恢复的提交数量。

    命令#1: git switch -C branch_name origin/branch_name~n

    示例:git switch -C feature/dashboard origin/feature/dashboard~1 // 此命令恢复仪表板分支中的1 次提交。

  2. 强制推动本地变革

    命令#2: git push --force


提示:撤消已提交(未推送)的更改git reset HEAD~


mah*_*mnj 10

这是一种从远程存储库中删除提交而不会丢失工作的干净方法。

快速回答

git reset --soft HEAD~1 # 1 represents only last 1 commit 
git stash # hold your work temporary storage temporarily.
git pull # bring your local in sync with remote
git reset --hard HEAD~1 # hard reset 1 commit behind (deletes local commit)
git push -f # force push to sync local with remote
git stash pop # get back your unpushed work from stash
Run Code Online (Sandbox Code Playgroud)

详细解释为什么它有效。

这就是我的案例中发生的事情

  1. 我当时在一个分支机构工作redesign

  2. 我不小心提交并推送了一个秘密文件以及我的其他工作。所以我的秘密现在被暴露了(Gitguardian 在我的电子邮件中对此大喊大叫 xD)现在我想从存储库中删除我的秘密文件,但也想保留我的工作。

  3. 因此,运行git reset --soft HEAD~1此命令会将您机器上的本地存储库移至后面 1 个提交(修改数字以将 n 个提交移至后面)

  4. 现在您将看到您提交的文件为unstaged

  5. 通过运行将其临时移至存储区,从而在本地保存此工作git stash

  6. 现在通过运行使本地与远程同步git pull

  7. 现在运行git reset --hard HEAD~1(再次修改数字以删除 n 次提交)以从存储库中删除远程提交并执行强制推送git push -f

  8. 您将看到远程存储库中的提交已被删除。

  9. 现在通过运行从存储中取回你的工作git stash pop

  10. 现在,对未完成的工作进行所需的更改。


jan*_*s86 9

这可能太晚了,但是对我有帮助的是酷炫的"核"选择.基本上使用该命令,filter-branch您可以在整个GIT历史记录中删除文件或更改大量文件.

这里最好解释一下.

  • 还不算太晚.可能对有类似问题的流浪者有用:) (9认同)

ted*_*uss 9

从pctroll的答案中简化,同样基于这篇博客文章.

# 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
Run Code Online (Sandbox Code Playgroud)

  • 为我工作,谢谢。我想从远程分支历史记录中永久删除一个提交(例如包含pwd),这怎么办? (2认同)

Abd*_*lah 8

例如,如果要删除最后的3提交,请运行以下命令以从文件系统(工作树)和本地分支上的提交历史记录(索引)中删除更改:

git reset --hard HEAD~3
Run Code Online (Sandbox Code Playgroud)

然后(在本地计算机上)运行以下命令来强制远程分支重写其历史记录:

git push --force
Run Code Online (Sandbox Code Playgroud)

恭喜你!全部做完!

一些注意事项:

您可以通过运行来检索所需的提交ID

git log
Run Code Online (Sandbox Code Playgroud)

然后你就可以代替HEAD~N使用<desired-commit-id>这样的:

git reset --hard <desired-commit-id>
Run Code Online (Sandbox Code Playgroud)

如果要保留文件系统上的更改并仅修改索引(提交历史记录),请使用--soft标记,例如git reset --soft HEAD~3。然后,您将有机会检查您的最新更改并保留或删除全部或部分更改。在后一种情况下,runnig git status显示自以来更改的文件<desired-commit-id>。如果使用--hardoption,git status则会告诉您本地分支与远程分支完全相同。如果您不使用--hard也不--soft使用,则使用默认模式--mixed。在这种模式下,git help reset说:

重置索引,但不重置工作树(即,已更改的文件将保留,但未标记为提交),并报告尚未更新的内容。


Dou*_*sar 7

有时,解决此问题的最简单方法是从您知道代码良好的位置创建一个新分支。然后,您可以保留错误的分支历史记录,以防以后需要从中挑选其他提交。这也确保您不会丢失任何提交历史记录。

从您当地的错误分支:

git log
Run Code Online (Sandbox Code Playgroud)

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

git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
Run Code Online (Sandbox Code Playgroud)

现在您有了一个按照您想要的方式创建的新分支。

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

git checkout the_errant_branch
git log
Run Code Online (Sandbox Code Playgroud)

复制您需要拉入良好分支的一次提交的提交哈希并退出 git 日志。

git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
Run Code Online (Sandbox Code Playgroud)

拍拍自己的背。

  • 这真是一个非常好的答案。我很高兴我这样做了,而不是挑选提交或操作远程分支。 (2认同)

归档时间:

查看次数:

286189 次

最近记录:

6 年,4 月 前