将远程重置为某个提交

nac*_*o4d 638 git

我想丢弃提交后完成的所有更改<commit-hash>.所以我做了:

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

现在我想对我的遥控器做同样的事情.我怎样才能做到这一点?之后我做了一些提交(并推送)<commit-hash>,我只想丢弃它们.只是在某种程度上出现了严重的错误,我不想让它变得更糟.(

我基本上要退我origin/master<commit-hash>

Mar*_*air 1124

假设您的分支master在此处和远程调用,并且您的远程调用origin您可以执行以下操作:

 git reset --hard <commit-hash>
 git push -f origin master
Run Code Online (Sandbox Code Playgroud)

但是,如果其他人正在使用您的远程存储库并已撤消您的更改,则应避免执行此操作.在这种情况下,最好还原您不想要的提交,然后正常推送.

更新:您已经在下面解释过,其他人已经推动了您推送的更改,因此最好创建一个新的提交,以恢复所有这些更改.在JakubNarębski的回答中,您可以选择这样做.哪一个最方便取决于您想要还原的提交数量,以及哪种方法对您最有意义.

由于您的问题很明显,您已经习惯git reset --hard重置master分支,因此您可能需要git reset --hard ORIG_HEAD先将分支移回原来的位置.(与往常一样git reset --hard,确保它git status是干净的,你是在正确的分支上,并且你知道git reflog作为恢复明显丢失的提交的工具.)你还应该检查ORIG_HEAD点到正确的提交,用git show ORIG_HEAD.

  • 危险危险:此重置假定当前已检出相应的(_tracking_)分支_and_您没有要保留的未提交的更改.**使用`git update-ref`代替`reset --hard`**; 它将允许您在没有工作树/签出分支的情况下执行相同操作 (20认同)
  • 我知道了.它已被其他人推动和改变.所以我应该使用`revert`但是我想说我想恢复过去的4次提交所以我应该做`git revert comit1; git push; git revert comit2; git push; ...`或者只是`git revert commit4; git push`? (3认同)

Wal*_*alf 112

如果您不介意丢失本地更改,请使用其他答案.如果您选择错误的提交哈希返回,此方法仍然可以破坏您的远程.

如果您只想使远程匹配成为已在本地分支中的提交:

  1. 千万不能做任何复位.
  2. 使用git log找到你想要的遥远,在提交的哈希值.git log -p看到变化,或git log --graph --all --oneline --decorate看到一个紧凑的树.(将最后一个作为shell中的别名非常方便.)
  3. 复制哈希.
  4. 运行如下命令:

    git push --force <remote> <commit-ish>:<the remote branch>
    
    Run Code Online (Sandbox Code Playgroud)

    例如

    git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
    
    Run Code Online (Sandbox Code Playgroud)

  • 这个图是一个非常好的提示,我只是添加了-5来获得最后的n次提交,这是一棵巨大的树.同样避免重置正是我所寻求的.大 (3认同)
  • 在 Windows 上,输入 `q` 退出 git 日志。2分钟,我再也回不去了。 (2认同)

Ibr*_*tov 60

我用这个命令解决了你的问题:

git reset --hard <commit-hash> 
git push -f <remote> <local branch>:<remote branch> 
Run Code Online (Sandbox Code Playgroud)


小智 17

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

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

就是这样。


Ble*_*ing 11

假设您的分支在本地和远程都称为masterremote ,并且您的分支称为origin,您可以执行以下操作:

git reflog要获取所有提交历史记录,您的commit hash格式如下:e34e1ff

git reset --hard <commit-hash>

git push -f origin master
Run Code Online (Sandbox Code Playgroud)


dud*_*aus 10

在GitLab上,您可能必须先将分支设置为不受保护的状态。您可以在[repo]>设置>存储库>受保护的分支中执行此操作。然后,马克回答的方法起作用。

git reset --hard <commit-hash>
git push -f origin master
Run Code Online (Sandbox Code Playgroud)


pri*_*her 7

如果您想要文件的早期版本,建议使用git checkout。

git checkout <commit-hash>
Run Code Online (Sandbox Code Playgroud)

这样做将使您及时返回,不会影响您项目的当前状态,您可以进入主线git checkout mainline

但是,当您在自变量中添加文件时,该文件会从前一个时间带回到您当前的项目时间,即,您当前的项目已更改,需要提交。

git checkout <commit-hash> -- file_name
git add .
git commit -m 'file brought from previous time'
git push
Run Code Online (Sandbox Code Playgroud)

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

在此处查看更多信息https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout


bad*_*hop 6

我对前一个答案的两分钱:如果

git push --force <remote> <the-hash>:<the remote branch>
Run Code Online (Sandbox Code Playgroud)

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

[receive]
  #denyNonFastforwards = true
  denyNonFastforwards = false
Run Code Online (Sandbox Code Playgroud)