我不小心在一个分支上工作,我不应该这么做一段时间,所以我给它分了一个适当的名字。现在我想要覆盖我不应该使用origin(github)版本的分支。是否有捷径可寻?我尝试删除分支然后重置跟踪分支,但它只是给了我我正在处理的版本。
答案 0 :(得分:642)
如果您还没有推送到原点,可以使用以下命令将分支重置为upstream分支:
git checkout mybranch
git reset --hard origin/mybranch
(确保您在单独的分支中引用最新的提交,就像您在问题中提到的那样)
请注意,在重置之后,mybranch@{1}
在重置之前引用旧提交。
但如果你已经推过,请参阅“Create git branch, and revert original to upstream state”了解其他选项。
由Brad Herman评论,reset --hard
会删除任何新文件或将修改后的文件重置为HEAD 。
实际上,为了确保从“干净的平板”开始,重置后的git clean -f -d
将确保工作树完全与您刚重置的分支完全相同。
此blog post表示这些别名(仅适用于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
答案 1 :(得分:13)
假设发生了这种情况:
# 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
)。
答案 2 :(得分:6)
我在服务器上有一个私人仓库,并定期对其进行rebase / force-push,这使得有必要经常重置我的另一台计算机上的本地分支。因此,我创建了以下别名" 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))
是当前分支的上游。由于重置是一个潜在危险的调用(特别是使用--hard选项,您将丢失任何未提交的更改),它首先会告诉您它将要执行的操作。例如,如果您使用名为 qcpp / dev-container 的远程分支 dev-container 并输入git catchup
,那么您将成为提示:
将dev-container重置为qcpp / dev-container? (Y / N)
如果您输入y或只是按回车键,它将执行重置。如果您输入任何其他内容,则不会执行重置。
如果您想要超级安全并且以编程方式防止丢失未暂停/未提交的更改,您可以使用according checks for diff-index进一步使用上述别名。
强制性警告:如果您正在处理公共存储库,则其他人的工作基于此工作,您需要此别名you are doing it wrong™。
答案 3 :(得分:3)
有一种更简单的方法:
git reset --hard @{u}
@{u}
是任何跟踪分支的快捷方式,因此,如果您在master
上并且跟踪origin/master
,则@{u}
指向origin/master
使用此功能的好处是您不必记住(或键入)跟踪分支的全名。您还可以创建别名:
git-reset-origin="git reset --hard @{u}"
无论您当前在哪个分支上都可以使用。
答案 4 :(得分:0)
我尝试了此操作,但它没有将当前分支重置为最新的远程github。 我用谷歌搜索发现 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
成功了