如何将本地分支重置为远程存储库中的分支?
我做了:
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
你能告诉我为什么我有这些“修改过的”吗?我没有碰过这些文件?如果我这样做,我想删除它们 .
18 回答
如果你想回到工作目录和索引的
HEAD
状态,那么你应该git reset --hard HEAD
,而不是HEAD^
. (这可能是一个错字,就像--hard
的单一与双击一样 . )至于你为什么这些文件出现在修改状态的具体问题,看起来好像你做了软复位而不是硬复位 . 这将导致
HEAD
提交中更改的文件显示为已暂存,这可能就是您在此处看到的内容 .将分支设置为与远程分支完全匹配可以分两步完成:
如果您想在执行此操作之前保存当前分支的状态(以防万一),您可以执行以下操作:
现在你的工作被保存在“my-saved-work”分支上,以防你决定要它回来(或者想要稍后查看它或者将它与你更新的分支区分开来) .
请注意,第一个示例假定远程仓库的名称为“origin”,并且远程仓库中名为“master”的分支与本地仓库中当前已签出的分支匹配 .
顺便说一下,你所处的这种情况看起来非常像一种常见的情况,即在非裸存储库的当前检出的分支中已经完成了推送 . 你最近是否进入了当地的仓库?如果没有,那么不用担心 - 其他必须导致这些文件意外地最终被修改 . 否则,您应该意识到不建议将其推入非裸存储库(而不是特别是当前已检出的分支) .
The question mixes two issues here:
如何将本地分支重置为远程所在的点
如何清除临时区域(可能还有工作目录),以便
git status
说nothing to commit, working directory clean.
The one-stop-answer is:
git fetch --prune
(可选)更新远程仓库的本地快照 . 其他命令仅限本地 .git reset --hard @{upstream}
将本地分支指针放在远程快照的位置,并将索引和工作目录设置为该提交的文件 .git clean -d --force
删除未跟踪的文件和目录,阻碍git说“工作目录清理” .没有任何重置和清理似乎对我本地git仓库中未跟踪和修改的文件有任何影响(我尝试了上面的所有选项) . 我唯一的解决方案是使用本地存储并从远程重新克隆它 .
幸运的是,我没有任何其他我关心的分支 .
xkcd: Git
我需要做(在接受的答案中的解决方案):
其次是:
to remove local files
要查看将删除哪些文件(而不实际删除它们):
所有上述建议都是正确的,但通常要真正重置您的项目,您还需要删除
.gitignore
中的文件 .从遥控器获得 erasing your project directory and re-cloning 的道德等价物是:
Warning :
git clean -x -d -f
是不可逆转的,您可能会丢失文件和数据(例如使用.gitignore
忽略的内容) .如果远程存储库是
origin
,并且您对branch_name
感兴趣:此外,您还要将
origin
的当前分支重置为HEAD
.How it works:
git fetch origin
从远程下载最新版本而不尝试合并或重新绑定任何内容 .然后
git reset
将<branch_name>
分支重置为您刚刚获取的分支 .--hard
选项会更改工作树中的所有文件以匹配origin/branch_name
中的文件 .如果您不介意保存本地更改,但仍希望更新存储库以匹配origin / HEAD,则可以简单地存储本地更改,然后执行以下操作:
如果你遇到了我的问题,你已经提交了一些更改,但现在,无论出于什么原因你想要摆脱它,最快的方法是使用
git reset
这样:我有2个不需要的提交,因此数字2.您可以将其更改为您自己的重置次数 .
所以回答你的问题 - 如果你提前5个提交远程存储库HEAD,你应该运行这个命令:
请注意,您将丢失所做的更改,因此请小心!
首先,重置为先前获取的相应上游分支的
HEAD
:指定
@{u}
或其详细形式@{upstream}
的优点是不必显式指定远程仓库和分支的名称 .接下来,根据需要删除未跟踪的文件,也可以选择
-x
:最后,根据需要,获取最新的更改:
在我见过的所有情况下,唯一有效的解决方案是删除和重新克隆 . 也许还有另一种方式,但显然这种方式不会让旧州留在那里,所以我更喜欢它 . 如果你经常把它搞砸了,你可以将Bash单行设置为宏:
*假设您的.git文件没有损坏
这是一个自动化最流行的答案建议的脚本...请参阅https://stackoverflow.com/a/13308579/1497139以获得支持分支的改进版本
这是我经常使用的,尽管其他分支:
请注意,最好不要对本地主服务器进行更改,而是检查另一个分支以进行任何更改,并使用更改类型前面的分支名称,例如:
feat/
,chore/
,fix/
等因此您只需要提取更改,而不是从主服务器推送任何更改 . 其他分支也是如此,其他分支也是如此 . 因此,只有在您碰巧将更改提交到其他人已提交并且需要重置的分支时,才应使用上述内容 . 否则将来会避免推送到其他人推送的分支,而是通过签出的分支检出并推送到所述分支 .如果要将本地分支重置为上游分支中的最新提交,那么到目前为止对我有用的是:
检查您的遥控器,确保您的上游和原点符合您的预期,如果不符合预期,则使用
git remote add upstream <insert URL>
,例如您分叉的原始GitHub仓库和/或git remote add origin <insert URL of the forked GitHub repo>
.在GitHub上,您还可以签出与本地名称相同的分支,以便在那里保存工作,但如果origin develop与本地保存工作分支具有相同的更改,则不需要这样做 . 我使用develop分支作为示例,但它可以是任何现有的分支名称 .
然后,如果您需要在存在任何冲突的情况下将这些更改与另一个分支合并,请保留develop中的更改,请使用:
使用时
保留branch_name的冲突更改 . 否则使用带有
git mergetool
的mergetool .随着所有变化:
请注意,您可以使用提交哈希,其他分支名称等来代替上游/开发 . 使用诸如Oh My Zsh之类的CLI工具来检查您的分支是否为绿色,表示没有任何提交,工作目录是干净的(由
git status
确认或可验证的 . 注意,如果提交自动添加任何内容,例如,与上游开发相比,这实际上可能会添加提交,例如, UML图表,许可证 Headers 等,因此在这种情况下,您可以根据需要将origin develop
上的更改拉到upstream develop
.git reset --hard HEAD
实际上只重置为上次提交的状态 . 在这种情况下,HEAD指的是您的分支的HEAD .如果你有几个提交,这将无法正常工作..
你可能想要做什么,重置为原始头或任何远程存储库被调用 . 我可能只是做了类似的事情
但要小心 . 硬重置不容易被撤消 . 最好像Dan建议的那样做,并在重置之前分出你的更改副本 .
如果您希望稍后使用当前更改,则以其他方式隐藏更改,您可以使用这两个命令,
这是我经常面对的事情,我已经将上面提供的Wolfgang脚本用于任何分支
我还添加了“你确定”的提示,以及一些反馈输出
以前的答案假设要重置的分支是当前分支(已检出) . 在评论中,OP hap497澄清了该分支确实被检出,但原始问题并未明确要求 . 由于至少有一个"duplicate"问题Reset branch completely to repository state,它不假设分支被检出,这里有一个替代方案:
如果当前已检出分支"mybranch" not ,要将其重置为远程分支"myremote/mybranch"的头部,则可以使用此low-level命令:
此方法保持已检出的分支,并且工作树不受影响 . 它只是将mybranch的头部移动到另一个提交,无论作为第二个参数给出什么 . 如果需要将多个分支更新到新的远程磁头,这将特别有用 .
但是,在执行此操作时请小心,并使用
gitk
或类似工具来仔细检查源和目标 . 如果您不小心在当前分支上执行此操作(并且git不会阻止您这样做),您可能会感到困惑,因为新分支内容与工作树不匹配,工作树没有更改(要修复,再次更新分支,以前的地方) .我做了:
完全重置分支
请注意,您应该签出到另一个分支,以便能够删除所需的分支