我不小心在一个分支机构工作,我不应该有一段时间,所以我分支它给它适当的名称.现在我想要覆盖我不应该使用origin(github)版本的分支.是否有捷径可寻?我尝试删除分支然后重置跟踪分支,但它只是给了我我正在处理的版本.
Von*_*onC 734
如果尚未推送到原点,可以使用以下命令将分支重置为上游分支:
git checkout mybranch
git reset --hard origin/mybranch
Run Code Online (Sandbox Code Playgroud)
(确保您在单独的分支中引用最新的提交,就像您在问题中提到的那样)
请注意,重置之后mybranch@{1},在重置之前引用旧提交.
但是,如果您已经推送过,请参阅" 创建git分支,并将原始状态恢复到上游状态 "以获取其他选项.
正如Brad Herman评论的那样,git switch会删除任何新文件或将修改后的文件重置为HEAD.
实际上,为了确保从一个"干净的平板"开始,git switch -C mybranch origin/mybranch重置之后将确保一个工作树与刚重置的分支完全相同.
这篇博文建议了这些别名(git reset --hard仅限分支,但您可以调整/扩展这些别名):
Run Code Online (Sandbox Code Playgroud)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'.然后你可以输入:
Run Code Online (Sandbox Code Playgroud)[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要么
Run Code Online (Sandbox Code Playgroud)git resetupstream
小智 16
假设发生了这种情况:
# 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
Run Code Online (Sandbox Code Playgroud)
然后你意识到你在错误的分支上进行了更改.
git checkout -b mybranch # you create the correct branch and switch to it
Run Code Online (Sandbox Code Playgroud)
但master仍然指出你的承诺.你希望它指向它之前指向的位置.
最简单的方法是:
git branch --force master origin/master
Run Code Online (Sandbox Code Playgroud)
另一种方式是:
git checkout master
git reset --soft origin/master
git checkout mybranch
Run Code Online (Sandbox Code Playgroud)
请注意,使用reset --hard会导致您的未提交更改丢失(tests.py在我的示例中).
Sim*_*eSi 16
我尝试了这个,但它没有将我当前的分支重置到我的远程 github 最新版本。我用谷歌搜索并发现 https://itsyndicate.org/blog/how-to-use-git-force-pull-properly/
这建议
git fetch origin master
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)
我想重置我的 v8 分支,所以我这么做了
git fetch origin v8
git reset --hard origin/v8
Run Code Online (Sandbox Code Playgroud)
它起作用了
小智 16
有一种稍微简单的方法可以做到这一点:
git reset --hard @{u}
Run Code Online (Sandbox Code Playgroud)
@{u}是任何跟踪分支的快捷方式,因此如果您打开master并且跟踪origin/master,则@{u}指向origin/master.
使用它的好处是您不必记住(或输入)跟踪分支的全名。您还可以创建别名:
git-reset-origin="git reset --hard @{u}"
Run Code Online (Sandbox Code Playgroud)
无论您当前所在的分支如何,这都将起作用。
我在服务器上有一个私人仓库,并定期对它进行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"
Run Code Online (Sandbox Code Playgroud)
格式正确(不适用于.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
"
Run Code Online (Sandbox Code Playgroud)
\\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 容器并输入git catchup,则会提示您:
将dev-container重置为qcpp/dev-container?(Y/N)
如果您输入y或只是按回车键,它将执行重置.如果输入任何其他内容,则不会执行重置.
如果你想要超级安全并且以编程方式防止丢失未分级/未提交的更改,你可以通过对diff-index进行相应的检查来进一步使用上述别名.
强制性警告:如果您正在使用公共存储库,其他人已经开始工作,并且您需要这个别名,那么您做错了.
| 归档时间: |
|
| 查看次数: |
403484 次 |
| 最近记录: |