重置本地仓库分支就像远程仓库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
忽略的东西)。
这个问题在这里混合了两个问题:
- 如何重置本地分支到远程的地方
- 如何清理你的临时区域(可能还有工作目录),这样
git status
就nothing to commit, working directory clean.
一站式答案是:
-
git fetch --prune
(可选)更新远程git fetch --prune
的本地快照。 其他命令仅限于本地。
git reset --hard @{upstream}
将本地分支指针放到远程快照的位置,并将索引和工作目录设置为该提交的文件。 -
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