1. 程式人生 > >【Debug-git】error:. local changes to the following files would be overwritten by merge:.idea/misc.xml

【Debug-git】error:. local changes to the following files would be overwritten by merge:.idea/misc.xml

公司、個人編譯環境可能是有某些不為人知的差異,每次用git命令pull的時候,總會遇到一些奇葩問題,比如:

...done.
Resolving deltas: 100% (55/55), completed with 29 local objects.
From https://git.xxxx.xxx/xxxxxxxx/xxxxxx
 * branch            master     -> FETCH_HEAD
   9******..******d  master     -> origin/master
error: Your local changes to the following files would be overwritten by merge:
        .idea/misc.xml
Please commit your changes or stash them before you merge.
Aborting
Updating 9******..******d

前兩次因為時間的原因,要麼把這個被覆蓋的“.idea/misc.xml”本地檔案刪掉,要麼直接生氣了刪掉本地專案重新clone。

這終究不是一個辦法,今天解決一下吧。

首先,這個檔案是什麼?

【.idea/misc.xml】

知乎上的一個回答是醬紫的:

.idea  #ide 相關
*.apk  #optional

是在系統預設的.gitignore檔案基礎上額外新增的,如果不加 .idea的話會存在不同開發人員開發機上.idea/下檔案不同,導致需要提交的問題。而且經過我和團隊小夥伴之間的實踐.idea目錄下的東西AS都會自動生成,並不需要提交到倉庫中

開啟看一眼這個檔案裡都有啥:

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="NullableNotNullManager">
    <option name="myDefaultNullable" value="android.support.annotation.Nullable" />
    <option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
    <option name="myNullables">
      <value>
        <list size="5">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
          <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
          <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
          <item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
        </list>
      </value>
    </option>
    <option name="myNotNulls">
      <value>
        <list size="4">
          <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
          <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
          <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
          <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
        </list>
      </value>
    </option>
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8 (9)" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

【.idea/modules.xml】

這個檔案告訴編譯器你要有哪幾個子專案,不分主次。在Android Studio中開啟看一眼:

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <!--module指定需要編譯lib或者主程式絕對路徑、相對路徑-->
      <module fileurl="file://$PROJECT_DIR$/ExportJar.iml" filepath="$PROJECT_DIR$/ExportJar.iml" />
      <module fileurl="file://$PROJECT_DIR$/child/child.iml" filepath="$PROJECT_DIR$/child/child.iml" />
    </modules>
  </component>
</project>

【根目錄.iml】

iml檔案是一個工程配置檔案。這個檔案的作用見如下注釋部分:

<?xml version="1.0" encoding="UTF-8"?>
<module type="PLUGIN_MODULE" version="4">
  <component name="DevKit.ModuleBuildProperties" url="file://$MODULE_DIR$/resources/META-INF/plugin.xml" /><!--intellij外掛配置檔案-->
  <component name="NewModuleRootManager" inherit-compiler-output="true"><!--使用預設編譯輸出目錄,編譯器會將編譯的class檔案放到此目錄中-->
    <exclude-output />
    <content url="file://$MODULE_DIR$"><!--指定專案根目錄-->
      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /><!--指定Source原始碼目錄-->
      <sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" /><!--指定資原始檔目錄-->
    </content>
    <orderEntry type="inheritedJdk" /><!---->
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="module" module-name="child" /><!--指定lib模組-->
  </component>
</module>

這幾個檔案中,【根目錄.iml】檔案沒什麼爭議,一般需要放進【.gitignore】中讓git自動忽略,但【根目錄.idea】資料夾下的檔案我的git只忽略了兩個檔案,我的“.gitignore”檔案預設忽略的是:

*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild

查了一下,2015年之前早期的回答中,大家配置的忽略檔案都比較多,【.idea/misc.xml】【.idea/modules.xml】都在“.gitignore”之列,更有甚者整個【.idae】資料夾都在忽略之內。而近期的回答中,基本與本人的“.gitignore”無異。鑑於上文知乎科學家的建議,本人試一下把這兩個檔案手動新增到“.gitignore”之列試試。

/.idea/misc.xml
/.idea/modules.xml

先這麼著吧~