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
вот некоторые идеи:
- перед запуском rebase убедитесь, что вы не находитесь в середине rebase или am. Do:
rm -rf .git/rebase-apply
- если вы используете Bash,повышение вашего bash приглашение, так что он всегда представляет эту информацию автоматически
- один бит, который вы упомянули, я не понял: "а затем попробуйте продолжить: сначала я попробую совершить:"... зачем совершать? В середине ребаза я думаю, что вы должны только "добавить git" после вас убирать или "git rm", чтобы бросить изменения или подтвердить удаление файла. Может, это что-то испортило?
- попробовать merge вместо rebase
- попробовать некоторые идеи Итана Роу
это сообщение об ошибке является результатом вашего 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