在下面的答案之前,我想注意一件事:如果您只想将一系列提交压缩为单个提交,最简单的方法通常是git reset --soft
与单个所需的提交组合。请参阅Chris Johnsen的这个答案和 VonC 的这个答案,并注意 VonC 的最后一个重点段落。
我们无法确定发生了什么,因为您没有向我们展示足够的信息,但这是一个常见的场景,git rebase
告诉您它无法应用某些提交,但git status
. 这与您的情况不同(您将自己的提交重新设置在自己的基础上HEAD~6
,这使得这种情况不太可能发生),但是我们再次没有从您那里看到足够的信息,所以我将其作为一个示例来展示。
假设您要对一系列两个或多个提交进行变基。第一个修复word
了文本文件第 3 行上单词的拼写。第二次和任何后续提交与其他文件做其他事情。这些更改是在 branch 上进行的bran
,但从那时起,您已经运行git fetch
和/或决定将这些更改移动到 branchmaster
或其他地方。
同时,事实证明,其他人还修复了word
该文本文件第 3 行上的单词拼写以及第spelling
12 行上的单词拼写。因此,您的修复是他们修复的一个子集。这不是完全相同的修复——你只修复了一个词,他们修复了两个——但你的修复无法应用,因为该词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
作为它的父母。