最近遇到2个具体的问题:

  1、我们有个工程里面有几个外部jar包,这几个jar包经常会更新,更新的时候如果是在eclipse中执行的,由于windows文件机制,所以会报错无法覆盖这几个jar包。虽然git pull失败了,但是却出现了一个很严重的问题,就是许多未修改的文件被标记为已修改,另一个同事改的许多文件都变成了空文件。这个问题出现过2次,最后都是以手工reset + 手工合并的方式解决的问题。

  2、今天我新增了一部分源码,同时在pom文件中引入了一个我自己的jar包,在commit后进行git pull+merge的过程中出现了一个conflict,手工解决完conflict发现了和1类似的错误:即许多未修改文件被标记为已修改。

  排查过程:

  首先,我提交了pom文件:

  git commit pom.xml -m "merge pom"

  git merge

  发现依旧报错:  

fatal: You have not concluded your merge (MERGE_HEAD exists).
Please, commit your changes before you merge.

  然后我查询了git状态:

  git status

  发现了问题:

On branch master
Your branch and 'origin/master' have diverged,
and have and different commits each, respectively.
(use "git pull" to merge the remote branch into yours) All conflicts fixed but you are still merging.
(use "git commit" to conclude merge) Changes to be committed:
底下一大堆我没修改过的文件

  然后我stash了一遍更改,重新执行了一次上述操作,发现此刻问题可以复现,那么就好多了,至少能找到稳定触发的原因和解决方案。

  再stash一遍(解决时reset更好,我这里为了保存问题),在未进行git pull时去eclipse中的team -> synchronize workspace查看哪些文件和远程端不同,发现就是出问题的那些文件。

  事实:

  1、git merge时出现了问题,不论是jar包无法覆盖或者conflict。

  2、出问题之后文件错误都是提交在本地上次pull之后的文件。

  3、一些新文件本地在pull之后会创建出来,只不过里面是空文件,而源会有数据内容。

  4、远端是一个bare仓库。创建时是git init --bare 而不是git init。

  我个人的推论(猜的,需要验证):

  1、windows+git在使用过程中执行merge是有先后顺序的,即先对即将merge进来的文件做一次修改,最后统一关闭所有修改过后的文件。

  2、如果在中途出现了错误,那么此时关闭文件这项操作应该没有执行成功,也就是说merge没有保存。

  3、但是由于最后修改时间的变化,或者是新文件创建,所以git认定这些文件是新版本,所以被标记为了待commit。

  4、如果这时你commit了并且push了,那就会把别人写的代码变为空。。。

  5、但是之前用git init创建的仓库似乎没有这个问题?

  虽然猜测是这么个原因,但是不太确定如何验证,毕竟试了许多关键字在stackoverflow和搜索引擎上都没搜到对应的信息。我今天又不想去发mail,又不想看源码,所以先找个解决方案,以后再考虑彻底解决。

  解决方案:

  把冲突文件回滚到之前不冲突的状态,然后先pull,再修改完push上去。

  1、查看历史版本

  git log pom.xml

  2、回退

  git reset xxxxxxxxxxxxxxxx

  3、提交一下,毕竟reset了

  git commit -m "reset pom"

  4、本地diff有更新,版本虽然回退了,但是文件还是修改后的,先checkout回reset之后的版本。

  git checkout pom.xml

  5、看一看是不是没修改了

  git diff

  6、拉

  git pull

  7、然后找到之前存起来的pom.xml,把自己做的修改再加上。然后commit+push

  git commit -m "add package guinai in pom.xml"

  git push

  顺利完成。

在windows+eclipse+git遇到的未修改文件被标记为已修改的问题的更多相关文章

  1. Windows下Git Bash中VIM打开文件中文乱码

    Windows下Git Bash中VIM打开文件中文乱码,解决方法是: 步骤一 admin@DESKTOP-O99620V MINGW64 /d/项目GGE/Hard_for_GGE (master) ...

  2. 如何修改文件的 “创建时间” 和 “修改时间”(Windows Linux macOS)

    请访问原文链接:https://sysin.org/blog/how-to-change-file-date,查看最新版.原创作品,转载请保留出处. 作者:gc(at)sysin.org,主页:www ...

  3. python 修改文件的创建时间、修改时间、访问时间

    目录 python 修改文件创建.修改.访问时间 方案一 方案二(无法修改文件创建时间) python 修改文件创建.修改.访问时间 突如其来想知道一下 python 如何修改文件的属性(创建.修改. ...

  4. Windows学习总结(4)——Host文件的作用和如何修改Host文件

    本经验将为您介绍,什么是Host文件,Host文件作用,Host文件的位置等信息,以帮忙您了解Host文件. 方法/步骤 什么是HOST文件: Hosts是一个没有扩展名的系统文件,其基本作用就是将一 ...

  5. Git本地有未提交文件,直接拉取远端最新版本

    git pull = git fetch + git merge 1.修改不同的文件: 用户D和用户L在本地提交中修改了不同的文件,如果用户D将改动推送到服务器后,用户L再推送就会遇到非快进式推送错误 ...

  6. windows eclipse IDE打开当前类所在文件路径

    1. 展开如下菜单: Run ---- External Tools ---- External Tools Configurations 2. 在 program 下面新建一个工具 program- ...

  7. C#/.NET 读取或修改文件的创建时间和修改时间

    手工在博客中添加 Front Matter 文件头可是个相当费事儿的做法,这种事情就应该自动完成. .NET 中提供了非常方便的修改文件创建时间的方法,使用这种方法,能够帮助自动完成一部分文件头的编写 ...

  8. linux仅修改文件夹权限 分别批量修改文件和文件夹权限

    比如我想把/var/www/html下的文件全部改成664,文件夹改成775,怎么做呢 方法一: 先把所有文件及文件夹改成664,然后把所有文件夹改成775 chmod -R 664 ./ find ...

  9. 使用Inno Setup函数修改文件内容

    0.inno打开文件操作&字符串操作所需函数原型及解释 function LoadStringsFromFile(const FileName: String; var S: TArrayOf ...

随机推荐

  1. node环境配置

    1.进入node的官网https://nodejs.org/en/download/ 2.选择自己需要的安装包 3.下载之后,直接安装http://www.runoob.com/nodejs/node ...

  2. React_基本原理_ajax

    React 基本原理 初始化显示界面 创建虚拟DOM树 渲染到 原生 DOM 树 绘制界面显示 更新界面 setState() 更新状态机 重新创建虚拟 DOM 树 新/旧树比较差异 (执行一次 DO ...

  3. Windows中使用ssh利用公钥登入远程服务器

      方式:使用 Winscp 密钥登录   我们平时开发多会使用 ftp 来上传下载文件,尤其是很多 Linux 环境下.   其实 Linux 默认是不提供 ftp 的,需要你额外安装 FTP 服务 ...

  4. 逆向工程-真码保存在系统文件破解QQ游戏对对碰助手

    1)注册栏中输入任意值测试 1.2)记录弹出的关键字对话框 2.1)发送至PEID进行查壳 2.2)发现无壳 2.3)将软件载入OllyDBG程序 2.4)在反汇编栏下右键选择中文搜索引擎->智 ...

  5. Jumpserver之快速入门

    一,系统设置 1.1基本设置 修改 url 的"localhost"为你的实际 url 地址, 否则邮件收到的地址将为"localhost" 也无法创建新用户 ...

  6. 关于vue页面多了之后,webpack热更新速度慢的解决办法

    vue项目大了之后,每次热更新都要10多秒的时间, 网上找了一大堆发现一个有用的办法 "env": { "development":{ "plugin ...

  7. iview 表单非空验证

    rules: { title: [ {required: true, message: '请填写栏目名称', trigger: 'blur'} ], desc: [ {required: true, ...

  8. 严重:one or more listeners failed. Full details will be found in the appropriate container log file

    one or more listeners failed. Full details will be found in the appropriate container log file   这句话 ...

  9. 8、D8: Default interface methods are only supported starting with Android N (--min-api 24): void

    1.错误信息 升级完 Android N 后,有些项目运行起来报错信息大致如下: Default interface methods are only supported starting with ...

  10. Servlet服务器、客户端跳转

    服务期跳转.服务器端转发.服务器端重定向是一个意思使用“req.getRequestDispatcher(“跳转路径”).forward(req,resp)”实现服务器端转发 客户端发送请求后数据传输 ...