Git rebase: конфликты продолжают блокировать прогресс

у меня есть ветка git (называется v4), которая была сделана из master только вчера. Было несколько изменений в 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 ответов


я столкнулся с аналогичной проблемой с перебазироваться. Моя проблема была вызвана тем, что одна из моих фиксаций изменила только файл, и при решении я отбросил изменение, введенное в эту фиксацию. Я смог решить свою проблему, пропустив соответствующую фиксацию (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

создать the 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 так что будет conflit во время перебазирования.

$ 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 ветвь и попробуйте перебазировать. Он терпит неудачу с conflit в 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 чтобы вернуть ваше депо в это состояние (это еще один разрушительный операция.)


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

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

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

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

$ git rebase --skip

изменить приложение / представления / общие / версия.txt to

v1.4-alpha-01

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

Итак, в перебазировании из

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

to

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

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

так что после git rebase --abort команды должны быть

git checkout topic
git rebase master
< make edits to resolve conflicts >
git add .
git rebase --continue

вот некоторые идеи:


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


поведение, которое вы видите, не то, что я ожидал бы от типичного rebase только с этим конфликтом. Используйте отдельную ветку для этого перебазирования (особенно если вы уже толкнул совершает удаленно, что ты быстрая перемотка вперед). Кроме того,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