2011-12-15 43 views
55

我面對,我不知道如何解決問題的衝突已經得到解決。Git的變基--continue抱怨,即使所有合併

我做對主衍合從我的分支:

git rebase master 

,並得到了以下錯誤

First, rewinding head to replay your work on top of it... 
Applying: checkstyled. 
Using index info to reconstruct a base tree... 
Falling back to patching base and 3-way merge... 
Auto-merging AssetsLoader.java 
CONFLICT (content): Merge conflict in AssetsLoader.java 
Failed to merge in the changes. 
Patch failed at 0001 checkstyled. 

所以我去我喜歡的編輯器,固定在1號線衝突,保存的文件並做了一個git狀態,並得到了以下輸出:

# Not currently on any branch. 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: PassengerContactHandler.java 
# 
# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
# both modified:  AssetsLoader.java 
# 

我做了一個git添加AssetsLoader的.java和一個git的地位,得到了以下幾點:

# Not currently on any branch. 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: AssetsLoader.java 
# modified: PassengerContactHandler.java 
# 

,當我做了GIT中變基--continue我得到:

git rebase --continue 
You must edit all merge conflicts and then 
mark them as resolved using git add 

我知道我可以跳過補丁,並繼續重訂,但我不知道如果PassengerContactHandler.java更改將重建基礎到我的分支或沒有。

所以我不知道,我應該如何進行?

編輯:難道是與解決衝突的文件是完全一樣的原始版本?

非常感謝, 盧卡斯

編輯,它只是發生在我身上再次:

它只是發生在我身上再次,

(307ac0d...)|REBASE)$ git status 
# Not currently on any branch. 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: assets/world/level1/Level-1.xml 
# modified: George.java 
# modified: DefaultPassenger.java 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
# mb-art/originalAssets/27dec/ 

((307ac0d ...)| REBASE )$ git rebase --continue

You must edit all merge conflicts and then 
mark them as resolved using git add 

git --version

git version 1.7.1 
+0

這就是`git status`的完整輸出,對吧?它下面沒有缺失部分? – Cascabel 2011-12-15 18:28:33

+0

是的,我粘貼了一切...... – Lucas 2011-12-21 15:59:30

+0

`git-rebase`不應該報告有沒有未解決的衝突,如果沒有任何。如果你可以設法在一個簡單的測試案例中重現問題,那麼調試會更容易,但是,如果`git status`在`git rebase --continue`時報告沒有衝突,你的版本Git是最新的,您可以嘗試通過[email protected]向Git dev郵件列表發送電子郵件,並提供儘可能多的診斷信息。 – Cascabel 2011-12-21 22:55:04

回答

3

您錯過了AssetsLoader.java中的合併衝突。打開它,並尋找衝突標記(「>>>>」,「====」,「< < < < <」),然後做git的再次添加。如果您很難找到它,請執行'git diff --staged'。

+2

我做在所有跟蹤的文件上都有一個grep,並且沒有衝突標記。 – Lucas 2011-12-15 17:09:39

3

嘗試在命令行中運行以下命令:

$ git mergetool 

應該彈出一個交互式編輯器允許你解決衝突。比嘗試手動執行更容易,而且git會在您進行合併時識別。還可以避免在您嘗試手動完成時不會意外完全融合的情況。

4

我剛有這個問題,雖然我覺得可能有幾個原因,這裏是我的......

我有一個git的pre-commit鉤子駁回了在一定條件下的提交。當手動提交時這很好,因爲它會顯示鉤子的輸出,我可以修復它或選擇使用commit --no-verify忽略它。

問題似乎是,當重新定位時,rebase --continue也會調用鉤子(以便執行最新的變化)。但衍合將不會顯示鉤輸出,它只會看到它失敗了,然後吐出一個不太具體錯誤說「你必須編輯所有的合併衝突,然後將它們標記爲使用Git附加解決」

要解決它將所有的變化分開,而不是做'git rebase --continue',嘗試'git commit'。如果你遇到同樣的鉤子問題,那麼你應該看到失敗的原因。有趣的是,雖然git rebase沒有顯示git鉤子的輸出,但它確實接受了--no-verify來繞過鉤子。

58

發生這種情況是因爲修復衝突時,您刪除了修補程序中的所有代碼,這些代碼都應用於您要重定義的分支。使用git rebase --skip繼續。

多一點細節:

通常情況下,固定墊底期間發生衝突時,您將編輯衝突的文件,保留部分或全部代碼的當前應用到你衍合的分支補丁。固定的補丁,做

git add your/conflicted/file 
git status 

後,你會得到一個(通常爲綠色)線表示改進後的文件

修改:你的/衝突/文件

git的變基--continue在這種情況下可以正常工作。

然而,有時在解決衝突時,您會刪除新修補程序中的所有內容,只保留您重新分配的分支中的代碼。現在,當您添加文件時,它將與您嘗試重新打印的文件完全相同。 git狀態將顯示沒有綠線顯示修改後的文件。現在,如果你

git rebase --continue 

git會與

沒有變化埋怨 - 你忘了使用 'git的補充'?

什麼混帳其實希望你在這種情況下做的是使用

git rebase --skip 

跳過補丁。以前我從來沒有這樣做過,因爲我總是不確定如果我真的跳過了什麼,我不明白什麼「跳過這個補丁」真的意味着什麼。但是,如果你沒有綠線與

修改:你的/衝突/文件

編輯衝突的文件,將其添加,並做git的狀態後,那麼你可以確信你刪除整個修補程序,您可以改爲使用

git rebase --skip 

繼續。

原帖說,這招的確奏效:

git add -A 
git rebase --continue 
# works magically? 

...但不要依賴這種情況(千萬不要在你的資料庫文件夾添加剩餘的文件)

1

修復衝突之後,請確保已更改的文件已添加到您的暫存文件中。這解決了我的問題。