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

时间:2009-10-27 00:27:21

标签: git undo

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

我做了:

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

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

22 个答案:

答案 0 :(得分:5447)

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

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

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

答案 1 :(得分:322)

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

git fetch origin
git reset --hard origin/master

其次是:

git clean -f

to remove local files

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

git clean -n -f

答案 2 :(得分:191)

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

git reset --hard @{u}

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

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

git clean -df

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

git pull

答案 3 :(得分:99)

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

如果您有多次提交,这将无效..

您可能想要做的事情是重置为原始头或您调用远程存储库的任何内容。我可能只是做了像

这样的事情
git reset --hard origin/HEAD

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

答案 4 :(得分:66)

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

从遥控器中获取擦除项目目录并重新克隆的道德等同物:

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

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

答案 5 :(得分:34)

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

  1. 如何将本地分支重置为远程
  2. 的位置
  3. 如何清除暂存区域(可能还有工作目录),以便git statusnothing to commit, working directory clean.
  4. 一站式答案是:

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

答案 6 :(得分:21)

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

我还添加了一个&#34;你确定&#34;提示,&amp;一些反馈输出

#!/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

答案 7 :(得分:13)

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

答案 8 :(得分:12)

如果远程存储库为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中的文件。

答案 9 :(得分:11)

我做了:

git branch -D master
git checkout master

完全重置分支


请注意,您应该结帐到另一个分支,以便能够删除所需的分支

答案 10 :(得分:8)

如果你遇到了我的问题,你已经提交了一些更改,但是现在,无论出于何种原因你想要摆脱它,最快的方法是使用git reset这样:

git reset --hard HEAD~2

我有2个不需要的提交,因此数字2.您可以将其更改为您自己的重置提交数。

回答您的问题 - 如果您在远程存储库HEAD之前提交,则应运行此命令:

git reset --hard HEAD~5

请注意,您将丢失已经进行的更改,因此请小心!

答案 11 :(得分:8)

答案

git clean -d -f

被低估了( -d 以删除目录)。 谢谢!

答案 12 :(得分:5)

如果要为工作目录和索引返回HEAD状态,则应git reset --hard HEAD,而不是HEAD^。 (这可能是一个错字,就像--hard的单一与双击一样。)

至于你为什么这些文件出现在修改状态的具体问题,看起来好像你做了软复位而不是硬复位。这将导致HEAD提交中更改的文件看起来好像已经暂存,这可能就是您在这里看到的。

答案 13 :(得分:5)

以前的答案假设要重置的分支是当前分支(已签出)。在评论中,OP hap497 澄清了分支确实被检出,但原始问题并未明确要求。由于至少有一个“重复”问题,Reset branch completely to repository state,它不假设分支被检出,这里有一个替代方案:

如果当前已检出分支“mybranch” ,要将其重置为远程分支“myremote / mybranch”的头部,您可以使用此low-level命令:

git update-ref refs/heads/mybranch myremote/mybranch

此方法保持已检出的分支,并且工作树不受影响。它只是将mybranch的头部移动到另一个提交,无论作为第二个参数给出什么。如果需要将多个分支更新到新的远程磁头,这将特别有用。

执行此操作时请小心,并使用gitk或类似工具仔细检查源和目标。如果您不小心在当前分支上执行此操作(并且git不会阻止您这样做),您可能会感到困惑,因为新分支内容与工作树不匹配,工作树没有更改(要修复,再次更新分支,以前的地方)。

答案 14 :(得分:4)

这是我经常使用的:

git fetch upstream master;
git reset --hard upstream/master;
git clean -d --force;

请注意,最好不要更改本地主数据,而是检查另一个分支是否有任何更改,其中分支名称以更改类型为前缀,例如: feat/chore/fix/等。因此,您只需要提取更改,而不是从主服务器推送任何更改。其他分支也是如此,其他分支也是如此。因此,只有在您碰巧将更改提交给其他人已提交并且需要重置的分支时,才应使用上述内容。否则将来避免推送到其他人推送的分支,而是通过签出的分支结账并推送到所述分支。

如果您想将本地分支重置为上游分支中的最新提交,那么到目前为止对我有用的是:

检查您的遥控器,确保您的上游和原点符合您的预期,如果不符合预期,请使用git remote add upstream <insert URL>,例如您分叉的原始GitHub仓库和/或git remote add origin <insert URL of the forked GitHub repo>

git remote --verbose

git checkout develop;
git commit -m "Saving work.";
git branch saved-work;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force

在GitHub上,您还可以使用与本地名称相同的名称签出分支,以便在那里保存工作,但如果原始开发与本地保存工作具有相同的更改,则不需要这样做。科。我以开发分支为例,但它可以是任何现有的分支名称。

git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop

然后,如果您需要将这些更改与另一个分支合并,而有任何冲突,保留develop中的更改,请使用:

git merge -s recursive -X theirs develop

使用时

git merge -s recursive -X ours develop

保留branch_name的冲突更改。否则,请使用git mergetool的合并工具。

将所有变化放在一起:

git commit -m "Saving work.";
git branch saved-work;
git checkout develop;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
git add .;
git commit -m "Reset to upstream/develop";
git push --force origin develop;
git checkout branch_name;
git merge develop;

请注意,代替上游/开发,您可以使用提交哈希,其他分支名称等。使用诸如Oh My Zsh之类的CLI工具来检查您的分支是否为绿色,表示没有任何要提交的工作目录是干净的(由git status确认或可验证)。注意,如果提交自动添加任何内容,例如,与上游开发相比,这实际上可能会添加提交,例如, UML图表,许可证标题等,在这种情况下,您可以根据需要将origin develop上的更改提取到upstream develop

答案 15 :(得分:3)

没有任何重置和清理似乎对我本地git仓库中未跟踪和修改的文件有任何影响(我尝试了上面的所有选项)。我唯一的解决方案是使用本地仓库并从遥控器重新克隆它。

幸运的是,我没有任何其他我关心的分支。

xkcd: Git

答案 16 :(得分:3)

请尝试下面的命令,它也会从本地git中删除所有未跟踪的文件

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

答案 17 :(得分:0)

在我见过的所有情况下,唯一有效的解决方案是删除和重新删除。也许还有另一种方式,但显然这种方式不会让旧州留在那里,所以我更喜欢它。如果你经常在git中搞砸了,你可以将Bash单行设置为宏:

REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH

*假设您的.git文件没有损坏

答案 18 :(得分:0)

您是否忘记了创建功能分支并误将其直接提交给master?

您现在可以创建功能分支并重新设置master,而不会影响 worktree (本地文件系统),以避免触发构建,测试和文件锁定问题:

git checkout -b feature-branch
git branch -f master origin/master

答案 19 :(得分:0)

只有3个命令可以使它工作

git fetch origin
git reset --hard origin/HEAD
git clean -f

答案 20 :(得分:-3)

如果您不介意保存本地更改,但仍想更新存储库以匹配origin / HEAD,则只需隐藏您的本地更改,然后执行以下操作:

git stash
git pull

答案 21 :(得分:-7)

如果您希望稍后使用当前更改,则可以使用这两个命令以其他方式隐藏更改,

git fetch origin
git reset --hard origin/master