2015-08-27 2 views
1

Я пытаюсь перебазирования для того, чтобы кабачки зафиксируется, и я получаю конфликт:Невозможно найти `HEAD` в конфликте перебора git?

<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, я использую фреймворк *.py. Однако результатов не видно! Есть ли способ найти именно то, что проблема?

git status и git diff оба чистые.

ответ

2

Прежде чем ниже ответ, я хочу отметить одну вещь: если вы просто хотите вырезать серию коммитов в одну фиксацию, самый простой способ - просто объединить 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 в качестве ее родителя.

+0

ОК, спасибо. Я полагаю, что часть моей путаницы заключалась в том, что я не понимаю разницы между 'git rebase -skip' и просто удалением фиксации во время и интерактивной rebase:' git rebase -i HEAD ~ 6'. – Hunle

+0

Если вы удалите его из первоначальных инструкций, git не будет пытаться черви-выбрать его вообще. Если вы используете 'git rebase -skip' (возможно, после некоторого количества' git reset'-ing, возможно, это то, о чем было сообщение, даже если оно было избыточным в этом конкретном случае), вы говорите git, чтобы отказаться от него этот момент, после попытки вишневого захвата, но неудачного. – torek

1

обычно git status должен показать вам файл в конфликте. Вы не должны искать для РУКОВОДИТЕЛЯ но < < < < < <, ====== или >>>>>>.

Поскольку вы говорите, что git status чист, возможно, что ваша фиксация стала пустой. Вы можете проверить, что в фиксации с помощью

git show 0111a7a 

если ваша фиксация опустел, вы должны пропустить его, используя

git rebase --skip 
+0

Я перезаряжаюсь на HEAD, чтобы раздавить коммиты. Как вы думаете, может быть, почему он не отображается в статусе git? – Hunle

+0

Ну, фиксация не пуста, так как 'git show 0111a7a' показывает некоторые изменения. Но я не вижу '<<<<<<' или тому подобное, поэтому мне не ясно, как это изменить. – Hunle

+0

Это странно, обычно git следует попробовать применить фиксацию и оставить неразрешенные коммиты, отмеченные как таковые, с <<<<< and > >>> Маркировка ... –

Смежные вопросы