Поновлення Git: конфлікти блокують прогрес


120

У мене є гіт 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".

Саме в цей момент, обходячись цим, я відбиваю голову від столу.

Що тут відбувається? Що я роблю неправильно? Хтось може мене встановити прямо?

EDIT - для унутбу

Я змінив файл, як ви запропонували, і отримав ту саму помилку:

> 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".

10
дякую, що
задали

6
Було б добре, якщо ви підтвердите якусь відповідь
триває

3
@MaxWilliams, я думаю, ви (як я) неправильно трактували поради @unutbu : 1) спочатку біжите git rebase master і нехай провалюється ; 2) потім ви відредагуєте version.txtта зробите його так, як це повинно виглядати в цій точці, і збережіть його; 3) то ти git add .../version.txt; 4) тоді ти робиш git rebase --continue( не «вчиняєш» )! Якщо це rebase --continueдосягає успіху, це вже зроблено (тут немає потреби git commit!) - тож все, що залишилося зробити, - це git push(якщо ви використовуєте віддалений репо). Сподіваюся, це допоможе, якщо я правильно зрозумів :)- ура!
sdaau

@MaxWilliams, ви коли-небудь отримували відповідь на це: ruby-forum.com/topic/187288 (я негайно видалю це після відповіді, якщо хтось інший не потрапить першим !!)
atw

Відповіді:


102

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


4
Дякуємо, що знайшли час, щоб написати це тривале пояснення Sylvain! Це робить це зрозумілішим. Я думаю, що я завжди просто нервував пропускати патч, оскільки відчував, що робота може загубитися: тобто патч включав усі файли, на які впливає база даних, а не лише один із конфліктом. Тоді патч - це лише одне злиття в одному файлі?
Макс Вільямс

3
Ні, виправлення містить всю різницю у всіх файлах, змінених в одному коміті. Але при використанні git rebase --skipви пропускаєте лише одну комісію. Я, як правило, git statusперед тим, як пропустити зобов’язання, видаю, чи перебуваю я в цій ситуації.
Sylvain Defresne

1
Я просто хотів повторити Макса, сказавши подяку за те, що витратив час, щоб написати чудове пояснення - я нарешті зрозумів, чому це відбувається. Мені теж більше не страшно rebase --skip:).
Бен Долман

1
Попередження - якщо у вас є кілька змін за один вчинок, ви можете втратити роботу, виконуючи git rebase --skip. Я щойно зробив
Chrissy H

@ChrissyH Якщо ви цього не зробили git reflog purgeчи git reflog deleteне зможете повернути свої зміни, скориставшись git reflog. Спробуйте перевірити різні комісії, на які там посилаються, одне з них повинно бути станом вашого дерева, перш ніж ви запустили ціле git rebase.
Sylvain Defresne

23

Цитуючи звідси: http://wholemeal.co.nz/node/9

Ага?!? Ні, я не забув використовувати git add, я це зробив ... як ... 2 секунди тому!

Виявляється, тому що немає змін у патчі git підозрює, що щось пішло не так. Git очікує, що патч буде застосовано, але файл залишився незмінним.

Повідомлення про помилку не дуже інтуїтивно зрозуміле, але воно містить відповідь. Нам просто потрібно сказати ребазу, щоб пропустити цей патч. Також не потрібно фіксувати маркери конфлікту у файлі. Ви отримаєте версію файлу з гілки, на яку ви переходите.

$ git rebase --skip

Після того, як я використав git mergetool і виправив зміни, потім додав їх і здійснив їх, я просто ввів <code> git rebase --skip </code> під час „Наразі немає в жодній гілці“. І все було виправлено. Дякую!
geerlingguy

Насправді я думаю, що це поєднання постійно працюючого git mergetool, потім git rebase - продовження, потім git mergetool тощо, що остаточно виправило мою ситуацію.
geerlingguy

6

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


1
Це здається набагато розумнішим, ніж робити пропуск, принаймні в загальному випадку. Я здивований, що це не вказано як найкращу відповідь.
СмарагдD.

1
@EmeraldD., Не працює. Виправлення файлу та запуск git add <file>не вирішить проблему. git rebase --continue досі повідомляєNo changes - did you forget to use 'git add'?
Pacerier

6

Змініть додаток / view / 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

3
Спасибі unutbu, я спробував це, але не пощастило: дивіться ОП для нового редагування. ура
Макс Вільямс

4

Поведінка, яку ви бачите, - це не те, чого я б очікував від типового перегляду лише цього конфлікту. Спробуйте скористатися окремою гілкою, щоб зробити цю базу даних (особливо, якщо ви вже віддалено натискали коміти, що ви переадресовуєте). Також 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

4

Ось кілька ідей:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.