将远程重置为某个提交

我想丢弃提交<commit-hash>后所做的所有更改。我做到了:

git reset --hard <commit-hash>

现在我想对我的遥控器做同样的事情。我该怎么做?我在<commit-hash>之后做了一些提交(和推送),我只想把它们全部丢弃。只是非常的方式出错了,我不想让它变得更糟。;(

我基本上想把我的origin/master倒带到<commit-hash>

883849 次浏览

假设您的分支在这里和远程都称为master,并且您的远程称为origin,您可以这样做:

 git reset --hard <commit-hash>git push -f origin master

但是,如果其他人正在使用您的远程存储库并提取了您的更改,您应该避免这样做。在这种情况下,最好将您不想要的提交恢复,然后正常推送。

更新时间:您已经在下面解释了其他人已经取消了您推送的更改,所以是最好创建一个新的提交来恢复所有这些更改。在来自Jakub Narbski的回答中对您执行此操作的选项有一个很好的解释。哪一个最方便取决于您想要恢复多少提交,哪种方法对您最有意义。

因为从你的问题很明显,你已经使用git reset --hard来重置你的master分支,你可能需要从使用git reset --hard ORIG_HEAD开始将你的分支移回以前的位置。(和git reset --hard一样,确保git status是干净的,你在正确的分支上,你知道git reflog是恢复明显丢失的提交的工具。)你还应该检查ORIG_HEAD指向正确的提交,git show ORIG_HEAD

解决方法:

如果您收到类似“![远程拒绝]a60f7d85->master(预接收钩子拒绝)”的消息

然后您必须允许重写特定分支的分支历史记录。例如,在BitBucket中,它说“不允许重写分支历史记录”。有一个名为Allow rewriting branch history的复选框,您必须检查它。

我通过以下命令解决了像您这样的问题:

git reset --hard <commit-hash>git push -f <remote> <local branch>:<remote branch>

使用其他一些答案可能会导致不必要的局部状态丢失。更改远程并不必然需要本地更改。如果您选择错误的提交返回,此方法仍然可以破坏您的远程,但即使这样,您通常也可以找到正确的提交并重试。

必须在您希望远程匹配的本地存储库中的某个地方具有所需的提交。

  1. 没有做任何重置。
  2. 使用git log查找您希望远程执行的提交。使用git log -p查看更改,或使用git log --graph --all --oneline --decorate查看紧凑树。
  3. 复制提交的哈希、标签或(如果是提示)其分支名称。
  4. 运行如下命令:
    git push --force <remote> <commit-ish>:<the remote branch>
    e. g.
    git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
    git push --force staging v2.4.0b2:releases

如果强制推送失败,它可能被远程禁用。这可以通过临时更改#0和#1中的一个或两个来解决。如果您的远程托管在没有shell访问权限的服务上,它可能有您可以更改以允许强制推送的设置。


我使用一个方便的别名(git go)来查看历史记录,如步骤2所示,可以像这样添加:

git config --global alias.go 'log --graph --all --decorate --oneline'

我的两分钱给前面的答案:如果

git push --force <remote> <the-hash>:<the remote branch>

仍然不起作用,您可能想要编辑<your-remote-repo>.git/config文件的接收部分:

[receive]#denyNonFastforwards = truedenyNonFastforwards = false

如果您想要以前版本的文件,我建议使用git签出。

git checkout <commit-hash>

这样做会把你及时送回去,不影响你项目的当前状态,你可以来主线git检查主线

但是当您在参数中添加文件时,该文件会返回给您从以前的时间到您当前的项目时间,即您当前的项目已更改并需要提交。

git checkout <commit-hash> -- file_namegit add .git commit -m 'file brought from previous time'git push

这样做的好处是它不会删除历史记录,也不会恢复特定的代码更改(git恢复)

查看更多https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout

做一件事,获取提交的SHA号。例如87c9808,然后,

  1. 移动自己,即你的头到指定的提交(通过做//在这里提到你的号码)
  2. 接下来在随机文件中进行一些更改,以便git会要求您在本地提交,然后远程提交因此,你现在需要做的是。应用更改后#尝试提交#尝试提交
  3. 现在推送以下提交(如果已在本地提交)由git推送源主机
  4. 现在git会向你要求的是

错误:未能将一些裁判推送到'https://github.com/YOURREPOSITORY/AndroidExperiments.git'提示:更新被拒绝,因为您当前分支的尖端落后提示:它的远程对应物。集成远程更改(例如:提示:'git拉…')然后再推。**

  1. 因此现在你能做的就是

git push --force origin master

  1. 因此,我希望它能起作用:)

在GitLab上,在执行此操作之前,您可能必须将您的分支设置为不受保护。您可以在[repo]>设置>存储库>受保护的分支中执行此操作。然后Mark的答案中的方法有效。

git reset --hard <commit-hash>git push -f origin master

如果您的分支不是开发或生产,最简单的方法是在本地重置到某个提交并从那里创建一个新分支。您可以使用:

git检出000000

(其中000000是您要去的提交ID)在有问题的分支中,然后简单地创建一个新分支:

git远程添加[name_of_your_remote]

然后你可以创建一个新的公关,一切都会好起来的!

Sourcetree:将远程重置为某个提交

  1. 如果您将错误提交推送到您的远程(源/功能/1337_MyAwesomeFeature),如下图所示

转到删除

  1. 转到备注>来源>功能>1337_MyAwesomeFeature
  2. 右键单击并选择“删除来源/功能/1337_MyAwesomeFeature”(如果您想要备份并跳过步骤4,请更改其名称)。
  3. 点击“强制删除”和“确定”。

在此处输入图片描述输入图片描述

  1. 选择旧的提交并选择“重置当前分支到此提交”
  2. 选择您想要的模式(如果您不想要上次更改,则很难)和“确定”。

在此处输入图片描述输入图片描述

  1. 将此提交推送到新的来源/功能/1337_MyAwesomeFeature输入图片描述

  2. 您的本地功能分支和远程功能分支现在位于上一个(您选择的)提交上输入图片描述

让我们假设您的分支在本地和远程都被称为大师,而您的remote被称为起源,您可以这样做:

git reflog获取所有的提交历史,你的commit hash有这样的格式:e34e1ff

git reset --hard <commit-hash>
git push -f origin master

我最近遇到了同样的问题,它通过两个步骤得到了解决:

  1. 使用git reset --hard HEAD~1将其重置为本地git,这里HEAD~1是最近的提交。
  2. 将其强行推入所需的分支git push -f origin main

就这样了。