2

我正在尝试 rebase 以压缩提交,但我遇到了冲突:

<username>:~/path/to/director$git rebase -i HEAD~6
error: could not apply 0111a7a... <commit message>

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
Could not apply 0111a7acsadd9a9d98a9003a560a390a50a22afa3af546f42101... <full commit message>

然后,我执行以下操作来查找冲突:

find . -name "*.py" -exec egrep ".*HEAD.*" {} \;

因为我知道我只更改了 python 文件,所以我使用了*.pyglobbing。但是,没有结果显示!有没有办法准确找出问题所在?

git status, 并且git diff都是干净的。

4

2 回答 2

2

在下面的答案之前,我想注意一件事:如果您只想将一系列提交压缩为单个提交,最简单的方法通常是git reset --soft与单个所需的提交组合。请参阅Chris Johnsen这个答案和 VonC 的这个答案,并注意 VonC 的最后一个重点段落。


我们无法确定发生了什么,因为您没有向我们展示足够的信息,但这是一个常见的场景,git rebase告诉您它无法应用某些提交,但git status. 这您的情况不同(您将自己的提交重新设置在自己的基础上HEAD~6,这使得这种情况不太可能发生),但是我们再次没有从您那里看到足够的信息,所以我将其作为一个示例来展示。

假设您要对一系列两个或多个提交进行变基。第一个修复word了文本文件第 3 行上单词的拼写。第二次和任何后续提交与其他文件做其他事情。这些更改是在 branch 上进行的bran,但从那时起,您已经运行git fetch和/或决定将这些更改移动到 branchmaster或其他地方。

同时,事实证明,其他人修复了word该文本文件第 3 行上的单词拼写以及第spelling12 行上的单词拼写。因此,您的修复是他们修复的一个子集。这不是完全相同的修复——你只修复了一个词,他们修复了两个——但你的修复无法应用,因为该词word已经在文本文件的第 3 行拼写正确。

Git 无法1理解这没关系。由您决定是否不再需要您的修复,虽然它与您正在重新定位的“上游”修复不同。 在这种情况下(但不是在其他情况下),您应该简单地跳过提交。

这是发生这种情况的示例会话:

$ * abda13a (master) fix two words
| * 9e7ed64 (HEAD, bran) add a file
| * 144d5a6 fix one word
|/  
* ac7be27 initial

让我们看一下提交144d5a6

$ git show bran^
commit 144d5a66949cdd40fd92b0846d5b0ce00ebcdd8c
Author: [redacted]
Date:   [redacted]

    fix one word

diff --git a/README.txt b/README.txt
index c37e4c4..983e649 100644
--- a/README.txt
+++ b/README.txt
@@ -1,6 +1,6 @@
 This readme file
 has at least one
-wurd
+word
 that is
 misspelled.
 There may be

现在让我们看看最尖端的提交master

$ git show master
commit abda13a47f5b5d968a09eedaf5cc573ba35a3dee
Author: [redacted]
Date:   [redacted]

    fix two words

diff --git a/README.txt b/README.txt
index c37e4c4..867d98f 100644
--- a/README.txt
+++ b/README.txt
@@ -1,6 +1,6 @@
 This readme file
 has at least one
-wurd
+word
 that is
 misspelled.
 There may be
@@ -9,7 +9,7 @@ words, since
 the point of
 this file
 is to allow someone
-to fix the speeling
+to fix the spelling
 of any
 of the misspelled
 words.

现在让我们将当前分支(即bran)重新设置为master,但以交互方式:

$ git rebase -i master
[the editor comes up with both commits selected as `pick`]
[I exit the editor with the same `pick`s]
The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:

    git commit --allow-empty

Otherwise, please use 'git reset'
rebase in progress; onto abda13a
You are currently rebasing branch 'bran' on 'abda13a'.

nothing to commit, working directory clean
Could not apply 144d5a66949cdd40fd92b0846d5b0ce00ebcdd8c... fix one word

(顺便说一句,这是 git 2.3.7 ;旧版本甚至没有注意到樱桃选择已变空,只是抱怨无法应用提交。我不清楚为什么它也建议这样做git reset;那在这一点上没有必要。但是,git 2.3.7 现在已经过时了;我应该升级。)


1这实际上取决于其他事情。使用 git 2.3.7,它现在​​足够聪明,可以检测这种情况以进行非交互式变基。使用上面的初始设置:

$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: fix one word
Using index info to reconstruct a base tree...
M   README.txt
Falling back to patching base and 3-way merge...
No changes -- Patch already applied.
Applying: add a file
$ git log --oneline --graph --decorate --all
* c8f1815 (HEAD, bran) add a file
* abda13a (master) fix two words
* ac7be27 initial

在这种情况下,非交互式变基发现我的“修复一个单词”与“修复两个单词”是多余的,并简单地跳过了它,因此最后的提交序列bran实际上只是剩下的一个提交,带有“修复两个字”master作为它的父母。

于 2015-08-27T07:45:08.433 回答
1

通常git status应该向您显示一个冲突的文件。您不应该搜索HEAD而是搜索<<<<<<======>>>>>>

既然你说那git status是干净的,那么你的提交可能已经变成了空的。您可以使用检查提交中的内容

git show 0111a7a

如果您的提交变为空,您应该跳过它,使用

git rebase --skip
于 2015-08-27T07:02:33.170 回答