pull強制覆蓋 - git重新拉取




如何強制“git pull”覆蓋本地文件? (20)

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

場景如下:

  • 團隊成員正在修改我們正在處理的網站的模板
  • 他們正在向images目錄添加一些圖像(但忘記在源代碼管理下添加它們)
  • 他們稍後通過郵件發送圖像給我
  • 我在源控件下添加圖像並將其與其他更改一起推送到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從遠程下載最新版本而不嘗試合併或重新綁定任何內容。

然後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刪除所有未跟踪的文件/目錄,無法撤消。

有時只是clean -f沒有幫助。 如果您有未跟踪的DIRECTORIES,還需要-d選項:

# WARNING: this can't be undone!

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

警告: git clean刪除所有未跟踪的文件/目錄,無法撤消。

首先考慮使用-n ( - --dry-run )標誌。 這將顯示在沒有實際刪除任何內容的情況下將刪除的內容:

git clean -n -f -d

輸出示例:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...

一種更簡單的方法是:

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

這將使用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}"

請享用!


做就是了

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

因此,您可以避免所有不必要的副作用,例如刪除您想要保留的文件或目錄等。


儘管存在最初的問題,但最常見的答案可能會給遇到類似問題但又不想丟失本地文件的人帶來問題。 例如,請參閱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 reset --hard HEAD~5

這將帶你回五次提交然後再回來

git pull

我發現通過查找如何撤消Git合併


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

git checkout <your-branch> -f

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

git clean -f

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

git clean -fd

我剛剛解決了這個問題:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

最後一個命令列出了本地更改的列表。 繼續修改“tmp”分支,直到它可以接受,然後合併回master:

git checkout master && git merge tmp

下次你可以通過查找“git stash branch”以更乾淨的方式處理這個問題,雖然stash可能會讓你在前幾次嘗試時遇到麻煩,所以首先要對非關鍵項目進行實驗......


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

我通過以下方式解決了

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

現在它有效。


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


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

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

而已!


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

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

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


我閱讀了所有的答案,但我正在尋找一個命令來做到這一點。 這就是我做的。 為.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

所有這些解決方案的問題在於它們都太複雜,或者更大的問題是它們從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 clean

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


而不是做:

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

我建議做以下事情:

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

如果要重置為origin / master分支,是否需要獲取所有遙控器和分支?


試試這個:

git reset --hard HEAD
git pull

它應該做你想要的。


這四個命令對我有用。

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

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

git pull origin master

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





git-fetch