Сливане с git - как да разбера къде завършва „новият“ код?

Друг потребител на моя git създаде клон и не може да разбере как да го обедини чрез eclipse. Затова го обединявам с master.

Да започна :

git pull origin master
git pull origin garbage (this is what his branch is named)

Получавам конфликт на сливане във файл. Обикновено мога да ги разбера, ако съм написал целия код, но в този случай не мога. Изглежда така:

<<<<<<<<<<<HEAD
//a bunch of code
=========
>>>>>>>>>>> A bunch of numbers (I'm assuming the hash of the new branch)
//code that I didn't write
//the rest of the code

Не мога да намеря разликата между code I didn't write и rest of code. Не трябва ли да има още един ======== ред след „новия“ код? Кой е най-добрият начин за сливане на това?


person Brydon Gibson    schedule 12.11.2016    source източник


Отговори (3)


Този конкретен конфликтен стил показва само две части от конфликта — но всъщност има три части, просто едната обикновено трябва да бъде изхвърлена.

Не забравяйте, че има "базова" версия на файла и две версии с съвети. Базовата версия е това, с което вие започнахте, преди да направите вашите промени на master—и той започна със същото базова версия, преди той да направи своите промени. Това прави основната версия „основната“: и двамата сте имали един и същ файл, в същата форма, в миналото.

Оттогава – от тази обща база – Git разглежда това като „вие сте направили известен брой ангажименти (поне 1, може би много) и той е направил някои ангажименти (поне един, може би много)“:

          o--o--A   <-- you (master)
         /
...--o--*
         \
          o--o--o--B   <-- him

За да комбинира тези промени, Git изпълнява разлика от * (базата) до A (вашето master) и втора разлика от * до B (неговото garbage, което обикновено наричате origin/garbage вместо това). Git откри някакъв конфликт между „какво направи ти“ и „какво направи той“ и постави това в комбинирания (предимно завършен) файл, използвайки маркерите за конфликт:

[there might be stuff up here too]
<<<<<<<<<<< HEAD
//a bunch of code
=========
>>>>>>>>>>> A bunch of numbers (I'm assuming the hash of the new branch)
//code that I didn't write
//the rest of the code

Това е най-доброто предположение на Git за крайната форма на файла, разрешавайки частите, които не са в конфликт, като същевременно оставя частите, които са в конфликт, там като двата набора от код. Липсва една голяма част: с какво според Git започнахте и двамата?

Да кажем, например, че Git погрешно е решил, че и двамата сте запазили 17-ия напълно празен ред, защото вашият нов файл има празен ред близо до него, а неговият нов файл има празен ред близо до него (въпреки че всъщност това е само < em>случайно съвпадение). След това Git успя да реши, че всичко, което направи след този празен ред, не е в конфликт, така че това е във вашия комбиниран файл, но не е маркирано с маркер за конфликт.

Междувременно Git реши, че поради този "запазен" празен ред, вие сте добавили първия раздел // a bunch of code, но той не го е направил. (Това може действително да е било в оригиналния файл, но когато Git се синхронизира неправилно, той се оказва „изглежда нов“. Или може наистина да е изцяло нов.)

След тази част, между първоначалните <<< шеврони и === реда, Git включва кода, който смята, че той е добавил: това е всичко след === реда, до >>> реда. (В този случай той смята, че не е добавил нищо тук: вероятно смята, че е изтрил нещо, като например празен ред.)

Останалата част от кода, включително // code that [you] didn't write, или вече беше в основата, или Git успя да добави, без да види конфликт.

Смятам, че е по-добре да задам merge.conflictstyle на diff3. Това променя начина, по който Git вмъква двата конфликтни раздела в най-вече финалния файл: той поставя частта, която може да обработи сам, след това маркера <<<<<<<, след това това, което смята, че сте добавили, ако има нещо, след това поредица от вертикални ленти |||||||, след това основният код, който Git смята, че трябва да бъде заменен, след това маркерът =======, след това неговият код, след това затварящият маркер >>>>>>>.

Git смята, че е вероятно да се отървете от основния код и да използвате един или друг от HEAD или други секции с код на клон или може би дори комбинация от HEAD и други. Но ако секцията база се окаже пълна глупост, можете веднага да разберете, че Git е синхронизирал нещо фалшиво, като празни редове и редове, състоящи се само от }, например.

person torek    schedule 12.11.2016
comment
Благодаря ви, това наистина помага да се обясни процеса на git merge - person Brydon Gibson; 12.11.2016

Ето защо трябва да използвате diff, когато другият човек ще направи заявка за изтегляне, за да изпрати промените в своя клон към основния източник. Ако бихте направили diff, тогава ще видите всеки конфликт преди сливането и ще ги поправите преди това. Сега трябва да преминете ред по ред и да коригирате тези редове код, за да премахнете ненужния код/добавете подходящ код.

person HaroldSer    schedule 12.11.2016

Може ли да опитате

git mergetool

git mergetool изпълнете една от няколко помощни програми за сливане за разрешаване на конфликти при сливане. Обикновено се изпълнява след git merge.

Инсталирайте някакъв инструмент за сливане като kdiff3 или meld, за да ви помогне да слеете.

person root    schedule 12.11.2016