需要将git分支重置为原始版本

Bra*_*man 392 git

我不小心在一个分支机构工作,我不应该有一段时间,所以我分支它给它适当的名称.现在我想要覆盖我不应该使用origin(github)版本的分支.是否有捷径可寻?我尝试删除分支然后重置跟踪分支,但它只是给了我我正在处理的版本.

Von*_*onC 734

如果尚未推送到原点,可以使用以下命令将分支重置为上游分支:

git checkout mybranch
git reset --hard origin/mybranch
Run Code Online (Sandbox Code Playgroud)

(确保您在单独的分支中引用最新的提交,就像您在问题中提到的那样)

请注意,重置之后mybranch@{1},在重置之前引用旧提交.

但是,如果您已经推送过,请参阅" 创建git分支,并将原始状态恢复到上游状态 "以获取其他选项.


正如Brad Herman评论的那样,git switch删除任何新文件或将修改后的文件重置为HEAD.

实际上,为了确保从一个"干净的平板"开始,git switch -C mybranch origin/mybranch重置之后将确保一个工作树与刚重置的分支完全相同.


这篇博文建议了这些别名(git reset --hard仅限分支,但您可以调整/扩展这些别名):

C:\Users\vonc\git\git>git switch -C master origin/master
Reset branch 'master'
Branch 'master' set up to track remote branch 'master' from 'origin'.
Your branch is up to date with 'origin/master'.
Run Code Online (Sandbox Code Playgroud)

然后你可以输入:

[alias]
   resetorigin = !git fetch origin && git reset --hard origin/master && git clean -f -d
   resetupstream = !git fetch upstream && git reset --hard upstream/master && git clean -f -d
Run Code Online (Sandbox Code Playgroud)

要么

git resetupstream
Run Code Online (Sandbox Code Playgroud)

  • 这将删除UNSTAGED/STAGED更改(来自--hard) (24认同)
  • 我多次使用`git reset --hard origin/mybranch`命令时,我不关心任何局部更改,只是想要一个与原点匹配的干净副本.然而,今天,这不起作用 - 我仍然有一些新的,未上传的文件,并且git一直向我保证它是在HEAD.关于`git clean -f -d`的说明通过擦除我不想要的所有新文件来修复. (4认同)
  • 伟大的!我也多次使用 `git reset --hard HEAD` 来恢复到以前的提交,忽略任何更改 (2认同)

小智 16

假设发生了这种情况:

# on branch master
vi buggy.py                 # you edit file
git add buggy.py            # stage file
git commit -m "Fix the bug" # commit
vi tests.py                 # edit another file but do not commit yet
Run Code Online (Sandbox Code Playgroud)

然后你意识到你在错误的分支上进行了更改.

git checkout -b mybranch    # you create the correct branch and switch to it
Run Code Online (Sandbox Code Playgroud)

master仍然指出你的承诺.你希望它指向它之前指向的位置.

最简单的方法是:

git branch --force master origin/master
Run Code Online (Sandbox Code Playgroud)

另一种方式是:

git checkout master
git reset --soft origin/master
git checkout mybranch
Run Code Online (Sandbox Code Playgroud)

请注意,使用reset --hard会导致您的未提交更改丢失(tests.py在我的示例中).


Sim*_*eSi 16

我尝试了这个,但它没有将我当前的分支重置到我的远程 github 最新版本。我用谷歌搜索并发现 https://itsyndicate.org/blog/how-to-use-git-force-pull-properly/

这建议

git fetch origin master
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)

我想重置我的 v8 分支,所以我这么做了

git fetch origin v8
git reset --hard origin/v8
Run Code Online (Sandbox Code Playgroud)

它起作用了


小智 16

有一种稍微简单的方法可以做到这一点:

git reset --hard @{u}
Run Code Online (Sandbox Code Playgroud)

@{u}是任何跟踪分支的快捷方式,因此如果您打开master并且跟踪origin/master,则@{u}指向origin/master.

使用它的好处是您不必记住(或输入)跟踪分支的全名。您还可以创建别名:

git-reset-origin="git reset --hard @{u}"
Run Code Online (Sandbox Code Playgroud)

无论您当前所在的分支如何,这都将起作用。

  • 请注意,在 powershell 中,您需要转义 `{u}`,因此完整命令将类似于 `git reset --hard "@{u}"` (2认同)
  • 谢谢你!现在我知道它存在,我发现它记录在 https://git-scm.com/docs/gitrevisions 中 (2认同)

Der*_*anu 7

我在服务器上有一个私人仓库,并定期对它进行rebase/force-push,这使得有必要经常重置我的另一台计算机上的本地分支.因此,我创建了以下别名"catchup",它允许为当前分支执行此操作.与其他答案不同,此别名中没有硬编码分支名称.

紧紧抓住.

[alias]
  catchup = "!f(){ echo -n \"reset \\033[0;33m$(git symbolic-ref -q --short HEAD)\\033[0m to \\033[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))\\033[0m? (Y/n) \"; read -r ans; if [ \"$ans\" = \"y\" -o \"$ans\" = \"Y\" -o -z \"$ans\" ]; then git reset --hard $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)); else echo \"catchup aborted\"; fi }; f"
Run Code Online (Sandbox Code Playgroud)

格式正确(不适用于.gitconfig中的换行符),它看起来像这样:

"
!f(){
  echo -n \"reset \\033[0;33m$(git symbolic-ref -q --short HEAD)\\033[0m to \\033[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))\\033[0m? (Y/n) \";
  read -r ans;
  if [ \"$ans\" = \"y\" -o \"$ans\" = \"Y\" -o -z \"$ans\" ]; then
    git reset --hard $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD));
  else
    echo \"catchup aborted\";
  fi
}; f
"
Run Code Online (Sandbox Code Playgroud)
  • \\033[0;33m\\033[0m是用于强调当前分支和上游的颜色.
  • $(git symbolic-ref -q --short HEAD) 是当前的分支名称
  • $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)) 是当前分支的上游.

由于重置是一个潜在的危险调用(特别是使用--hard选项,您将丢失任何未提交的更改),它首先会告诉您它将要执行的操作.例如,如果您使用远程调用qcpp/dev-container的分支dev 容器并输入git catchup,则会提示您:

将dev-container重置为qcpp/dev-container?(Y/N)

如果您输入y或只是按回车键,它将执行重置.如果输入任何其他内容,则不会执行重置.

如果你想要超级安全并且以编程方式防止丢失未分级/未提交的更改,你可以通过对diff-index进行相应的检查来进一步使用上述别名.

强制性警告:如果您正在使用公共存储库,其他人已经开始工作,并且您需要这个别名,那么您做错了.