题 将本地存储库分支重置为远程存储库HEAD


如何将本地分支重置为远程存储库中的分支?

我做了:

git reset --hard HEAD

但是当我跑一个 git status

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
      modified:   java/com/mycompany/TestContacts.java
      modified:   java/com/mycompany/TestParser.java

你能告诉我为什么我有这些“修改过的”吗?我没有碰过这些文件?如果我这样做,我想删除它们。


2524
2017-10-27 00:27


起源


根据输出 git status 你的第二个命令 git reset --hard HEAD 失败。但是你没有粘贴它的输出。 →不完整的问题。 - Robert Siemer
您在这里混合了两个问题:1)如何将本地分支重置到远程所在的位置以及2)如何清除临时区域(可能还有工作目录),以便 git status说 nothing to commit, working directory clean。 - 请明确说明! - Robert Siemer
@RobertSiemer这正是我想要的。如何重置我的本地仓库就像远程仓库上的最后一次提交,但我也想清理我的本地仓库,我不想让我现在有的更改,也不在远程仓库中。我只是希望我的本地仓库与遥控器完全相同。你能告诉我怎么做吗? - Alex Ventura


答案:


将分支设置为与远程分支完全匹配可以分两步完成:

git fetch origin
git reset --hard origin/master

如果您想在执行此操作之前保存当前分支的状态(以防万一),您可以执行以下操作:

git commit -a -m "Saving my work, just in case"
git branch my-saved-work

现在你的工作被保存在“my-saved-work”分支上,以防你决定要它回来(或者想要稍后查看它或者将它与你更新的分支区分开来)。

请注意,第一个示例假定远程仓库的名称为“origin”,远程仓库中名为“master”的分支与本地仓库中当前已检出的分支匹配。

顺便说一下,你所处的这种情况看起来非常像一种常见的情况,即在非裸存储库的当前检出的分支中已经完成了推送。你最近是否进入了当地的仓库?如果没有,那么不用担心 - 其他必须导致这些文件意外地最终被修改。否则,您应该意识到不建议将其推入非裸存储库(而不是特别是当前已检出的分支)。


4474
2017-10-27 01:44



谢谢您的回答。你说'注意,第一个例子假设远程仓库的名称是“origin”,远程仓库中名为“master”的分支与本地仓库中的分支匹配。在执行'git reset --hard'之前,如何仔细检查我的远程仓库名称和我的分支名称?再次感谢。 - hap497
如果您没有明确命名遥控器,那么它的名称可能只是“origin”(默认值)。您可以使用“git remote”获取所有远程名称的列表。然后,您可以使用“git remote <name>”来查看哪些分支相互推/拉(例如,如果您的“主”分支是从名为“origin”的远程“master”克隆的,那么您将获得一行说“主人与远程主人合并”)。 - Dan Moulding
“不建议推入非裸存储库(而不是进入当前已检出的分支,特别是”为什么? - LeeGee
拿取后,我相信你能做到 git reset FETCH_HEAD --hard 相反,这也是一样的意思。 - Jean
太糟糕了,我只能投票一次。我已经达到了20次这样的确切答案。可能更多。 - frosty


我需要做(在接受的答案中的解决方案):

git fetch origin
git reset --hard origin/master

其次是:

git clean -f

删除本地文件

要查看将删除哪些文件(而不实际删除它们):

git clean -n -f

250
2017-12-27 06:20



也, git clean -d -f 如果存在未跟踪的目录。 - garg
也 git clean -fdx - Swapnil Kotwal
如果你想要远程分支的精确副本,你必须遵循git clean -ffdx。请注意,这是两个f。 - Trismegistos
该 git clean -f 是我需要的重要部分。谢谢! - dgo
小心使用clean命令。它可以从其他分支中删除被忽略的文件。 - mikoop


首先,重置为先前获取的 HEAD 对应的上游分支:

git reset --hard @{u}

指定的优点 @{u} 或其冗长的形式 @{upstream} 是不必显式指定远程仓库和分支的名称。

接下来,根据需要删除未跟踪的文件,也可以选择删除 -x

git clean -df

最后,根据需要,获取最新的更改:

git pull

119
2018-02-10 20:27



这似乎是一个比接受的更好的答案,因为它动态地重置到当前的上游分支而不是总是静态的分支,如 origin/master - Jon z


git reset --hard HEAD 实际上只重置到最后一个提交状态。在这种情况下,HEAD指的是您的分支的HEAD。

如果你有几个提交,这将无法正常工作..

你可能想要做什么,重置为原始头或任何远程存储库被调用。我可能只是做了类似的事情

git reset --hard origin/HEAD

但要小心。硬重置不容易被撤消。最好像Dan建议的那样做,并在重置之前分出你的更改副本。


91
2017-10-27 01:08



在我的回答中有一个不正确的建议,Dan早些时候抓到了。我把它编辑了,因为我不想让任何人误入歧途。至于origin / master或origin / HEAD的东西,我希望这取决于你是否实际先进行了一次获取。如果你只是克隆了原点,并且它没有其他分支,我发现它很常见,那么它应该重置它。但当然,丹是对的。 - Mikael Ohlson


所有上述建议都是正确的,但往往是  重置你的项目,你甚至需要删除你的文件 .gitignore

获得道德等同于 擦除项目目录并重新克隆 从遥控器是:

git fetch
git reset --hard
git clean -x -d -f

警告git clean -x -d -f 是 不可逆转 并且您可能会丢失文件和数据(例如您忽略使用的内容 .gitignore)。


57
2017-07-23 17:48



警告:“git clean -x -d -f”是不可逆转的,你可能会在.gitignore中丢失文件和数据 - Akarsh Satija
最佳答案;谢谢。 - Bob Baxley


这个问题在这里混合了两个问题:

  1. 如何将本地分支重置为远程所在的点
  2. 如何清除您的临时区域(可能还有工作目录),以便 git statusnothing to commit, working directory clean.

一站式答案是:

  1. git fetch --prune  (可选)更新远程仓库的本地快照。其他命令仅限本地。
    git reset --hard @{upstream}将本地分支指针放在远程快照的位置,并将索引和工作目录设置为该提交的文件。
  2. git clean -d --force  删除未跟踪的文件和目录,阻碍git说“工作目录清理”。

29
2018-01-31 01:29



该 @{upstream} 语法要求设置上游,如果您这样做,默认情况下会发生 git checkout <branchname>。 - 否则更换它 origin/<branchname>。 - Robert Siemer
加 -x 至 git clean 删除不在提交中的所有内容(即使使用.gitignore机制忽略的文件)。 - Robert Siemer


这是我经常面对的事情,我已经将上面提供的Wolfgang脚本用于任何分支

我还添加了“你确定”的提示,以及一些反馈输出

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] || 
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
  git branch "auto-save-$branchname-at-$timestamp" 
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname

20
2017-11-09 13:01



您可能想使用“git remote”来获取遥控器的名称。在某些情况下,它不会是“起源” - Yurik


这是一个自动化最流行的答案建议的脚本... 看到 https://stackoverflow.com/a/13308579/1497139 用于支持分支的改进版本

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see https://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  git branch "auto-save-at-$timestamp" 
fi
git fetch origin
git reset --hard origin/master

11
2017-10-15 08:50





只要远程存储库是 origin,你感兴趣的 branch_name

git fetch origin
git reset --hard origin/<branch_name>

此外,你去重置当前的分支 origin 至 HEAD

git fetch origin
git reset --hard origin/HEAD

怎么运行的:

git fetch origin 从远程下载最新版本而不尝试合并或重组任何内容。

然后 git reset 重置 <branch_name> 分支到你刚刚获得的东西。该 --hard 选项更改工作树中的所有文件以匹配其中的文件 origin/branch_name


11
2018-05-08 11:12