解決因爲本地代碼和遠程代碼衝突,導致git pull無法拉取遠程代碼的問題

一、問題

  當本地代碼和遠程代碼有衝突的時候,執行git pull操作的時候,會提示有衝突,然後直接終止本次pull,查了些資料沒有找到強制pull的方式,但是可以使用如下方式解決。

 

二、解決思路

  可以先將本地內容stash到倉庫中,執行stash操作後,本地代碼將返回到修改前的內容。這時,就可以正常將遠程代碼下載到本地了。然後再通過stash操作將倉庫中的內容合到本地,如果有衝突就可以進行解決了。

  git stash命令主要用於以下情形:

  • 發現有一個類是多餘的,想刪掉它又擔心以後需要查看它的代碼,想保存它但又不想增加一個髒的提交。這時就可以考慮git stash
  • 使用git的時候,我們往往使用分支(branch)解決任務切換問題,例如,我們往往會建一個自己的分支去修改和調試代碼, 如果別人或者自己發現原有的分支上有個不得不修改的bug,我們往往會把完成一半的代碼commit提交到本地倉庫,然後切換分支去修改bug,改好之後再切換回來。這樣的話往往log上會有大量不必要的記錄。其實如果我們不想提交完成一半或者不完善的代碼,但是卻不得不去修改一個緊急Bug,那麼使用git stash就可以將你當前未提交到本地(和服務器)的代碼推入到Git的棧中,這時候你的工作區間和上一次提交的內容是完全一樣的,所以你可以放心的修Bug,等到修完Bug,提交到服務器上後,再使用git stash apply將以前一半的工作應用回來。
  • 經常有這樣的事情發生,當你正在進行項目中某一部分的工作,裏面的東西處於一個比較雜亂的狀態,而你想轉到其他分支上進行一些工作。問題是,你不想提交進行了一半的工作,否則以後你無法回到這個工作點。解決這個問題的辦法就是git stash命令。儲藏(stash)可以獲取你工作目錄的中間狀態——也就是你修改過的被追蹤的文件和暫存的變更——並將它保存到一個未完結變更的堆棧中,隨時可以重新應用。

 

三、操作命令

  1、git stash 將本地代碼stash到倉庫中。

    可以使用git stash save ***定義自己的標記,方便以後查詢

  2、git pull 將遠程代碼拉取到本地。

  3、git stash pop 將倉庫中的代碼合到本地最新代碼中。

  4、在處理bug的過程中,可能存在多次stash的操作。這時可以使用git stash list查看本地倉庫中都存儲了幾個stash版本。

  5、git stash pop默認將最近一次stash操作合併到本地代碼中,也可以通過git stash pop stash@{Number}指定將某次stash的內容合併到本地代碼中。

  6、git stash pop命令在合併代碼的同時,會把倉庫中對應的內容彈出。如果只想查看,而不想彈出內容,可以使用git stash apply命令進行操作。

  7、git stash -h 查看git stash幫助

  8、git stash show 顯示stash合併到本地代碼後,哪些文件會修改,以及修改的概述

  9、git stash show -p stash@{0} 顯示修改的詳細內容

 

 

四、從stash創建分支

  如果你儲藏了一些工作,暫時不去理會,然後繼續在你儲藏工作的分支上工作,你在重新應用工作時可能會碰到一些問題。如果嘗試應用的變更是針對一個你那之後修改過的文件,你會碰到一個歸併衝突並且必須去化解它。如果你想用更方便的方法來重新檢驗你儲藏的變更,你可以運行 git stash branch,這會創建一個新的分支,檢出你儲藏工作時的所處的提交,重新應用你的工作,如果成功,將會丟棄儲藏。

複製代碼
$ git stash branch testchanges
Switched to a new branch "testchanges"
# On branch testchanges
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#      modified:   index.html
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#
#      modified:   lib/simplegit.rb
#
Dropped refs/stash@{0} (f0dfc4d5dc332d1cee34a634182e168c4efc3359)
複製代碼

 

 

五、暫存未跟蹤或忽略的文件

  默認情況下,git stash會緩存下列文件:

  • 添加到暫存區的修改(staged changes)
  • Git跟蹤的但並未添加到暫存區的修改(unstaged changes)

  

  但不會緩存一下文件:

  • 在工作目錄中新的文件(untracked files)
  • 被忽略的文件(ignored files)

 

  git stash命令提供了參數用於緩存上面兩種類型的文件。使用-u或者--include-untracked可以stash untracked文件。使用-a或者--all命令可以stash當前目錄下的所有修改。

 

六、如果不小心把自己的內容搞丟了,可以使用git fsck --lost-found命令查看

    然後找到上述你剛纔git stash drop stash@{0}時成功刪除的id。例如: 
    Dropped stash@{0} (e2c07caec2b995ba75ce1abd15796c6f1686d532) 
    然後拷貝e2c07caec2b995ba75ce1abd15796c6f1686d532查找git fsck --lost-found列出的刪除的提交id, 
    如果有恭喜你,離找回只差一步,你可以先用 
    git show e2c07caec2b995ba75ce1abd15796c6f1686d532看一下是不是你丟棄的改動文件, 
    如果是,直接git merge e2c07caec2b995ba75ce1abd15796c6f1686d532即可找回! 

 

  至於git stash的其他命令建議參考Git manual。

 

 

參考博客:Git Stash用法

    git stash恢復

     git-stash用法小結

6.3 Git工具-儲藏(Stashing)

Git Stash 歷險記

Git Stash用法

Git Stash

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章