Git 冲突:Your local changes would be overwritten by merge. Commit, stash or revert them to proceed?

解决方案有三种:git

第一种:(强烈不推荐,要被骂)无视,直接commit本身的代码。缓存

git commit -m "your msg"app

第二种:stash(强烈推荐方式)ide

    stash翻译为“隐藏”,以下操做:工具

git stash
git pull
git stash pop
而后diff一下文件,看看自动合并的状况,并做出须要的修改。idea

git stash: 备份当前的工做区的内容,从最近的一次提交中读取相关内容,让工做区保证和上次提交的内容一致。同时,将当前的工做区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工做区的相关内容。因为可能存在多个Stash的内容,因此用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的全部备份,能够利用这个列表来决定从那个地方恢复。翻译

git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。3d

3第三种 (强烈不推荐,应为会把你本身写的东西给覆盖掉了,不推荐)硬覆盖:放弃本地修改,直接用git上的代码覆盖本地代码:版本控制

git reset --hard
git pullcode


补充在 idea 中的上述操做:

第一步:右键项目名称->git->repository-> stash changes   而后填信息就能够备份了

第二步:右键项目名称->git->repository->pull

第三步:右键项目名称->git->repository->unstash changes 

第三步中可能出现Your local changes would be overwritten by merge等等状况,是由于你更pull下来的文件中你在本地保存以前有修改,

出现这种状况,点击Your local changes would be overwritten by merge下面的view,一个文件一个文件的选择,选择的时候有三个文件,

左中右,中是结果文件,左是pull下来大的文件,右是本身本地修改的文件,若是要用pull下来的文件,则选择accept left,若是要保存本地修改的,则选择accept right便可

方法 2 stash:

方法 3 硬覆盖:

经常使用git stash命令:

(1)git stash save "save message"  : 执行存储时,添加备注,方便查找,只有git stash 也要能够的,但查找时不方便识别。

(2)git stash list  :查看stash了哪些存储

(3)git stash show :显示作了哪些改动,默认show第一个存储,若是要显示其余存贮,后面加stash@{$num},好比第二个 git stash show stash@{1}

(4)git stash show -p : 显示第一个存储的改动,若是想显示其余存存储,命令:git stash show  stash@{$num}  -p ,好比第二个:git stash show  stash@{1}  -p

(5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},若是要使用其余个,git stash apply stash@{$num} , 好比第二个:git stash apply stash@{1} 

(6)git stash pop :命令恢复以前缓存的工做目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工做目录下,默认为第一个stash,即stash@{0},若是要应用并删除其余stash,命令:git stash pop stash@{$num} ,好比应用并删除第二个:git stash pop stash@{1}

(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储

(8)git stash clear :删除全部缓存的stash

 

说明:新增的文件,直接执行stash是不会被存储的,举例以下:

如上图:在git status 那一步很明显能够看出来,我修改了README,添加了新文件abc.txt,而后执行了git stash save后,在执行git stash list 能够看到刚才的save是的信息,而后使用git stash show ,只显示了README的改动被存起来了。

咱们知道,执行了git statsh 之后,被存起来的在当前目录再执行git status 就看不到了,可是咱们如今再执行git status,以下:

这个文件还在,说明没有被存起来。说白了就是没有在git 版本控制中的文件,是不能被git stash 存起来的。

那要怎么办呢,这个文件我也想存起来,很明显,先执行下git add 加到git版本控制中,而后再git stash就能够了,以下:

最后一步能够看出来,这个新增文件已经被stash了。

这个时候再执行下git status ,被存起来的在当前目录就看不到了,以下:

这个时候,想切分支就不再会报错有改动未提交了。

若是要应用这些stash,直接使用git stash apply或者git stash pop就能够再次导出来了。

总结下:git add 只是把文件加到git 版本控制里,并不等于就被stash起来了,git add和git stash 没有必然的关系,可是执行git stash 能正确存储的前提是文件必须在git 版本控制中才行。

参考的一个连接中说到了如下,我摘录此处备份下(就是只stash一部分文件):

     常规 git stash 的一个限制是它会一下暂存全部的文件。有时,只备份某些文件更为方便,让另一些与代码库保持一致。一个很是有用的技巧,用来备份部分文件:

  1. add 那些你不想备份的文件(例如: git add file1.js, file2.js)
  2. 调用 git stash –keep-index。只会备份那些没有被add的文件。
  3. 调用 git reset 取消已经add的文件的备份,继续本身的工做。
相关文章
相关标签/搜索