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