Подтвердить что ты не робот

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

У меня есть ветвь git (называемая v4), которая была сделана из мастера только вчера. Было несколько изменений в мастерстве, что я хочу попасть в v4. Итак, в версии 4 я попытался выполнить переустановку с помощью мастера, и один файл продолжает закручивать: текстовый файл с одной строкой, содержащий номер версии. Этот файл 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".

В этот момент, обойдя вокруг этого, я ударяю головой из-за стола.

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

EDIT - для 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".
4b9b3361

Ответ 1

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

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

Ответ 2

Цитата: http://wholemeal.co.nz/node/9

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

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

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

$ git rebase --skip

Ответ 3

Измените приложение /views/common/version.txt на

v1.4-alpha-01

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

Итак, при перезагрузке из

      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

Ответ 4

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

Ответ 5

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

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

#!/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

Ответ 6

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