Git 为什么可以';是否将存储应用于工作目录?
我无法将隐藏应用回工作目录 小故事: 首先,我试图推动一些承诺的改变,但它说:“不,你不能,先拉”。。。好吧,我将从GitHub中提取内容,然后推动我的更改。当我尝试拉取时,它说我有将被覆盖的更改,并且我应该隐藏我的更改。好的,我把变化藏起来了。。。执行拉、推提交的更改。但是现在,我无法恢复我正在进行的未提交的更改 这就是错误: 当然我还不了解git的所有概念,它们让我有点困惑。。。也许我做错了什么 如果有人能帮我解决这个问题就太好了。。。我已经搜索谷歌和所有东西一个多小时了,但我还没有找到解决办法Git 为什么可以';是否将存储应用于工作目录?,git,git-stash,Git,Git Stash,我无法将隐藏应用回工作目录 小故事: 首先,我试图推动一些承诺的改变,但它说:“不,你不能,先拉”。。。好吧,我将从GitHub中提取内容,然后推动我的更改。当我尝试拉取时,它说我有将被覆盖的更改,并且我应该隐藏我的更改。好的,我把变化藏起来了。。。执行拉、推提交的更改。但是现在,我无法恢复我正在进行的未提交的更改 这就是错误: 当然我还不了解git的所有概念,它们让我有点困惑。。。也许我做错了什么 如果有人能帮我解决这个问题就太好了。。。我已经搜索谷歌和所有东西一个多小时了,但我还没有找到解决
非常感谢你的帮助。谢谢 听起来你的藏品中包含了一个未跟踪的文件,该文件随后被添加到回购协议中。当您尝试签出它时,git正确地拒绝了,因为它将覆盖现有文件 要修复此问题,您可以执行一些操作,例如删除该文件(没关系,它仍在repo中)、应用您的存储,然后根据需要将文件的存储版本替换为repo中的版本 编辑:文件也有可能只是在工作树中创建的,而没有添加到repo中。在这种情况下,不要简单地删除本地文件,而是:
最安全、最简单的方法可能是再次藏匿物品:
git stash -u # This will stash everything, including unstaged files
git stash pop stash@{1} # This will apply your original stash
之后,如果你对结果满意,你可以打电话
git stash drop
要删除您的“安全”存储。正如@bentolo所提到的,您可以手动删除它抱怨的文件,切换分支,然后手动将它们添加回。但我个人更喜欢“在git内” 最好的方法是将存储转换为分支。一旦它成为一个分支,您就可以使用您熟悉和喜爱的与分支相关的技术/工具在git中正常工作。这实际上是一种有用的通用技术,即使在没有列出的错误的情况下也可以使用隐藏。它工作得很好,因为隐藏实际上是一种隐藏的提交(参见PS) 将存储转换为分支 以下内容在创建隐藏时基于头创建一个分支,然后应用该隐藏(它不提交) 与“藏匿处”合作 下一步要做什么取决于存储和目标分支(我称之为ORIGINALBRANCH)现在所在位置之间的关系 选项1-正常重新设置隐藏分支的基础(自隐藏以来发生了大量变化) 如果你在原来的分支机构中做了很多改变,那么你可能会像对待任何本地分支机构一样对待STASHBRANCH。在StathBranch中提交您的更改,在ORIGINALBRANCH上重新设置其基础,然后切换到ORIGINALBRANCH并在其上重新设置/合并StathBranch更改。如果存在冲突,则正常处理(这种方法的优点之一是您可以看到并解决冲突) 选项2-重置原始分支以匹配隐藏(自隐藏后的有限更改) 如果您只是在保留某些暂存更改的同时进行了隐藏,然后提交,并且您所要做的就是获取在隐藏时未暂存的其他更改,那么您可以执行以下操作。它将切换回原始分支和索引,而不更改工作副本。最终结果将是在工作副本中额外隐藏更改
git symbolic-ref HEAD refs/heads/ORIGINALBRANCH
git reset
背景
隐藏是分支/标记(不是补丁)
PS,将隐藏视为补丁很有诱惑力(就像将提交视为补丁一样),但隐藏实际上是创建时针对头部的提交。当你申请/弹出时,你正在做一些类似于cherry的事情,将其挑选到你当前的分支中。请记住,分支和标记实际上只是对提交的引用,因此在许多方面,隐藏、分支和标记只是指向提交(及其历史)的不同方式
有时需要,即使您尚未更改工作目录
PPS,您可能需要这种技术,只需将stash与--patch和/或--include untracked一起使用即可。即使不更改工作目录,这些选项有时也会创建一个隐藏,而您不能直接应用回。我必须承认我不完全明白为什么。有关讨论,请参阅。解决方案:您需要删除有问题的文件,然后再次尝试隐藏pop/apply,它应该会通过。不要删除其他文件,只删除错误中提到的文件
问题是:Git有时很烂。当运行git stash-u
时,它包含未跟踪的文件(很酷!),但不会删除这些未跟踪的文件,也不知道如何在剩余文件(不酷!)上应用隐藏的未跟踪文件,这确实使得-u
选项毫无用处。其他解决方案:
cd to/root/your/project
# Show what git will be remove
git clean -n
# If all is good
git clean -f
# If not all is good, see
git clean --help
# Finish
git stash pop
我类似的阻塞pop操作是因为剩余的忽略了文件(请参见.gitignore文件)。Git状态显示我被跟踪和未跟踪,但我的活动没有清理被忽略的文件 详细信息:我使用了
git stash save-a
,检查了主程序以进行编译并查看原始行为,然后尝试将其全部放回继续编辑。当我签出我的分支并尝试弹出时,我忽略的文件仍然存在于隐藏保存之前。这是因为主文件的签出只影响已提交的文件——它不会擦除被忽略的文件。所以pop失败了,本质上是说它不想在仍然存在的文件上恢复我隐藏的被忽略的文件。不幸的是,我无法找到一种方法来启动与他们的合并会话
最终,我使用了gitclea
git symbolic-ref HEAD refs/heads/ORIGINALBRANCH
git reset
cd to/root/your/project
# Show what git will be remove
git clean -n
# If all is good
git clean -f
# If not all is good, see
git clean --help
# Finish
git stash pop
git stash show --patch | patch -p1
rm `git ls-tree -r stash@{0}^3 --name-only`
git stash apply
git add --all
git commit -m "dummy"
rm `git ls-tree -r stash@{0}^3 --name-only`
git stash apply
git reset HEAD~1