需要重置git分支到原始版本

我不小心在一个我不应该有一段时间的分支上工作,所以我给它起了一个合适的名字。现在我想覆盖的分支,我不应该从原来的版本(github)。有什么简单的方法吗?我尝试删除分支,然后重新设置跟踪分支,但它只是给了我我正在工作的版本。

841245 次浏览

如果你还没有推到原点,你可以重置你的分支到上游分支:

git checkout mybranch
git reset --hard origin/mybranch

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

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

但如果您已经按了,请参阅“创建git分支,并将原始状态恢复到上游状态”以获得其他选项。


对于Git 2.23(2019年8月),这将是一个命令:<强> # EYZ0 < / >强 即:# EYZ1 < / p >

例子

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一样。


正如布拉德·赫尔曼所评论的,reset --hard将会是删除任何新文件或将修改后的文件重置到HEAD

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


博客建议使用这些别名(仅适用于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

我在一台服务器上有一个私人回购,并定期对其进行rebase/强制推送,这使得有必要经常在我的另一台计算机上重置本地分支。因此,我创建了以下别名“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,你会被提示:

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

如果你输入y或者直接点击返回,它就会执行重置。如果您输入任何其他内容,重置将不会进行。

如果您想要超级安全,并通过编程方式防止丢失非暂存/未提交的更改,您可以使用根据diff-index检查进一步改进上述别名。

必须警告一句:如果您正在一个公共存储库上工作,而其他人的工作都基于这个公共存储库,那么您需要这个别名你做错了™

假设事情是这样的:

# 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最新。 我谷歌了一下,找到了 # EYZ0 < / p >

这建议

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}"

不管你现在在哪个分支上,它都可以工作。