需要重新设置git分支到原始版本

我不小心在一个分支上工作了一段时间,所以我分出了一个合适的名字。 现在我想覆盖我不应该从原来的版本(github)的分支。 是否有捷径可寻? 我试图删除分支,然后重新设置跟踪分支,但它只是给我我再次工作的版本。

如果您还没有推送到原点,可以使用以下命令将分支重置为上游分支:

git checkout mybranch git reset --hard origin/mybranch 

(确保你在一个单独的分支中引用你最近的提交,就像你在你的问题中提到的那样)

请注意,在重置之后, mybranch@{1}在重置之前引用旧的提交。

但是,如果你已经推动了,请参阅“ 创buildgit分支,并将原始状态还原为上游状态 ”以获取其他选项。


正如布拉德·赫尔曼 ( Brad Herman)评论的那样,一个reset --hard删除任何新文件或者将修改后的文件重置为HEAD

实际上,为了确保从“清理板块”开始,重置后的git clean -f -d将确保工作树与刚刚重置的分支完全相同


这个博客文章build议这些别名(仅适用于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 

然后你可以input:

 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 )。

我有一个服务器上的私人回购,并定期重新推动/强制推动它,这使得有必要经常重置我的另一台计算机上的本地分支。 因此,我创build了以下别名“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 /开发容器 ,你进入git catchup ,你会被提示:

重置dev-container到qcpp / dev-container? (Y / N)

如果你inputy或者只是打回车,它将执行重置。 如果input其他内容,则不执行重置。

如果你想超级安全,并以编程方式防止丢失unstaged /未提交的更改,可以进一步皮条客上面的别名与检查diff-index 。

警告的强制性措辞:如果您正在公共存储库中工作,其他人已经开始工作,并且您需要这个别名, 您做错了 。