【问题标题】:Need to reset git branch to origin version需要将 git 分支重置为原始版本
【发布时间】:2012-03-07 06:58:16
【问题描述】:

我不小心在一个我不应该有一段时间的分支上工作,所以我将其分支出来,给它取了合适的名字。现在我想将我不应该使用的分支覆盖到来自 origin (github) 的版本。是否有捷径可寻?我尝试删除分支,然后重新设置跟踪分支,但它只是给了我正在处理的版本。

【问题讨论】:

标签: git


【解决方案1】:

有一个更简单的方法来做到这一点:

git reset --hard @{u}

@{u} 是您的跟踪分支的快捷方式,因此如果您在 master 上并且跟踪 origin/master@{u} 指向 origin/master

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

git-reset-origin="git reset --hard @{u}"

无论您当前所在的分支如何,它都可以使用。

【讨论】:

  • 注意,在 powershell 中你需要转义 {u} 所以完整的命令类似于 git reset --hard "@{u}"
  • 我的生活因此变得更好
  • 谢谢!现在我知道它存在,我发现它记录在git-scm.com/docs/gitrevisions
【解决方案2】:

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

建议

git fetch origin master
git reset --hard origin/master

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

git fetch origin v8
git reset --hard origin/v8

成功了

【讨论】:

  • 好吧,你提到 fetch 很好。我没有这样做一次,并将所有内容重置为 2 年前:)
【解决方案3】:

如果您还没有推送到原点,您可以将您的分支重置为upstream 分支:

git checkout mybranch
git reset --hard origin/mybranch

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

请注意,在重置之后,mybranch@{1} 指的是重置之前的旧提交。

但如果您已经推送,请参阅“Create git branch, and revert original to upstream state”了解其他选项。


使用 Git 2.23(2019 年 8 月),这将是一个命令:git switch
即:git switch -C mybranch origin/mybranch

例子

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'.

这会恢复索引和工作树,就像 git reset --hard 那样。


正如Brad Herman 所评论的,reset --hard删除任何新文件或将修改后的文件重置为 HEAD

实际上,为了确保您从“干净的状态”开始,重置后的git clean -f -d 将确保工作树完全与您刚刚重置到的分支相同。


blog post 建议使用这些别名(仅适用于 master 分支,但您可以调整/扩展这些别名):

[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

然后你可以输入:

git resetupstream

git resetorigin

【讨论】:

  • 这将删除未分级/分级更改(来自 --hard)
  • 我已经多次使用git reset --hard origin/mybranch 命令,当时我并不关心任何本地更改,只是想要一个与原点匹配的干净副本。然而,今天,这不起作用——我仍然有一些新的、未暂存的文件,而 git 一直向我保证它在 HEAD。关于git clean -f -d 的注释通过清除所有我不想要的新文件来解决这个问题。
  • @MatthewClark 这是预期的:请参阅stackoverflow.com/q/4327708/6309的评论
  • 太棒了!我也多次使用git reset --hard HEAD 恢复到以前的提交,忽略任何更改
  • sourctree 也可以吗?
【解决方案4】:

假设发生了这样的事情:

# 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

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

git checkout -b mybranch    # you create the correct branch and switch to it

master 仍然指向您的提交。您希望它指向它之前指向的位置。

解决方案

最简单的方法是:

git branch --force master origin/master

另一种方式是:

git checkout master
git reset --soft origin/master
git checkout mybranch

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

【讨论】:

  • 这似乎比我的回答更安全 ;) +1
【解决方案5】:

我在服务器上有一个私人仓库,并定期对其进行 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"

格式正确(不适用于 .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
"
  • \\033[0;33m\\033[0m 用于用颜色强调当前分支和上游。
  • $(git symbolic-ref -q --short HEAD) 是当前分支名称
  • $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)) 是当前分支的上游。

由于 reset 是一个潜在的危险调用(尤其是使用 --hard 选项,您将丢失任何未提交的更改),它首先告诉您它将要做什么。例如,如果您在分支 dev-container 上,远程调用 qcpp/dev-container 并输入 git catchup,系统会提示您:

将开发容器重置为 qcpp/开发容器? (是/否)

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

如果您想要超级安全并以编程方式防止丢失未暂存/未提交的更改,您可以使用according checks for diff-index 进一步对上述别名进行拉皮条。

警告:如果您在其他人基于其工作的公共存储库上工作,并且您需要此别名,you are doing it wrong™

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2015-02-11
    • 2019-07-17
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多