我的本地仓库处于一种状态,禁止我提交,藏匿,结账到另一个分支,甚至放弃更改。所以我只是卡住了。
我将尽力描述在我记忆中哪些步骤让我了解这种情况。
请坐下。
不久前,在远处的另一台计算机上...... 项目中另一个开发标准化的crlf根据:https://help.github.com/articles/dealing-with-line-endings
同时(你知道,光速......)我在当地进行了一些改动,提交和拉动。
当我拉Git说:
error: Your local changes to the following files would be overwritten by merge:
wp-config.php
wp-config.php
之前已使用git update-index --assume-unchanged wp-config.php
从索引中删除,因为它的模板配置文件适用于每个本地环境。
基础“模板”可以更改。没什么好惊讶的。这就是我的计划:
wp-config.php
stash
我自己的配置更改pull origin master
stash apply
我的配置回来了第3步出现问题。git pull origin master
仍然引发了上述错误,就像存储无效一样。
git status
表示wp-config.php
的修改没有进行提交。在藏匿之后,这让我感到惊讶。
由于我隐藏了我的更改,我跑了git checkout -- wp-config.php
...但没有任何效果!文件仍未进行提交。
由于我生气了,我创建了一个新的分支my-config,添加并提交wp-config.php
,然后切换回master,删除wp-config.php
(使用git rm
),合并起源/主人......成功!
所以现在主人是最新的和干净的,我计划在没有Git帮助的情况下恢复我自己的配置(手动编辑文件)。
由于我想知道发生了什么,我切换到my-config分支,并尝试了一个非常简单的操作:
git stash
git stash apply
猜猜是什么? stash apply
未能说:
error: Your local changes to the following files would be overwritten by merge:
wordpress/license.txt
wordpress/readme.html
...
(all the files that where modified by the crlf conversion)
现在我被困在我的分支上(计划看到它,法语国家会理解;))因为:
git stash apply
,commit
和checkout master
提供上述错误git stash
生成一个存储条目,但不会更改未暂停状态git checkout -- <file>
均未删除未暂停状态我现在唯一能做的就是删除所有这些文件(使用操作系统rm
),以便能够返回到主分支。
真实的故事。
我很想了解主分支上发生的事情,然后是my-config分支,以及是什么让我遇到了这种情况(我怀疑在crlf转换文件上使用存储)。
重要说明:
git core.autocrlf
在input
.gitattributes
与“处理行结尾”一文中的内容相同当我在my-config分支上stash
时,它输出了:
warning: CRLF will be replaced by LF in wordpress/license.txt.
The file will have its original line endings in your working directory.
... (one for each crlf converted file) ...
Saved working directory and index state WIP on my-config: dbf65ad my config -- should not be pushed
HEAD is now at dbf65ad my config -- should not be pushed
(dbf65ad
是我在my-config分支上做的唯一提交)
答案 0 :(得分:5)
经过一番研究后,我发现以下情况发生了。你的同事改变了造成第一次拉动冲突的线头。
这就是为什么你把你的工作藏起来,拉出东西(现在没有问题)并开始再次申请藏匿处。
通过调用git stash apply
git启动隐藏更改的recursive merge。
错误消息告诉您遇到合并冲突。根据开发人员的stash-documentation,解决冲突后git stash drop
可以解决这个问题:
“应用[stash]可能会因冲突而失败;在这种情况下,它不会 从隐藏列表中删除。您需要手动解决冲突 然后手动拨打
git stash drop
。“
结论:如果必须在现有项目中完成行尾的配置,那么最佳做法似乎是在项目文件夹中使用.gitattributes
。由于它与您的行结束更改提交一起分发,因此可以避免将当前工作转换为新的规范化标准。
根据.gitattributes
的开发人员文档,您可以使用以下步骤更改所有文件的行结尾(在活动分支中):
$ echo "<<filepattern>> eol=lf" >>.gitattributes
$ rm .git/index # Remove the index to force Git to
$ git reset # re-scan the working directory
$ git status # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"
将<<filepattern>>
替换为与您的源文件匹配的模式 - 在您的情况下*.py
替换python文件(在此.gitignore
-description中给出了良好的模式解释)。
如果您要添加多个文件模式,则可以向.gitattributes
添加多个行结尾定义。
注意:由于第二步需要删除
.git/index
(特定于分支),因此必须在您要保留的每个分支中执行此操作。
如果要处理许多分支,可以考虑编写一个简短的脚本iterating through your git branches。
答案 1 :(得分:1)
重置本地模块的最佳方法是使用
git clean -f -x -d
这有效地删除了对本地模块的所有未跟踪更改,并将其重新置于'vanilla'状态。
-f
清理文件。
{。1}}通常被.gitignore忽略的文件。
-x
清理目录。
现在运行-d
。这会将分支重置为远程状态。
git reset --hard origin/<BRANCH_NAME>
此时应告诉您:
git status
如果您的实际更改被隐藏起来,那么您应该能够# On branch master
nothing to commit (working directory clean)
将它们正确放回。
如果git stash apply
显示的更改次数超出预期,您只需应用git stash show stash@{0}
即可查看的内容。
希望这有帮助
答案 2 :(得分:0)
首先,关于GitHub帮助页面,我会认真地建议设置:
git config --global core.autocrlf false
让我们保留对.gitattributes
files中明确声明的修改,而不是全局规则:keep core.autocrlf
to false。
其次,您可以看到git stash
使用git update-index --skip-worktree
观察到相同的eol修改。