簡體   English   中英

即使所有合並沖突都已解決,Git rebase --continue 也會抱怨

[英]Git rebase --continue complains even when all merge conflicts have been resolved

我面臨一個我不知道如何解決的問題。

我從我的分支對 master 做了一個 rebase:

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 status 並得到了以下輸出:

 # 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 add AssetsLoader.java 和一個 git status 並得到以下信息:

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

當我做 git rebase --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 1.7.1

發生這種情況是因為在修復沖突時,您刪除了補丁中的所有代碼,這些代碼應用於您要重新建立的分支。 如果您確定已添加所有更改:使用git rebase --skip繼續。

更多細節:

通常,在變基期間修復沖突時,您將編輯沖突文件,保留當前應用於您變基的分支的補丁中的部分或全部代碼。 修復補丁並做之后

git add your/conflicted/file
git status

你會得到一個(通常是綠色的)行,顯示修改后的文件

修改:你的/沖突的/文件

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

但是,有時在解決沖突時,您會刪除新補丁中的所有內容,只保留您重新基於的分支中的代碼。 現在,當您添加文件時,它將與您嘗試重新設置的文件完全相同。 git status 將不顯示顯示已修改文件的綠線。 現在,如果你這樣做

git rebase --continue

git會抱怨

沒有變化 - 你忘記使用 'git add' 了嗎?

如果您確定您已添加所有更改,那么 git 在這種情況下實際上希望您做的是使用

git rebase --skip

跳過補丁。 以前我從來沒有這樣做過,因為我總是不確定如果我這樣做會實際跳過什么,對我來說“跳過這個補丁”的真正含義並不明顯。 但是如果你沒有得到綠線

修改:你的/沖突的/文件

在編輯沖突文件、添加它並執行 git status 之后,您可以確定您刪除了整個補丁,您可以改用

git rebase --skip

接着說。

原始帖子說這有時有效:

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

...但不要依賴於此(並確保不要在存儲庫文件夾中添加剩余文件)

似乎是 Git 1.7 中的一個錯誤

這是一篇關於如何解決這個問題的好文章

基本上它應該工作,如果你做

git diff

在解決了你的沖突之后

git rebase --continue

應該管用。

當我有未暫存的文件時,我收到了這個警告。 確保您沒有任何未暫存的文件。 如果您不想更改未暫存的文件,請使用以下命令丟棄更改

git rm <filename>  

修復更改后,您可能會忘記運行“git add -A”

git add -A
git rebase --continue

修復沖突后,確保將更改的文件添加到暫存文件中。 這為我解決了這個問題。

嘗試在命令行中運行它:

$ git mergetool

應該調出一個交互式編輯器,讓您解決沖突。 比嘗試手動進行更容易,並且 git 也會在您進行合並時識別。 還將避免您嘗試手動執行時可能發生的意外未完全合並的情況。

我剛遇到這個問題,雖然我認為可能有幾個原因,但這是我的...

我有一個 git pre-commit 鈎子,它在某些條件下拒絕提交。 這在手動提交時很好,因為它會顯示鈎子的輸出,我可以修復它或選擇使用 commit --no-verify 忽略它。

問題似乎是,在變基時, rebase --continue 也會調用鈎子(以提交最新的更改)。 但是 rebase 不會顯示鈎子輸出,它只會看到它失敗,然后吐出一個不太具體的錯誤,說“您必須編輯所有合並沖突,然后使用 git add 將它們標記為已解決”

要修復它,請暫存所有更改,而不是執行“git rebase --continue”,而是嘗試“git commit”。 如果您遇到同樣的鈎子問題,那么您應該看到它失敗的原因。

有趣的是,雖然 git rebase 不顯示來自 git hook 的輸出,但它確實接受 --no-verify 來繞過鈎子。

您錯過了 AssetsLoader.java 中的合並沖突。 打開它並查找沖突標記(“>>>>”、“====”、“<<<<<”),然后再次執行 git add。 如果您很難找到它,請執行“git diff --staged”。

我只是偶然發現了這個問題。 我不會git rebase --skip因為git status清楚地顯示了我想保留的修改。 雖然我有一些意外的額外文件。 我解決了

git checkout .

刪除未分級的修改,然后git rebase --continue成功。

如果您使用的是 magit(一個流行的 git 的 emacs 前端),由於 magit 中的一個晦澀的錯誤,可能會顯示此錯誤消息。 我不確定是什么觸發了這個錯誤,但對我來說,只有文件的行尾被更改,所以 magit 沒有將文件顯示為沖突。 所以我認為沒有沖突,但確實存在。 在命令行運行git status可以讓我看到沖突的文件,然后我可以運行git add filename然后運行git rebase --continue

接受的答案具有誤導性。 它可能會導致更多麻煩(請參閱評論)。

我意識到git rebase --continue對我不起作用,因為我修改了一些本地文件但沒有暫存。 運行以下命令會抑制我的本地未分級修改 所以請注意這是你想要的。

git checkout .

如果您想暫存修改,請運行git add <name of the file>

如果要存儲(擱置)修改,請運行git stash -k

運行git rebase --continue應該在這些命令之后運行。

如果您選擇存儲,請運行git stash pop (在git rebase --continue之后)以恢復修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM