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

需要将git分支重置为原始版本,git,Git,我无意中在一个分支上工作,我本不应该在那里工作一段时间,所以我给它取了一个合适的名字。现在我想覆盖我不应该在源代码版本(github)上的分支。有没有一个简单的方法可以做到这一点?我尝试删除分支,然后重新设置跟踪分支,但它只提供了我正在重新处理的版本。如果您尚未推送到原点,可以使用以下命令将分支重置为分支: git checkout mybranch git reset --hard origin/mybranch (确保您在单独的分支中引用了最新的提交,就像您在问题中提到的那样) 请注意,就

我无意中在一个分支上工作,我本不应该在那里工作一段时间,所以我给它取了一个合适的名字。现在我想覆盖我不应该在源代码版本(github)上的分支。有没有一个简单的方法可以做到这一点?我尝试删除分支,然后重新设置跟踪分支,但它只提供了我正在重新处理的版本。

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

git checkout mybranch
git reset --hard origin/mybranch
(确保您在单独的分支中引用了最新的提交,就像您在问题中提到的那样)

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

但如果您已经按下,请参阅“”以了解其他选项


使用Git 2.23(2019年8月),这将是一个命令:。
即:

范例

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重置一样——硬的


如所述,
重设--hard
删除任何新文件或将修改的文件重设为HEAD

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


这表明这些别名(仅适用于
master
分支,但您可以调整/扩展这些别名):

然后您可以键入:

git resetupstream

git resetorigin

我在一台服务器上有一个私有的回购协议,并定期对其重新设置基础/强制推送,这就需要经常在我的另一台计算机上重置本地分支。因此,我创建了以下别名“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——短头)
    是当前的分支名称
  • $(git for each ref--format='%(上游:short)$(git symbolic ref-q HEAD))
    是当前分支的上游
由于重置是一个潜在的危险调用(特别是使用--hard选项,您将丢失任何未提交的更改),因此它首先会告诉您将要执行的操作。例如,如果您使用名为qcpp/dev container的远程分支开发容器,并且您输入了
git catchup
,则会提示您:

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

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

如果您希望超级安全,并以编程方式防止丢失未老化/未提交的更改,则可以使用pimp进一步提升上述别名


强制性警告:如果您使用的是其他人使用的公共存储库,并且您需要此别名,。

假设发生了这种情况:

# 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

我尝试了此操作,但它没有将我的当前分支重置为我的远程github最新版本。 我在谷歌上搜索发现

这表明

git fetch origin master
git reset --hard origin/master
我想重置我的v8分支,所以我这么做了

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

它起作用了

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

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

使用此选项的优点是,您不必记住(或键入)跟踪分支的全名。您还可以创建别名:

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

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

这将删除未分级/暂存的更改(从--hard中)我曾多次使用过
git reset--hard origin/mybranch
命令,当时我不关心任何本地更改,只想要一个与源代码匹配的干净副本。但是,今天,这不起作用了--我仍然有一些新的、未老化的文件,git一直向我保证这是最重要的。关于
git clean-f-d的注释
通过清除我不想要的所有新文件来修复此问题。@MatthewClark这是意料之中的:请参阅关于Great的评论!我还多次使用
git reset--hard HEAD
还原到以前的提交,忽略任何更改sourctree也可能发生这种情况吗?这似乎比我的回答更安全;+1 git 2.23的可能重复(2019年8月):
git开关-C mybranch origin/mybranch
。很好,你提到fetch是件好事。我曾经这样做过,并将所有内容重置为2年前:)注意,在powershell中,你需要退出
{u}
,因此完整的命令类似于
git reset--hard“@{u}”
正因为如此,我的生活变得更好了
git-reset-origin="git reset --hard @{u}"