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

时间:2012-02-15 21:33:52

标签: git

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

5 个答案:

答案 0 :(得分:642)

如果您还没有推送到原点,可以使用以下命令将分支重置为upstream分支:

git checkout mybranch
git reset --hard origin/mybranch

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

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

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


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

答案 1 :(得分:13)

假设发生了这种情况:

# 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)。

答案 2 :(得分:6)

我在服务器上有一个私人仓库,并定期对其进行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))是当前分支的上游。

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

  

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

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

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

强制性警告:如果您正在处理公共存储库,则其他人的工作基于此工作,您需要此别名you are doing it wrong™

答案 3 :(得分:3)

有一种更简单的方法:

git reset --hard @{u}

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

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

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

无论您当前在哪个分支上都可以使用。

答案 4 :(得分:0)

我尝试了此操作,但它没有将当前分支重置为最新的远程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

成功了