version-control pull強制覆蓋 - 如何強制“git pull”覆蓋本地文件?




git強制pull git強制更新 (25)

您可能會發現此命令有助於丟棄本地更改:

git checkout <your-branch> -f

然後進行清理(從工作樹中刪除未跟踪的文件):

git clean -f

如果除了未跟踪的文件之外還要刪除未跟踪的目錄:

git clean -fd

如何在git pull上強制覆蓋本地文件?

場景如下:

  • 團隊成員正在修改我們正在處理的網站的模板
  • 他們正在向images目錄添加一些圖像(但忘記在源代碼管理下添加它們)
  • 他們稍後通過郵件發送圖像給我
  • 我在源控件下添加圖像並將其與其他更改一起推送到GitHub
  • 他們無法從GitHub中提取更新,因為Git不想覆蓋他們的文件。

這是我得到的錯誤:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

如何強制Git覆蓋它們? 這個人是設計師 - 通常我會手動解決所有衝突,因此服務器具有他們只需要在他們的計算機上更新的最新版本。


似乎這裡的大多數答案都集中在master分支上; 然而,有時候我在兩個不同的地方工作同一個功能分支,我希望一個中的rebase能夠反映在另一個中而沒有大量的跳躍。

基於RNA的答案和torek對類似問題 的答案的組合,我提出了這個非常有效的方法:

git fetch
git reset --hard @{u}

從分支運行它,它只會將本地分支重置為上游版本。

這可以很好地放入git別名( git forcepull ):

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

或者,在.gitconfig文件中:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

請享用!


所有這些解決方案的問題在於它們都太複雜,或者更大的問題是它們從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
  • 第一個命令獲取最新數據。

  • 第二個命令檢查是否有任何文件正在添加到存儲庫,並從本地存儲庫中刪除那些未導致文件,這會導致衝突。

  • 第三個命令檢出所有本地修改的文件。

  • 最後我們做了一個更新到最新版本,但這次沒有任何衝突,因為repo中的未跟踪文件不再存在,並且所有本地修改的文件已經與存儲庫中的相同。


我總結了其他答案。 你可以執行git pull而不會出錯:

git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull

警告 :此腳本非常強大,因此您可能會丟失更改。


我有類似的問題。 我不得不這樣做:

git reset --hard HEAD
git clean -f
git pull

這四個命令對我有用。

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

執行這些命令後檢查/拉出

git pull origin master

我嘗試了很多,但終於用這些命令取得了成功。


根據我自己的類似經驗,Strahinja Kustudic提供的解決方案是迄今為止最好的解決方案。 正如其他人所指出的那樣,簡單地進行硬重置將刪除所有未跟踪的文件,其中可能包含許多您不想刪除的內容,例如配置文件。 更安全的是,僅刪除即將添加的文件,並且就此而言,您可能還想要簽出任何即將更新的本地修改文件。

考慮到這一點,我更新了Kustudic的腳本來做到這一點。 我還修正了一個拼寫錯誤(原版中缺少')。

#/bin/sh

# 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
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull

像Hedgehog一樣,我認為答案很糟糕。 但是雖然刺猬的答案可能會更好,但我認為它並不像它那樣優雅。 我發現這樣做的方法是使用“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”是選項名稱,“他們的”是該選項的值。 如果存在衝突,您選擇使用“他們的”更改,而不是“您的”更改。


不要與git pull合併,試試這個:

git fetch --all

其次是:

git reset --hard origin/master


儘管存在最初的問題,但最常見的答案可能會給遇到類似問題但又不想丟失本地文件的人帶來問題。 例如,請參閱Al-Punk和crizCraig的評論。

以下版本將您的本地更改提交到臨時分支( tmp ),檢出原始分支(我​​假設是master分支)並合併更新。 你可以用stash做到這一點,但我發現簡單地使用分支/合併方法通常更容易。

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

git fetch origin master
git merge -s recursive -X theirs origin master

我們假設其他存儲庫origin master


我知道一種更簡單,更少痛苦的方法:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

而已!


我閱讀了所有的答案,但我正在尋找一個命令來做到這一點。 這就是我做的。 為.gitconfig添加了一個git別名

[alias]
      fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"

運行您的命令

git fp origin master

相當於

git fetch origin master
git reset --hard origin/master

我有一個奇怪的情況, git cleangit resetgit clean 。 我必須在每個未跟踪的文件上使用以下腳本從git index刪除衝突的文件:

git rm [file]

然後我能夠拉得很好。


將索引和頭部重置為origin/master ,但不要重置工作樹:

git reset origin/master

首先,嘗試標準方式:

git reset HEAD --hard # Remove all not committed changes

如果上面沒有幫助,你不關心你未跟踪的文件/目錄(以後是先備份),請嘗試以下簡單步驟:

cd your_git_repo  # where 'your_git_repo' is your git repository folder
rm -rfv *         # WARNING: only run inside your git repository!
git pull          # pull the sources again

這將刪除所有git文件(除了.git/ dir,你有所有提交)並再次拉它。

為什麼git reset HEAD --hard在某些情況下會失敗?

  1. .gitattributes file自定義規則

    在.gitattributes中使用eol=lf規則可能會導致git通過在某些文本文件中將CRLF行結尾轉換為LF來修改某些文件更改。

    如果是這種情況,你必須提交這些CRLF / LF更改(通過在git status下查看它們),或者嘗試: git config core.autcrlf false以臨時忽略它們。

  2. 文件系統不兼容

    當您使用不支持權限屬性的文件系統時。 在示例中,您有兩個存儲庫,一個在Linux / Mac( ext3 / hfs+ )上,另一個在基於FAT32 / NTFS的文件系統上。

    正如您所注意到的,有兩種不同類型的文件系統,因此不支持Unix權限的文件系統基本上無法重置不支持該類權限的系統上的文件權限,所以無論如何 - 你試試看,git總會發現一些“變化”。


我認為有兩種可能的衝突原因,必須單獨解決,據我所知,上述答案都不涉及兩者:

  • 需要刪除未跟踪的本地文件,手動(更安全)或按照其他答案中的建議刪除,通過git clean -f -d

  • 還需要刪除不在遠程分支上的本地提交。 IMO實現這一目標的最簡單方法是: git reset --hard origin/master (通過你正在處理的任何分支替換'master',並首先運行git fetch origin


我有同樣的問題。 沒有人給我這個解決方案,但它對我有用。

我通過以下方式解決了

  1. 刪除所有文件。 只留下.git目錄。
  2. git reset --hard HEAD
  3. git pull
  4. git push

現在它有效。


一種更簡單的方法是:

git checkout --theirs /path/to/file.extension
git pull origin master

這將使用git上的文件覆蓋您的本地文件


看起來最好的方法是先做:

git clean

要刪除所有未跟踪的文件,然後繼續使用通常的git pull ...


試試這個:

git reset --hard HEAD
git pull

它應該做你想要的。


要求:

  1. 跟踪當地的變化,因此這裡沒有人會失去它們。
  2. 使本地存儲庫與遠程源存儲庫匹配。

解:

  1. 存儲本地更改。
  2. 使用乾淨文件目錄 獲取 ,忽略.gitignore硬復位原點

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    

重要提示:如果您有任何本地更改,它們將丟失。 無論有沒有--hard選項,任何未被推送的本地提交都將丟失。 [*]

如果您有任何未被 Git跟踪的文件(例如上傳的用戶內容),則這些文件不會受到影響。

我認為這是正確的方法:

git fetch --all

然後,您有兩個選擇:

git reset --hard origin/master

或者如果你在其他分支上:

git reset --hard origin/<branch_name>

說明:

git fetch從遠程下載最新版本而不嘗試合併或重新綁定任何內容。

然後git reset將master分支重置為剛剛獲取的分支。 --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

未提交的更改

然而,未提交的更改(即使是暫存的)也將丟失。 確保存儲並提交您需要的任何內容。 為此,您可以運行以下內容:

git stash

然後重新應用這些未提交的更改:

git stash pop

獎金:

在談到之前答案中的拉/取/合併時,我想分享一個有趣且富有成效的技巧,

git pull --rebase

上面的命令是我Git生活中最有用的命令,節省了大量的時間。

在將新提交推送到服務器之前,請嘗試此命令,它將自動同步最新的服務器更改(使用fetch + merge),並將您的提交放在Git日誌的頂部。 無需擔心手動拉/合併。

“git pull --rebase”中查找詳細信息


我有同樣的問題,由於某種原因,即使是一個git clean -f -d也不會這樣做。 原因如下:出於某種原因,如果您的文件被Git忽略(通過.gitignore條目,我認為),它仍然困擾用稍後的拉取覆蓋它,但乾淨不會刪除它,除非你添加-x


添加/刪除文件以獲得您想要的方式:

git rm classdir
git add sourcedir

然後修改提交:

git commit --amend

之前的錯誤提交將被編輯以反映新的索引狀態 - 換句話說,它就像你從來沒有犯過錯誤。

請注意,只有在尚未推送的情況下才應執行此操作。 如果你已推,那麼你只需要正常提交修復。







git version-control overwrite git-pull git-fetch