需要将git分支重置为原始版本
我意外地在一个我本不该去的地方工作,所以我分出了它,给它一个合适的名字。 现在我想覆盖我原本不应该从源(github)版本的分支。 是否有捷径可寻? 我尝试删除分支,然后重新设置跟踪分支,但它只是给我我正在处理的版本。
如果您尚未推送至原产地,则可以使用以下命令将分支重置为上游分支:
git checkout mybranch
git reset --hard origin/mybranch
(确保你在一个单独的分支中引用你最近的提交,就像你在你的问题中提到的那样)
请注意,在重置之后, mybranch@{1}
在重置之前引用旧的提交。
但是如果你已经推动了,请参阅“创建git分支,并将原始状态恢复为上游状态”以获取其他选项。
正如Brad Herman评论的那样, 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
假设这是发生的事情:
# 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 33[0;33m$(git symbolic-ref -q --short HEAD) 33[0m to 33[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)) 33[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 33[0;33m$(git symbolic-ref -q --short HEAD) 33[0m to 33[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)) 33[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
"