From github.com:26huitailang/learn-sth-everyday
7cf57b0..d9f7ae2 master -> origin/master
Updating 7cf57b0..d9f7ae2
error: Your local changes to the following files would be overwritten by merge:
liaoxuefeng/awesome-python-webapp/LICENSE
Please, commit your changes or stash them before you can merge.
Aborting
起因:在家裡臺式更新了檔案並同步到遠端,而另外一臺電腦在本地修改了檔案沒有提交到庫中。
解決辦法:
處理的方式非常簡單,主要是使用git stash命令進行處理,分成以下幾個步驟進行處理。
1. git stash將本地修改儲存起來
git stash
儲存當前的工作進度,會分別對暫存區和工作區的狀態進行儲存 。用git stash list可以顯示進度列表,也暗示了git stash可以多次儲存工作進度,並在恢復的時候進行選擇。
其中stash@{}這樣標記的就是剛才儲存的資訊。WIP表示work in progress,就是工作區的意思。
2. git pull遠端到本地
儲存了本地進度之後,就可以pull了,git pull相當於git fetch和git merge兩個操作。
git pull
可以看到我的本地資訊被遠端的覆蓋掉了。remote file changed是我在github上直接提交的commit。覆蓋了我原生的另外一句話。
不用擔心,因為我們儲存了原生的工作進度,可以從stash list中恢復之前的資訊。
3. 還原暫存區的內容
git stash pop stash@{1}
or
git stash apply stash@{1}
此時,遇到了另外一個問題,提示:
fatal: ambiguous argument 'stash@': unknown revision or path not in the working tree.
因為我使用的是powershell上操作,在SO上找到的答案:
Your shell is eating your curly brackets, so while you say stash@{1}, git sees stash@1 and that makes no sense to it. Quote the argument or reconfigure your shell to only expand curly brackets when there is a comma between them (zsh can be configured either way, bash only expands curly brackets with comma or range between them, other shells may behave one or other way).
簡而言之,windows上為了escape {}被吃掉,加上backtick `就好。
$ git stash apply stash@`{1`}
系統可能提示如下類似的資訊:
意思就是系統自動合併修改的內容,但是其中有衝突,需要解決其中的衝突。
4. 解決檔案中衝突的的部分
直接開啟檔案衝突的檔案。
其中Updated upstream 和=====之間的內容就是pull下來的內容,====和stashed changes之間的內容就是本地修改的內容。碰到這種情況,git也不知道哪行內容是需要的,所以要自行確定需要的內容。完成後再執行提交操作。
會用mergetool的也可以用這個工具去做。
5. 最後記得git stash clear刪除進度列表,不然用的多了會stash list會變得很複雜。