Answers:
如果尚未推送到原始位置,则可以使用以下命令将分支重置为上游分支:
git checkout mybranch
git reset --hard origin/mybranch
(确保像在问题中提到的那样,在另一个分支中引用最新提交)
请注意,在重置之后,mybranch@{1}
即指旧提交,而在重置之前。
但是,如果您已经推送过,请参阅“ 创建git分支,并将原始还原到上游状态 ”以获取其他选项。
使用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所说,a reset --hard
将删除任何新文件或将修改后的文件重置为HEAD。
实际上,为确保您从“干净的状态”开始,git clean -f -d
重置后的a将确保工作树与您刚刚重置到的分支完全相同。
这篇博客文章建议使用这些别名(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
git reset --hard origin/mybranch
当我不在乎任何本地更改时,我只使用了几次命令,只想要一个与原点匹配的干净副本。但是,今天,此操作不起作用-我仍然有一些新的未暂存文件,而git一直向我保证它位于HEAD。关于该说明git clean -f -d
固定由擦拭了所有的新文件,我不想。
git reset --hard HEAD
恢复到先前的提交,而忽略了任何更改
假设这是发生了什么:
# 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
在我的示例中)。
我在服务器上有一个专用存储库,并定期对其进行变基/强制推送,这使得有必要经常重置其他计算机上的本地分支。因此,我创建了以下别名“ 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选项,因此您将丢失所有未提交的更改),因此它首先会告诉您它将要做什么。例如,如果您位于带有远程调用qcpp / dev-container的分支dev-container上,并且输入,则会提示您:git catchup
将dev-container重置为qcpp / dev-container?(是/否)
如果您随后键入y或仅按回车键,它将执行重置。如果您输入其他任何内容,将不会执行重置。
如果您想超级安全并以编程方式防止丢失未分阶段/未提交的更改,则可以通过对diff-index进行相应检查来进一步拉起上述别名。
强制性的警告是:如果您正在使用其他人所基于的公共存储库,并且需要此别名,那么您做错了™。
我尝试了此操作,但它没有将当前分支重置为最新的远程github。我用Google搜索并找到了 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
而且有效