fatal: ambiguous argument ‘stash@‘: unknown revision or path not in the working tree.報錯解決辦法

2020-10-09 13:00:20
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會變得很複雜。