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

  最近遇到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 1 and 2 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

  顺利完成。

原文地址:https://www.cnblogs.com/gaoze/p/9593563.html