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的文件的備份,繼續本身的工做。
相關文章
相關標籤/搜索