git pull
如何強製覆蓋本地文件呢?
情景如下:
-
團隊成員正在修改我們正在處理的網站的模板
-
他們正在添加一些圖像到圖像目錄(但忘記在源代碼控製下添加它們)
-
他們通過郵件將圖像發送給我
-
我在源代碼控製下添加圖像,並將其與其他更改一起推送到GitHub
-
他們不能從GitHub提取更新,因為Git不可覆蓋他們的文件。
得到的錯誤是:
error: Untracked working tree file ‘public/images/icon.gif’ would be overwritten by merge.
我如何強製Git覆蓋它們?
最佳解決方法
重要提示:如果您有任何本地更改,將會丟失。無論是否有--hard
選項,任何未被推送的本地提交都將丟失。
如果您有任何未被Git跟蹤的文件(例如上傳的用戶內容),這些文件將不會受到影響。
下麵是正確的方法:
git fetch --all
然後,你有兩個選擇:
git reset --hard origin/master
或者如果你在其他分支上:
git reset --hard origin/<branch_name>
說明:
git fetch
從遠程下載最新的,而不嘗試合並或rebase任何東西。
然後git reset
將主分支重置為您剛剛獲取的內容。 --hard
選項更改工作樹中的所有文件以匹配origin/master
中的文件
[*]:值得注意的是,在重置之前可以通過從master
創建一個分支來維護當前的本地提交:
git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master
在此之後,所有舊的提交都將保存在new-branch-to-save-current-commits
中。然而,沒有提交的更改(即使staged)將會丟失。確保存儲和提交任何你需要的東西。
次佳解決方法
嘗試這個:
git reset --hard HEAD
git pull
第三種解決方法
警告:git clean
刪除所有未跟蹤的文件/目錄,不能撤消。
有的時候隻有clean -f
無效。如果你沒有跟蹤DIRECTORIES,-d選項也需要:
git reset --hard HEAD
git clean -f -d
git pull
警告:git clean
刪除所有未跟蹤的文件/目錄,不能撤消。
第四種方法
可行的方式是通過使用”fetch”和”merge”定義的策略。這應該能使你的本地修改保留下來,隻要它們不是你試圖強製覆蓋的文件之一。
首先做一個你的改變
git add *
git commit -a -m "local file server commit message"
然後獲取更改並覆蓋,如果有衝突
git fetch origin master
git merge -s recursive -X theirs origin/master
“-X”是選項名稱,”theirs”是該選項的值。如果存在衝突,則選擇使用”their”更改,而不是”your”更改。
第五種方法
這是另外的思路,不建議上文的做法:
git fetch --all
git reset --hard origin/master
而是建議這樣做:
git fetch origin master
git reset --hard origin/master
如果你打算重新設置原點/主分支,沒有必要獲取所有的遙控器和分支
第六種方法
看起來最好的辦法是先做:
git clean
刪除所有未跟蹤的文件,然後繼續使用通常的git pull
…
第七種方法
所有這些解決方案的問題是,它們都是太複雜,或者更大的問題是,他們從Web服務器中刪除所有未跟蹤的文件,這是我們不想要的,因為總是有需要的配置文件服務器,而不是在Git倉庫。
這是我們正在使用的最幹淨的解決方案:
# Fetch the newest code
git fetch
# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
rm -f -- "$file"
done
# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
git checkout -- "$file"
done
# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
-
第一個命令獲取最新的數據。
-
第二個命令檢查是否有任何正在添加到存儲庫的文件,並從本地存儲庫中刪除那些會導致衝突的未跟蹤文件。
-
第三個命令checks-out所有在本地修改的文件。
-
最後,我們將更新到最新版本,但是這次沒有任何衝突,因為repo中的未跟蹤文件不再存在,所有本地修改的文件已經與存儲庫中的相同。