需要将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
"
  • 33[0;33m33[0m用于强调当前的分支和上游的颜色。
  • $(git symbolic-ref -q --short HEAD)是当前分支名称
  • $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))是当前分支的上游。
  • 由于重置是一个潜在的危险呼叫(特别是使用--hard选项,您将失去任何未提交的更改),因此首先会告诉您要执行的操作。 例如,如果你使用名为qcpp / dev-container的远程分支开发容器,并且你输入git catchup ,你将会被提示:

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

    如果您然后键入y或只是返回,它将执行重置。 如果输入其他内容,则不执行重置。

    如果您希望超级安全并以编程方式防止丢失未处理/未提交的更改,则可以通过对diff-index进行检查来进一步修饰上述别名。

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

    链接地址: http://www.djcxy.com/p/26243.html

    上一篇: Need to reset git branch to origin version

    下一篇: How to reset Git repo to HEAD?