最近遇到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. Dreamweaver编辑区下方的属性栏显示

    显示属性栏 不小心关闭了Dreamweaver的属性栏,突然用到之后不知道怎么显示,此时需要两步:选择[窗口]工具栏,选择[属性]选项. 此时又可以看到编辑区下方的属性栏了,而且出于编写代码的需要可以 ...

  2. STS的安装以及IDEA安装和破解过程

    一.STS的下载 1·下载地址:直接百度搜索STS,选择Download STS 3 2.选择电脑对应的版本 直接下载 3.安装包解压后在有jdk的情况下就可以直接使用 二.IDEA的安装 下载网址: ...

  3. connect socket的超时设置

    最近项目中,有个需求是检测某ip地址是否是通的,使用了socket的connect函数.但是,当ip地址写错的话,connect就会一直阻塞在那里,大概2.3分钟才能返回连接失败.这对于用户来说是不可 ...

  4. 问题11:web前端开发规范手册(转)

    一.规范目的 1.1  概述 ..................................................................................... ...

  5. Robot Framework 1

    about Robot, learnt from the following document, perfect document !!!! http://www.virtuousprogrammer ...

  6. /etc/init.d/sshd配置SSHD路径忘记修改导致启动失败

    [root@lnlte2dmr3 ~]# bash[root@lnlte2dmr3 ~]# install -v -m700 -d /var/empty/sshdinstall: 正在创建目录&quo ...

  7. 转 linux安装jdk环境(多种方式)

    linux系统通用安装通过tar.gz压缩包安装此方法适用于绝大部分的linux系统 1.先下载tar.gz的压缩包,这里使用官网下载. 进入: http://www.oracle.com/techn ...

  8. 新建的小程序没有app.js,app.json等文件

    因为在创建的时候没有勾选 建立普通快速启动模板,而我在创建的时候没有发现有这个选项可以选择. 解决办法:把之前创建过的文件夹整个删掉,不能只删内容.然后再重新新建项目,就会出现  建立普通快速启动模板 ...

  9. 学习Makefile

    1> 编译一个文件2> 编译多个文件3> 编译多个目录下的文件4> inclue makefile5> 使用规则1>target:depend[tab]cmddep ...

  10. @RequestParam @PathVariable

    1.Request参数 在访问各种各样网站时,经常会发现网站的URL的最后一部分形如:?xxxx=yyyy&zzzz=wwww.这就是HTTP协议中的Request参数,它有什么用呢?先来看一 ...