Прежде чем ниже ответ, я хочу отметить одну вещь: если вы просто хотите вырезать серию коммитов в одну фиксацию, самый простой способ - просто объединить git reset --soft
с единственным желаемым фиксатором. См. this answer by Chris Johnsen и this answer by VonC, а также примечание последнего пункта VonC, обозначенного буквой.
Мы не можем точно сказать, что происходит, потому что вы не показали нам достаточно информации, но вот общий сценарий, в котором git rebase
говорит вам, что он не может применить некоторые фиксации, но нет также никаких изменений Показан git status
. Это не тот же как ваш случай (вы сами сворачиваете свои собственные коммиты HEAD~6
, что делает это менее вероятным), но мы снова не увидели достаточно информации от вас, поэтому я представляю это как пример вместо ,
Предположим, что вы перезаряжаете серию из двух или более коммитов. Первое исправляет написание слова word
в строке 3 текстового файла. Второй и любые последующие коммиты делают другие с другими файлами. Эти изменения были сделаны на ветке bran
, но с тех пор вы запустили git fetch
и/или решили перенести их на ветку master
или что-то еще.
В то же время, оказывается, кто-то другой также исправили написание слова word
в строке 3 этого текстового файла, наряду с написанием слова spelling
на линии 12. Таким образом, Ваше исправление является подмножеством их исправления , Это не точно такое же исправлено - вы исправили только одно слово, они исправили два, но ваше исправление не может быть применено, поскольку слово word
уже правильно написано в строке 3 текстового файла.
Git не может понять, что это нормально. Это зависит от вас, чтобы понять, что ваше исправление, в то время как оно отличается от «восходящего» исправления, которое вы обновляете, больше не требуется. В этом случае (но не в других случаях) вы должны просто пропустить фиксацию.
Вот пример сессии, когда это произошло:
$ * 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
(Это с мерзавцем 2.3.7, между прочим; более старые версии даже не замечают, что вишневый кик стал пустым и просто жалуется, что фиксация не может быть применена. Мне непонятно, почему он советует git reset
; в этом нет необходимости. Однако git 2.3.7 теперь устарел; Я должен обновить.)
Это на самом деле зависит от других вещей. С git 2.3.7 теперь он достаточно умный, чтобы обнаружить этот случай для неинтерактивных rebase. Использование начальной настройки сверху:
$ 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
в качестве ее родителя.
ОК, спасибо. Я полагаю, что часть моей путаницы заключалась в том, что я не понимаю разницы между 'git rebase -skip' и просто удалением фиксации во время и интерактивной rebase:' git rebase -i HEAD ~ 6'. – Hunle
Если вы удалите его из первоначальных инструкций, git не будет пытаться черви-выбрать его вообще. Если вы используете 'git rebase -skip' (возможно, после некоторого количества' git reset'-ing, возможно, это то, о чем было сообщение, даже если оно было избыточным в этом конкретном случае), вы говорите git, чтобы отказаться от него этот момент, после попытки вишневого захвата, но неудачного. – torek