當前位置: 首頁>>技術問答>>正文


“git pull”如何強製覆蓋本地文件?

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中的未跟蹤文件不再存在,所有本地修改的文件已經與存儲庫中的相同。

參考文獻

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3679.html,未經允許,請勿轉載。