2013-02-28 30 views
61

我已閱讀所有關於此問題的類似問題;看起來下面沒有任何工作:Git Pull不可能,未合併的文件

Delete offending files 
git reset --hard HEAD 
git stash 
git pull 

幾乎每個組合,隱藏更改和從存儲庫拉,導致unmergable文件。我想放棄所有本地更改並只使用遠程設備,但我無法再克隆(開發人員嘗試執行此操作時帶寬和Internet使用限制)。我該怎麼做呢?

剛試過:

git stash 
git pull 

也沒有工作。

更多信息

有一個本地提交,並且上游具有一個提交爲好。因此,我試過git pull --rebase,但它仍然不能正常工作......這給了我錯誤 - 「由於未解決的衝突而退出」。如果我做git stash, git reset --hard HEAD, git pull --rebase,我得到的錯誤「拉動是不可能的,未合併的變化......」

回答

146

說的遙控器是origin和分支是master,說你已經有master簽出,可以嘗試以下操作:

git fetch origin 
git reset --hard origin/master 

這基本上只需要當前的分支,它指向的HEAD遠程分支。

警告:正如評論指出,這將扔掉你的本地修改與任何是起源覆蓋。

或者你可以使用管道命令基本上做同樣的:

git fetch <remote> 
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>) 
git reset --hard 

編輯:我想簡單介紹一下爲什麼這個工程。

.git文件夾可以保存任意數量的存儲庫的提交。由於提交散列實際上是提交內容的驗證方法,而不僅僅是隨機生成的值,因此它用於在存儲庫之間匹配提交集。

分支只是一個給定散列的命名指針。下面是一個例子集:

$ find .git/refs -type f 
.git/refs/tags/v3.8 
.git/refs/heads/master 
.git/refs/remotes/origin/HEAD 
.git/refs/remotes/origin/master 

這些文件中的每一個包含指向一個哈希承諾:

$ cat .git/refs/remotes/origin/master 
d895cb1af15c04c522a25c79cc429076987c089b 

這些都是爲內部git的存儲機制,以及工作目錄的獨立工作。通過執行以下操作:

git reset --hard origin/master 

git會指向相同的哈希值產地/碩士點到當前分支。然後強制更改工作目錄以匹配該散列處的文件結構/內容。

看到這個在工作中繼續前進,並嘗試以下操作:

git checkout -b test-branch 
# see current commit and diff by the following 
git show HEAD 
# now point to another location 
git reset --hard <remote>/<branch> 
# see the changes again 
git show HEAD 
+0

我無法測試所以我不知道這是否可行 - 但我贊成採取一個好的解決方案 – 2013-02-28 16:29:52

+3

@timothyov這是真的,但基於我認爲這是暗示的問題。 – 2014-01-07 21:53:49

+1

從最近批准的編輯在開始時添加大量警告,就像指出它已經提到:「然後[git]強制更改工作目錄以匹配該散列處的文件結構/內容。」但是,猜測這並不夠明確。 – 2014-05-14 22:28:49

1

假設你想扔掉你有任何的改變,首先要檢查的git status輸出。對於任何在其旁邊顯示「未合併」的文件,請運行git add <unmerged file>。然後跟進git reset --hard。除了未跟蹤的文件之外,這將消除任何本地更改。

+0

增加了一些更多的信息,這是不是很正常工作 – 2013-02-28 04:05:41

+0

哦,對。它可能不會說「未合併」。它也可以說「兩個修改」或者一兩個其他的東西。 git status的輸出是什麼? – 2013-02-28 04:08:09

+0

http://prntscr.com/ufyqw – 2013-02-28 04:11:13

3

解決,使用以下命令集:

git reset --hard 
git pull --rebase 
git rebase --skip 
git pull 

關鍵是要重訂的變化......我們遇到了一些麻煩基礎重建一個微不足道的承諾,所以我們簡單地使用Git變基--skip跳過它(在複製文件之後)。

1

我得到的git解決刪除卸載了本地文件。

$ git rm <the unmerged file name> 
$ git reset --hard 
$ git pull --rebase 
$ git rebase --skip 
$ git pull 
Already up-to-date. 

當我送git的承諾之後:

$ git commit . -m "my send commit" 
On branch master 
Your branch is up-to-date with 'origin/master'. 
nothing to commit, working directory clean 
0

瑞恩·斯圖爾特的答案是幾乎沒有。在情況下,你居然想刪除你的本地修改,有一個工作流程,您可以使用合併:

  • 運行git status。它會給你一個未合併文件的列表。
  • 合併它們(手工等)
  • 運行git commit

Git會犯剛剛合併到一個新的提交。 (在我的情況下,我在磁盤上添加了額外的文件,這些文件並未納入該提交。)

Git然後認爲合併成功並允許您前進。

0

如果你碰巧運行git fetch然後混帳後能得到這個問題是不是讓您因爲合併衝突的運行git pull都修改/未合併文件,並讓你更加沮喪,它獲得了」 t顯示文件中的任何衝突標記,因爲它尚未合併)。如果你不想失去你的工作,你可以做以下事情。

階段文件。

$ git add filename 

然後隱藏本地更改。

$ git stash 

拉和更新你的工作目錄

$ git pull 

恢復您的本地修改的文件(如果它可以,否則解決它git會自動合併)

$ git stash pop 

希望這將有助於。

相關問題