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

如何将本地分支重置为与远程存储库上的分支相同?

我试过:

git reset --hard HEAD

但是git status声称我修改了文件:

On branch masterChanges to be committed:(use "git reset HEAD <file>..." to unstage)modified:   java/com/mycompany/TestContacts.javamodified:   java/com/mycompany/TestParser.java
5235287 次浏览

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

如果你有几个提交,这将不起作用。

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

git reset --hard origin/HEAD

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

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

git fetch origingit reset --hard origin/master

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

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

现在,您的工作保存在分支“my-serve-work”上,以防您决定要将其恢复(或想稍后查看它或与更新的分支进行比较)。

请注意,第一个示例假设远程存储库的名称为“原始”,并且远程存储库中名为“master”的分支与本地存储库中当前签出的分支匹配。

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

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

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

这是一个脚本,可以自动执行最流行的答案…请参阅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-headtimestamp=`date "+%Y-%m-%d-%H_%M_%S"`git commit -a -m "auto commit at $timestamp"if [ $? -eq 0 ]thengit branch "auto-save-at-$timestamp"figit fetch origingit reset --hard origin/master

这是我经常面对的事情,我已经将沃尔夫冈上面提供的脚本推广到任何分支机构

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

#!/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-headtimestamp=`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 ]thenecho "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"git branch "auto-save-$branchname-at-$timestamp"fiecho "now resetting to origin/$branchname"git fetch origingit reset --hard origin/$branchname

我做了:

git branch -D mastergit checkout master

到完全重置分支


注意,您应该签出到另一个分支才能删除所需的分支

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

git reset --hard HEAD~2

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

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

git reset --hard HEAD~5

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

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

git stashgit pull

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

git fetch origingit reset --hard origin/master

其次是:

git clean -f

删除本地文件

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

git clean -n -f

首先,使用git重置重置到先前获取的相应上游分支的HEAD

git reset --hard @{u}

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

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

git clean -df

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

git pull

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

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

git fetchgit reset --hardgit 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说“工作目录清理”的未跟踪文件和目录。

之前的回答假设要重置的分支是当前分支(签出)。在注释中,OPhap497澄清了该分支确实签出了,但原问题没有明确要求。由于至少有一个“重复”问题将分支完全重置到存储库状态没有假设分支签出,这里有一个替代方案:

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

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

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

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

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

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

xkcd: git

假设远程存储库是origin,并且您对branch_name感兴趣:

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

此外,您可以将当前分支origin重置为HEAD

git fetch origingit reset --hard origin/HEAD

它是如何工作的:

git fetch origin从远程下载最新的内容,而不尝试合并或重新定位任何内容。

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

在我看到的所有情况下都有效的唯一解决方案是删除和重新克隆。也许还有另一种方法,但显然这种方法不会留下旧状态的机会,所以我更喜欢它。如果你经常在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文件没有损坏

这是我经常使用的:

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

最好不要在master分支做任何修改,而是使用check out分支进行修改,并在修改的分支名称前加上修改的类型,例如feat/chore/fix/等。因此你只需要拉取修改,而不是推送master分支的修改。其他有贡献的分支也是如此。所以只有当你把修改提交到别人已经提交的分支,并且需要重置的时候,才应该使用上面的操作。否则以后不要推送到别人推送到的分支,而是通过check out分支推送到上述分支。

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

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

使用CLI工具,如Oh My Zsh来检查你的分支是否是绿色的,表明没有什么要提交的,并且工作目录是干净的(由git status确认或验证)。请注意,如果提交有任何自动添加的内容,例如UML图、许可证标头等,与上游开发相比,这实际上可能会添加提交,所以在这种情况下,如果需要,你可以拉取origin developupstream develop上的更改。

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

git fetch origingit reset --hard origin/mastergit clean -d -f

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

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

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

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

git fetch origingit reset --hard origin/HEADgit clean -f

答案

git clean -d -f

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

  • 抛出错误,因为它有未完成的更改。
  1. 你可以使用git stash
  • 这将保存未完成的更改以供以后使用,然后从您的工作副本中恢复它们。
  • 如果您想再次进行这些更改,可以使用git stash apply
  1. 然后你可以使用git pull
  • 这将从远程存储库获取最近的代码。

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

 git fetch origingit reset --hard origin/master

您可以在进行如下重置之前保存更改,

git stash

在重置之后,如果你想恢复,你可以简单地运行,

git stash apply

这里最受好评的答案没有像预期的那样重置我的本地代码。

  1. 现在,主人通常是主要的
  2. 它与你可能躺在周围的未跟踪文件无关

而是:

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

  2. 保存当前内容git stash -u

  3. 远程更新git fetch origin

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