Git rebase: конфликты продолжают блокировать прогресс - PullRequest
112 голосов
/ 27 октября 2010

У меня есть ветка git (называемая v4), которая была сделана из master только вчера. В мастере было несколько изменений, которые я хочу добавить в v4. Итак, в v4 я попытался сделать ребаз из master, и один файл продолжает портить: текстовый файл в одну строку, который содержит номер версии. Этот файл app/views/common/version.txt, который перед перебазированием содержит следующий текст:

v1.4-alpha-02

Вот что я делаю:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

version.txt теперь выглядит так:

<<<<<<< HEAD:app/views/common/version.txt
v1.4-alpha-02
=======
v1.4-alpha-01
>>>>>>> new version, new branch:app/views/common/version.txt

Итак, я привел это в порядок, и теперь это выглядит так:

v1.4-alpha-02

и затем я попытался продолжить: сначала я пытаюсь совершить коммит:

> git commit -a -m "merged"
# Not currently on any branch.
nothing to commit (working directory clean)

Не повезло. Итак, я пытался добавить файл:

git add app/views/common/version.txt

Нет ответа. Нет новостей, это хорошие новости, я думаю. Итак, я пытаюсь продолжить:

> git rebase --continue
Applying: new version, new branch
No changes - did you forget to use 'git add'?

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

Именно в этот момент, после того, как я обошел это, я ударился головой о стол.

Что здесь происходит? Что я делаю неправильно? Кто-нибудь может привести меня в порядок?

РЕДАКТИРОВАТЬ - для unutbu

Я изменил файл, как вы предложили, и получил ту же ошибку:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

Ответы [ 6 ]

98 голосов
/ 31 января 2011

Я столкнулся с похожей проблемой с ребазой. Моя проблема была вызвана тем, что один из моих коммитов изменил только файл, и при разрешении я отменил изменение, внесенное в этот коммит. Я смог решить мою проблему, пропустив соответствующий коммит (git rebase --skip).

Вы можете воспроизвести эту проблему в тестовом хранилище. Сначала создайте хранилище.

$ mkdir failing-merge
$ cd failing-merge
$ git init
Initialized empty Git repository in $HOME/failing-merge/.git/

Затем зафиксируйте оригинальное содержимое version.txt в master.

$ echo v1.4-alpha-02 > version.txt
$ git add version.txt
$ git commit -m initial
[master (root-commit) 2eef0a5] initial
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 version.txt

Создайте ветку v4 и измените содержимое version.txt.

$ git checkout -b v4
Switched to a new branch 'v4'
$ echo v1.4-alpha-03 > version.txt
$ git add version.txt
$ git commit -m v4
[v4 1ef8c9b] v4
 1 files changed, 1 insertions(+), 1 deletions(-)

Вернитесь к master и измените содержимое version.txt, чтобы во время ребазирования произошел конфликт.

$ git checkout master
Switched to branch 'master'
$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git commit -m master
[master 7313eb3] master
 1 files changed, 1 insertions(+), 1 deletions(-)

Вернитесь в ветку v4 и попробуйте выполнить перезагрузку. Это терпит неудачу с конфликтом в version.txt, как и планировалось.

$ git checkout v4
Switched to branch 'v4'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: v4
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging version.txt
CONFLICT (content): Merge conflict in version.txt
Recorded preimage for 'version.txt'
Failed to merge in the changes.
Patch failed at 0001 v4

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
$ cat version.txt
<<<<<<< HEAD
v1.4-alpha-04
=======
v1.4-alpha-03
>>>>>>> v4

Мы разрешаем конфликт, выбрав master содержимое version.txt. Мы добавляем файл и пытаемся продолжить нашу перебазировку.

$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git rebase --continue 
Applying: v4
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

Не удалось! Давайте посмотрим, какие изменения git думают в нашем хранилище.

$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

Ах, ах, нет изменений. Если вы подробно прочитали предыдущее сообщение об ошибке, git сообщит нам об этом и порекомендует использовать git rebase --skip. Он сказал нам: «Если на сцене ничего не осталось, есть вероятность, что что-то еще уже внесло такие же изменения; возможно, вы захотите пропустить этот патч». Поэтому мы просто пропускаем коммит, и перебазирование завершается успешно.

$ git rebase --skip
HEAD is now at 7313eb3 master

Предостережение : Обратите внимание, что git rebase --skip полностью удалит коммит, который git попытался перебазировать. В нашем случае это должно быть хорошо, поскольку git жалуется, что это пустой коммит. Если вы думаете, что потеряли изменения после завершения перебазирования, вы можете использовать git reflog, чтобы получить идентификатор фиксации вашего хранилища перед перебазированием, и использовать git reset --hard, чтобы вернуть хранилище в это состояние (это еще один разрушительный операция).

20 голосов
/ 31 января 2011

Цитата отсюда: http://wholemeal.co.nz/node/9

Ха?!?Нет, я не забыл использовать git add, я сделал это ... как ... 2 секунды назад!

Оказывается, что из-за изменений в патче git подозревает, что что-то пошло не такGit ожидает, что патч был применен, но файл остался без изменений.

Сообщение об ошибке не очень интуитивно понятно, но содержит ответ.Нам просто нужно сказать rebase, чтобы пропустить этот патч.Также нет необходимости исправлять маркеры конфликта в файле.В итоге вы получите версию файла из ветви, в которую вы перебазируете.

$ git rebase --skip
6 голосов
/ 27 октября 2010

Измените app / views / common / version.txt на

v1.4-alpha-01

. На этом этапе перебазирования помните, что вы разрешаете конфликты слияния, чтобы показать прогрессию неосновного ответвление.

Итак, при переходе от

      A---B---C topic
     /
D---E---F---G master

к

              A*--B*--C* topic
             /
D---E---F---G master

конфликт, который вы решаете, заключается в том, как создать A * в ветви темы..

Поэтому после выполнения git rebase --abort команды должны быть

git checkout topic
git rebase master
< make edits to resolve conflicts >
git add .
git rebase --continue
5 голосов
/ 22 мая 2012

Это сообщение об ошибке является результатом вашего git commit -a -m "merged". Если вы просто исправите файл, затем запустите git add <file> и git rebase --continue, он должен работать нормально. git rebase --continue пытается выполнить фиксацию, но обнаруживает, что нет никаких ожидающих изменений для фиксации (потому что вы уже зафиксировали их).

4 голосов
/ 25 января 2011

Вот несколько идей:

4 голосов
/ 27 октября 2010

Поведение, которое вы видите, не то, что я ожидал бы от типичного перебазирования только с этим конфликтом. Подумайте об использовании отдельной ветви, чтобы выполнить эту перебазировку (особенно, если вы уже отправили коммиты удаленно для быстрой пересылки). Кроме того, git mergetool может быть полезным для разрешения конфликтов и неосторожного обращения к git add.

В этом минимальном примере ребаз работает как положено. Можете ли вы привести пример, который показывает поведение, которое вы видите?

#!/bin/bash

cd /tmp
mkdir rebasetest
cd rebasetest
git init
echo 'v1.0' > version.txt
git add version.txt
git commit -m 'initial commit'
git checkout -b v4
echo 'v1.4-alpha-01' > version.txt
git add version.txt
git commit -m 'created v4'
git checkout master
git merge v4
echo 'v1.4-alpha-01-rc1' > version.txt
git add version.txt
git commit -m 'upped version on master to v1.4-alpha-01-rc1'
git checkout v4
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git commit -m 'starting work on alpha-02'

git rebase master
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git rebase --continue
...