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

hap*_*497 3488 git undo

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

我做了:

git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

但当我跑一个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
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ing 6070

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

git fetch origin
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)

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

git commit -a -m "Saving my work, just in case"
git branch my-saved-work
Run Code Online (Sandbox Code Playgroud)

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

请注意,第一个示例假定远程仓库的名称为"origin",并且远程仓库中名为"master"的分支与本地仓库中当前已签出的分支匹配.

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

  • 在获取之后,我相信你也可以做`git reset FETCH_HEAD --hard`,这也是一样的意思. (24认同)
  • 如果您没有明确命名远程,那么它的名称可能只是"origin"(默认值).您可以使用"git remote"获取所有远程名称的列表.然后,您可以使用"git remote <name>"来查看哪些分支相互推/拉(例如,如果您的"主"分支是从名为"origin"的远程"master"克隆的,那么您将获得一行说"主人与远程主人合并"). (19认同)
  • "不建议推入非裸存储库(而不是进入当前已检出的分支,特别是"为什么? (6认同)
  • 它没有删除我添加的文件. (5认同)
  • 谢谢您的回答.您说'请注意,第一个示例假定远程仓库的名称是"origin",远程仓库中名为"master"的分支与本地仓库中的分支匹配.在执行'git reset --hard'之前,如何仔细检查我的远程仓库名称和我的分支名称?再次感谢. (3认同)
  • -1; 我无法理解这样的说法:OP 描述的行为看起来像是推送到非裸存储库的签出分支的结果。我刚刚尝试推送到非裸存储库的签出分支;它只是更新分支的 HEAD 而不更新工作树。是的,这可能(并且可能会)导致分支有一个非干净的工作树。但它不会产生子序列“git reset --hard”将文件修改留在工作树中的情况。我找不到任何证据表明推送到非裸仓库可能会导致 OP 中的行为。 (2认同)
  • @RazvanZamfir 是的,完全正确。我认为这一点应该在答案中首先说明。初学者可能会意外地将本地功能分支重置为 master,这样会遇到更多麻烦。 (2认同)
  • 我的分支中有新文件。因此,获取和重置不会自动删除它们。否则所有其他更改都会被遥控器覆盖。谢谢 (2认同)

Aka*_*all 367

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

git fetch origin
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)

其次是:

git clean -f
Run Code Online (Sandbox Code Playgroud)

删除本地文件

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

git clean -n -f
Run Code Online (Sandbox Code Playgroud)

  • 如果存在未跟踪的目录,也可以使用`git clean -d -f`. (79认同)
  • 还有`git clean -fdx` (47认同)
  • 小心使用clean命令.它可以删除其他分支中被忽略的文件. (15认同)
  • 如果你想要远程分支的精确副本,你必须遵循git clean -ffdx.请注意,这是两个f. (14认同)
  • `git clean -f`是我需要的必备部分.谢谢! (5认同)
  • @PopeyGilbert,如果.gitignore在两个分支中不同,它就会发生. (2认同)
  • 还有`git clean -nxdf` (2认同)

Acu*_*nus 254

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

git reset --hard @{u}
Run Code Online (Sandbox Code Playgroud)

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

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

git clean -df
Run Code Online (Sandbox Code Playgroud)

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

git pull
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是比接受的更好的答案,因为它动态地重置到当前的上游分支而不是总是静态的,例如`origin/master` (43认同)
  • 对于几乎在这里提出新问题的其他人,如果您从 Powershell 进行 git,请使用引号(`git reset --hard "@{u}"`)。我花了一段时间才弄清楚这一点。 (8认同)
  • @GangadharJannu `git reset --hard` 需要提交,否则它不知道要重置到什么。`@{u}` 指向一个特定的提交 – 跟踪分支的头部,从你上次执行 `git fetch` 开始。 (4认同)

Mik*_*son 103

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

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

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

git reset --hard origin/HEAD
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*ith 70

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

为了获得擦除项目目录并从远程重新克隆的道德等价物:

git fetch
git reset --hard
git clean -x -d -f
Run Code Online (Sandbox Code Playgroud)

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

  • 警告:"git clean -x -d -f"是不可逆转的,你可能会丢失.gitignore中的文件和数据 (12认同)
  • 稍微短一点:“git clean -xdf”等于“git clean -x -d -f”。 (2认同)
  • git clean -ffxd 删除存储库中没有的所有内容 (2认同)

Rob*_*mer 37

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

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

一站式答案是:

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

  • “@{upstream}”语法要求设置上游,如果您“git checkout &lt;branchname&gt;”,则默认情况下会发生这种情况。– 否则将其替换为 `origin/&lt;branchname&gt;`。 (2认同)

Jam*_*eer 34

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

git fetch origin
git reset --hard origin/master
git clean -d -f
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更完整的响应,因为没有`git clean -d -f`,我们仍然会在本地目录中保留旧分支的某些内容。谢啦。 (5认同)
  • 这就是实际上使它像遥控器一样的原因。清洁很重要。 (2认同)
  • git clean -ffxd 真正删除所有内容 (2认同)

小智 28

您可以获取原点并重置来解决问题

 git fetch origin
 git reset --hard origin/main
Run Code Online (Sandbox Code Playgroud)

您可以在重置之前保存更改,如下所示,

git stash
Run Code Online (Sandbox Code Playgroud)

重置后,如果你想恢复原来的状态,你可以简单地运行,

git stash apply
Run Code Online (Sandbox Code Playgroud)


小智 22

这是我经常面对的事情,我已经将上面提供的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
Run Code Online (Sandbox Code Playgroud)

  • 您可能想使用"git remote"来获取遥控器的名称.在某些情况下,它不会是"起源" (3认同)

Xys*_*Xys 17

2023年简单解决方案:

git fetch
git reset --hard @{u}
Run Code Online (Sandbox Code Playgroud)

重置origin/HEAD并不总是有效,因为它不一定是当前分支的最新提交。


eig*_*sha 15

如果远程存储库是origin,并且您对以下内容感兴趣branch_name:

git fetch origin
git reset --hard origin/<branch_name>
Run Code Online (Sandbox Code Playgroud)

另外,你去重置当前分支originHEAD.

git fetch origin
git reset --hard origin/HEAD
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

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

然后将分支git reset重置为<branch_name>刚刚获取的分支.该--hard选项会更改工作树中的所有文件以匹配其中的文件origin/branch_name.


Wol*_*ahl 14

这是一个自动化最流行的答案建议的脚本...请参阅/sf/answers/931600561/以获取支持分支的改进版本

#!/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
Run Code Online (Sandbox Code Playgroud)


Ana*_*ael 14

答案

git clean -d -f
Run Code Online (Sandbox Code Playgroud)

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


use*_*569 12

我做了:

git branch -D master
git checkout master
Run Code Online (Sandbox Code Playgroud)

完全重置分支


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

  • 你应该再次阅读问题,没有什么影响遥控器,但设置为与遥控器相同,所以你不应该对遥控器做任何事情,这对我的情况有帮助而在上面没有. (5认同)
  • 你应该至少尝试这个或阅读文档:https://www.kernel.org/pub/software/scm/git/docs/git-checkout.html (2认同)

Kar*_*rol 10

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

git reset --hard HEAD~2
Run Code Online (Sandbox Code Playgroud)

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

所以回答你的问题 - 如果你提前5个提交远程存储库HEAD,你应该运行这个命令:

git reset --hard HEAD~5
Run Code Online (Sandbox Code Playgroud)

请注意,您将丢失所做的更改,因此请小心!


Sno*_*ash 9

这里评价最高的答案没有按预期重置我的本地代码。

  1. 如今,master 通常是 main
  2. 它不会对您可能拥有的未跟踪文件执行任何操作

反而:

  1. 检查默认远程分支的名称(这不是 git 的东西,因此请在 GitHub 中查看),然后用此替换下面步骤 4 中的 main 或 master

  2. 保存当前的东西 git stash -u

  3. 从远程更新 git fetch origin

  4. 重置为远程默认分支(但请参阅上面的步骤 1) git reset --hard origin/main


Dee*_*mal 8

Only 3 commands will make it work

git fetch origin
git reset --hard origin/HEAD
git clean -f
Run Code Online (Sandbox Code Playgroud)


Rai*_*ome 7

以前的答案假设要重置的分支是当前分支(已检出).在评论中,OP hap497澄清了该分支确实被检出,但原始问题并未明确要求.由于至少存在一个"重复"问题,因此将分支完全重置为存储库状态,而不假设分支已签出,这是另一种选择:

如果当前没有检出分支"mybranch" ,要将其重置为远程分支"myremote/mybranch"的头部,您可以使用此低级命令:

git update-ref refs/heads/mybranch myremote/mybranch
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

首先,检查git status您是否有任何本地更改。如果是,请将它们藏起来。

然后执行:

git fetch
git reset --hard @{push}
Run Code Online (Sandbox Code Playgroud)

它将把当前的本地分支重置为用于git push. 这在git config push.default current配置时特别有用。例如,当您的分支是abc且远程是 时origin,它会将其重置为origin/abc

请参阅Git 修订版以获取更多详细信息@{push}


Mar*_*tin 6

没有多少重置和清理似乎对我本地 git 存储库中未跟踪和修改的文件有任何影响(我尝试了上面的所有选项)。我唯一的解决方案是 rm 本地 repo 并从远程重新克隆它。

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

xkcd:Git


Jam*_*Ray 6

这是我经常使用的:

git fetch upstream master;
git reset --hard upstream/master;
git clean -d --force;
Run Code Online (Sandbox Code Playgroud)

请注意,这是很好的做法,是不会更改您的本地主,而是结帐另一个分支的任何变化,与变化的类型,例如前置分行的名称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
Run Code Online (Sandbox Code Playgroud)

在GitHub上,您也可以签出与本地名称相同的分支,以将其保存在此处,尽管如果Origin开发与本地保存的工作分支具有相同的更改,则不必这样做。我以develop分支为例,但它可以是任何现有的分支名称。

git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop
Run Code Online (Sandbox Code Playgroud)

然后,如果需要在发生任何冲突的情况下将这些更改与另一个分支合并,将更改保留在开发中,请使用:

git merge -s recursive -X theirs develop
Run Code Online (Sandbox Code Playgroud)

使用时

git merge -s recursive -X ours develop
Run Code Online (Sandbox Code Playgroud)

保留branch_name冲突的更改。否则,将mergetool与一起使用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;
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用提交哈希,其他分支名称等代替上游/开发。使用CLI工具(例如Oh My Zsh)检查您的分支是否为绿色,指示没有要提交的内容,并且工作目录是干净的(由确认或验证git status)。请注意,这反而可能会增加相比,上游开发,如果有自动添加一个承诺,比如UML图,许可证头,等什么提交,所以在这种情况下,你可以再拉的变化origin developupstream develop,如果需要的话。


Emi*_*Sit 5

如果你想回到HEAD工作目录和索引的状态,那么你应该git reset --hard HEAD而不是HEAD^.(这可能是一个错字,就像单一与双击一样--hard.)

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