将本地存储库分支重置为类似于远程存储库 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

您能告诉我为什么我要进行这些 “修改” 吗?我还没有碰过这些文件?如果我这样做了,我想删除那些。

答案

可以通过两个步骤将分支设置为与远程分支完全匹配:

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” 的分支与本地仓库中当前已签出的分支匹配。

顺便说一句,您遇到的这种情况看起来很糟糕,就像一个普通情况,即已推送到非裸存储库的当前签出分支中。您最近是否进入了本地仓库?如果没有,那么就不用担心 - 某些其他原因一定会导致这些文件意外地被修改。否则,您应该注意,不建议将其推送到非裸仓库(尤其是不要放入当前已签出的分支)。

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

git fetch origin
git reset --hard origin/master

其次是:

git clean -f

删除本地文件

要查看将删除哪些文件(实际上并没有删除它们):

git clean -n -f

首先,将其重置为相应上游分支的先前获取的HEAD

git reset --hard @{u}

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

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

git clean -df

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

git pull

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

如果您有多次提交,则此操作将无效。

您可能想要做的是重置为原点或任何您称为远程存储库的名称。我可能会做类似的事情

git reset --hard origin/HEAD

不过要小心。硬重置无法轻易撤消。最好按照 Dan 的建议进行操作,并在重设之前分支出所做更改的副本。

上面的所有建议都是正确的,但是通常要真正重置项目,甚至还需要删除.gitignore文件。

从道德上讲, 删除项目目录并从远程重新克隆是:

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

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

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

  1. 如何将本地分支重置到远程位置
  2. 如何清除暂存区(可能还有工作目录),以便git status nothing to commit, working directory clean.

一站式答案是:

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

使用以下命令。这些命令也会从本地 git 中删除所有未跟踪的文件

git fetch origin
git reset --hard origin/master
git clean -d -f

这是我经常要面对的事情,并且我已经概括了上面提供的与任何分支一起使用的 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

假设远程存储库是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中的文件。

这是一个脚本,可自动执行最流行的答案所建议的内容... 有关支持分支的改进版本,请参见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