重置本地仓库分支就像远程仓库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 

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

如果你有几个提交,这是行不通的。

你可能想要做的是重置到原始的头部,或者你调用的远程仓库。 我可能只是做一些像

 git reset --hard origin/HEAD 

不过要小心。 硬复位不能轻易撤消。 按照Dan的说法,最好做一些事情,并在重置之前分出一个更改的副本。

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

 git reset --hard @{u} 

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

接下来,获取最新的变化:

 git pull 

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

要获得删除项目目录和从远程重新克隆的道德等价物,请执行以下操作

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

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

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

  1. 如何重置本地分支到远程的地方
  2. 如何清理你的临时区域(可能还有工作目录),这样git statusnothing to commit, working directory clean.

一站式答案是:

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

这是我经常面对的东西,我已经概括了沃尔夫冈提供的脚本与任何分支合作

我还加了一个“你确定”的提示和一些反馈输出

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

这里是一个脚本,它自动化最流行的答案建议…请参阅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 

我做了:

 git branch -D master git checkout master 

完全重置分支


注意,您应该签出另一个分支以便能够删除所需的分支

如果你有问题,你已经做了一些改变,但是现在,由于任何原因你想摆脱它,最快捷的方法是使用git reset像这样:

 git reset --hard HEAD~2 

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

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

 git reset --hard HEAD~5 

注意你将失去你所做的改变,所以要小心!

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

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

怎么运行的:

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

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

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

至于你的具体问题,为什么这些文件出现在被修改的状态,看起来可能你做了软重置,而不是硬重置。 这会导致HEAD提交中更改的文件显示为正在执行,这可能是您在这里看到的。

先前的答案假设要重置的分支是当前分支(签出)。 在意见中,OP hap497澄清了这个分支确实被检出了,但是原来的问题并没有明确的要求。 由于至少存在一个“重复”问题,因此将分支完全重置为存储库状态 (并不假定分支已检出),可以使用以下替代方法:

如果分支“mybranch”目前没有被检出,重新设置到远程分支“myremote / mybranch”的头部,你可以使用这个低级命令:

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

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

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

没有任何数量的重置和清理似乎对我的本地git仓库中未跟踪和修改的文件有任何影响(我尝试了上述所有选项)。 我唯一的解决办法是从本地回购,并从远程重新克隆。

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

在我看到的所有情况下,唯一的解决方案是删除和重新登录。 也许还有另外一种方法,但显然这种方式没有留下旧状态的机会,所以我更喜欢它。 如果你经常在git中搞砸,那么你可以设置为一个宏:

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

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

 git stash git pull 

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

 git fetch origin git reset --hard origin/master