4855

如何将我的本地分支重置为就像远程存储库上的分支一样?

我做了:

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

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

4

22 回答 22

8427

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

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

顺便说一句,你所处的这种情况看起来很像一个常见的情况,即推送到非裸存储库的当前签出分支中。您最近是否推入了本地仓库?如果没有,那么不用担心——一定是其他原因导致这些文件意外地最终被修改。否则,您应该知道不建议推送到非裸存储库(特别是不要推送到当前签出的分支)。

于 2009-10-27T01:44:30.760 回答
556

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

git fetch origin
git reset --hard origin/master

其次是:

git clean -f

删除本地文件

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

git clean -n -f
于 2014-12-27T06:20:58.227 回答
475

首先,使用git reset重置为之前获取HEAD的对应上游分支:

git reset --hard @{u}

指定@{u}或其详细形式的优点@{upstream}是不必显式指定远程 repo 和分支的名称。在 Windows 或使用 PowerShell 时,指定"@{u}"(使用双引号)。

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

git clean -df

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

git pull
于 2015-02-10T20:27:36.300 回答
156

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

如果您有多个提交,这将不起作用..

您可能想要做的是重置为源头或远程存储库被调用的任何内容。我可能会做类似的事情

git reset --hard origin/HEAD

不过要小心。硬重置不能轻易撤消。最好按照 Dan 的建议去做,并在重置之前将更改的副本分支出来。

于 2009-10-27T01:08:57.283 回答
87

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

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

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

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

于 2015-07-23T17:48:17.993 回答
60

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

git fetch origin
git reset --hard origin/master
git clean -d -f
于 2019-03-22T10:19:27.553 回答
46

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

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

一站式答案是:

  1. git fetch --prune (可选)更新远程仓库的本地快照。其他命令仅是本地命令。
    git reset --hard @{upstream}将本地分支指针指向远程快照所在的位置,并将索引和工作目录设置为该提交的文件。
  2. git clean -d --force 删除阻碍 git 说“工作目录干净”的未跟踪文件和目录。
于 2016-01-31T01:29:30.827 回答
30

前提是远程存储库是origin,并且您感兴趣branch_name

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

origin此外,您还可以重置to的当前分支HEAD

git fetch origin
git reset --hard origin/HEAD

这个怎么运作:

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

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

于 2017-05-08T11:12:41.973 回答
27

这是我经常遇到的问题,我已经概括了 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
于 2012-11-09T13:01:40.317 回答
19

我做了:

git branch -D master
git checkout master

完全重置分支


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

于 2014-05-14T07:48:28.430 回答
18

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

答案

git clean -d -f

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

于 2020-01-25T00:29:14.920 回答
13

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

git reset --hard HEAD~2

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

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

git reset --hard HEAD~5

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

于 2014-06-16T03:35:57.737 回答
12

以前的答案假定要重置的分支是当前分支(已签出)。在评论中,OP hap497澄清了该分支确实已签出,但这不是原始问题明确要求的。由于至少有一个“重复”问题,将分支完全重置为存储库状态,它不假定分支已签出,这里有一个替代方案:

如果当前签出分支“mybranch”,要将其重置为远程分支“myremote/mybranch”的头部,您可以使用以下低级命令:

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

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

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

于 2016-06-25T17:13:54.360 回答
10

这是我经常使用的:

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

请注意,最好不要对本地 master/develop 分支进行更改,而是将任何更改签出到另一个分支,分支名称前有更改类型,例如feat/chore/fix/等。因此,您只需要拉取更改,而不是从 master 推送任何更改。其他人贡献的其他分支也是如此。因此,仅当您碰巧将更改提交到其他人已提交的分支并需要重置时,才应使用上述内容。否则,将来避免推送到其他人推送到的分支,而是通过签出的分支签出并推送到所述分支。

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

检查您的遥控器,确保您的上游和来源是您所期望的,如果不符合预期,请使用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

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

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.

于 2018-04-26T01:30:27.773 回答
8

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

git fetch origin
git reset --hard origin/HEAD
git clean -f
于 2019-12-16T19:04:54.073 回答
7

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

至于您关于为什么这些文件显示为已修改状态的具体问题,看起来您可能进行了软重置而不是硬重置。这将导致HEAD提交中更改的文件看起来好像它们是暂存的,这很可能是您在此处看到的。

于 2009-10-27T02:10:21.753 回答
6

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

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

xkcd:Git

于 2016-12-01T10:25:43.337 回答
3

在我见过的所有情况下,唯一可行的解​​决方案是删除和重新克隆。也许还有另一种方式,但显然这种方式不会留下旧状态的机会,所以我更喜欢它。如果您经常在 git 中搞砸事情,您可以将 Bash one-liner 设置为宏:

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 文件没有损坏

于 2017-09-14T19:28:15.593 回答
3

您是否忘记创建功能分支并错误地直接在 master 上提交?

您现在可以创建功能分支并在不影响工作树(本地文件系统)的情况下设置 master,以避免触发构建、测试和文件锁问题:

git checkout -b feature-branch
git branch -f master origin/master
于 2019-10-17T14:38:35.847 回答
1
  • 抛出错误,因为它有未提交的更改。
  1. 所以,你可以使用git stash
  • 这将保存未提交的更改以供以后使用,然后从您的工作副本中恢复它们。
  • 如果您希望再次进行这些更改,可以使用git stash apply
  1. 然后你可以使用git pull
  • 这会从远程仓库获取最近的代码。
于 2022-02-08T05:26:37.807 回答
-1

如果您不介意保存本地更改,但仍想更新存储库以匹配 origin/HEAD,您可以简单地存储本地更改,然后拉取:

git stash
git pull
于 2014-09-10T13:49:19.570 回答