Aš susiduriu su susijungimo konfliktu. Kaip aš galiu nutraukti sujungimą?

Aš naudoju git pull ir turėjau susijungimo konfliktą:

 unmerged: _widget.html.erb You are in the middle of a conflicted merge. 

Žinau, kad kita failo versija yra gera ir mano šachmatai, todėl visi mano pakeitimai turėtų būti pakeisti. Kaip tai padaryti?

1947 m
19 сент. nustatė Gwyn Morfey 19 rugsėjis 2008-09-19 16:21 '08 at 4:21 pm 2008-09-19 16:21
@ 10 atsakymų

Kadangi jūsų pull buvo nesėkmingas, tada HEAD (ne HEAD^ ) yra paskutinis „galiojantis“ įsipareigojimas jūsų temoje:

 git reset --hard HEAD 

Kita dalis yra leisti, kad pakeitimai viršytų jūsų pakeitimus.

Senesnės „git“ versijos leido jums naudoti „jų“ sujungimo strategiją:

 git pull --strategy=theirs remote_branch 

Bet nuo to laiko jis buvo pašalintas, kaip aprašyta šiame pranešime „Junio ​​Hamano“ (kartu su gitu). Kaip nurodyta nuorodoje , vietoj to atliksite:

 git fetch origin git reset --hard origin 
1752 m
19 сент. Pat Notz atsakymas, pateiktas rugsėjo 19 d 2008-09-19 17:33 '08, 17:33, 2008-09-19 17:33

Jei jūsų git versija yra> 1.6.1, galite naudoti git reset --merge .

Be to, kaip nurodo @Michael Johnson, jei jūsų git versija yra> 1.7.4, taip pat galite naudoti „ git merge --abort .

Kaip visada, prieš pradedant susijungimą, įsitikinkite, kad neturite neprisiimtų pakeitimų.

Puslapio „ Git“ sujungimo puslapyje

border=0

git merge --abort lygiavertis„ git reset --merge kai MERGE_HEAD .

MERGE_HEAD kai atliekamas sujungimas.

Be to, kalbant apie neprisiimtus pakeitimus pradedant susijungimą:

Jei turite pakeitimų, kurių nenorite atlikti, kol pradėsite susijungimą, tiesiog git stash juos git stash prieš sujungdami ir git stash pop po užbaigimo arba atšaukimo.

1610 m
29 марта '10 в 2:16 2010-03-29 02:16 atsakymą davė Carl kovo 29 d. 10:16 2010-03-29 02:16
 git merge --abort 

Atšaukti vykstantį konfliktų sprendimo procesą ir bandykite atkurti iš anksto susijungimo būseną.

Jei darbo metu susidarė neveiksmingi pokyčiai, kurie atsirado, kai prasidėjo git merge --abort , kai kuriais atvejais „ git merge --abort -“ negalės susigrąžinti šių pakeitimų. Todėl rekomenduojama visada įrašyti arba įrašyti savo pakeitimus prieš paleisdami „git“ susijungimą.

git merge --abort lygiavertis „ git reset --merge kai „ MERGE_HEAD .

http://www.git-scm.com/docs/git-merge

382
13 нояб. atsakymas ignoruotas 13 lapkričio 2012-11-13 00:40 '12 0:40 2012-11-13 00:40

Šiuo konkrečiu naudojimo atveju tikrai nenorite nutraukti sujungimo, tiesiog išspręskite konfliktą tam tikru būdu.

Nėra jokio specialaus poreikio atstatyti ir sujungti su kita strategija. Konfliktai buvo teisingai priskirti prie „git“, o reikalavimas priimti pakeitimus trečiosioms šalims taikomas tik šiai rinkmenai.

Nesusijusiam failui konflikte, git suteikia prieinamą bendrą bazę, vietines ir nuotolines failo versijas indekse. (Čia jie skaitomi naudoti trijų krypčių diferenciniame įrankyje su git mergetool .) Galite peržiūrėti git show .

 # common base: git show :1:_widget.html.erb # 'ours' git show :2:_widget.html.erb # 'theirs' git show :3:_widget.html.erb 

Paprasčiausias būdas išspręsti konfliktą yra nuotolinės versijos žodinis naudojimas:

 git show :3:_widget.html.erb >_widget.html.erb git add _widget.html.erb 

Arba su git> = 1.6.1:

 git checkout --theirs _widget.html.erb 
73
20 сент. CB Bailey atsakymas 20 rugsėjis 2008-09-20 13:41 '08 13:41 pm 2008-09-20 13:41

Manau, jums reikia git reset .

Atkreipkite dėmesį, kad „ git revert reiškia kažką, kas labai skiriasi nuo, pvz., „ svn revert - „Subversion“, grįžimas pašalins jūsų (neprisiimtus) pakeitimus, grąžins failą į dabartinę versiją iš kapinyno, o „ git revert „atšaukia“ įsipareigojimą.

git reset turėtų atlikti lygiavertį svn revert , ty atmesti nepageidaujamus pakeitimus.

72
19 сент. Atsakymas, kurį pateikė David Precious Sep 19 2008-09-19 16:25 '08 4:25 pm 2008-09-19 16:25

Kadangi komentaruose daroma prielaida, kad „ git reset --merge yra slapyvardis „ git merge --abort - verta paminėti, kad „ git merge --abort lygiavertis„ git reset --merge tik tada, jei yra MERGE_HEAD . Tai galima rasti sujungimo komandos git žinyne.

 git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. 

Po nepavykusio sujungimo, kai nėra MERGE_HEAD , nepavykusį susijungimą galima atšaukti su git reset --merge , bet nebūtinai su git merge --abort - todėl jie yra ne tik to paties dalyko senoji ir nauja sintaksė .

Asmeniškai manau, kad git reset --merge daug galingesnis scenarijų, kaip aprašyta, ir nesėkmingų susijungimų apskritai.

29
02 апр. Atsakymą pateikė Martin 02 Bal. 2015-04-02 15:16 '15 15:16 2015-04-02 15:16

Kadangi Git 1.6.1.3 git checkout galėjo patikrinti abiejose susijungimo pusėse:

 git checkout --theirs _widget.html.erb 
16
17 июля '10 в 4:29 2010-07-17 04:29 Alain O'Dea atsakymas buvo pateiktas liepos 17 d. 10 val. 2010-08-17 04:29

Alternatyva išsaugoti darbo kopijos būseną yra:

 git stash git merge --abort git stash pop 

Aš paprastai patarsiu tai, nes jis yra toks pat veiksmingas kaip ir sujungimas Subversion'e, nes jis pašalina filialų ryšį toliau nurodytame įsipareigojime.

14
13 июля '10 в 21:57 2010-07-13 21:57 Atsakymą pateikė Alain O'Dea liepos 10 d., 10:21, 2010-07-13 21:57

Jei baigsite susijungimo konfliktą ir neturite jokių įvykių, bet sujungimo klaida rodoma, kai bus taikomos visos šios komandos:

 git reset --hard HEAD git pull --strategy=theirs remote_branch git fetch origin git reset --hard origin 

pašalinti

.git index.lock

failas [atkarpos atveju iškirpkite įklijuoti į kitą vietą], tada įveskite bet kurią iš šių komandų, priklausomai nuo norimos versijos.

 git reset --hard HEAD git reset --hard origin 

Tikiuosi, kad tai padės !!!

9
11 апр. atsakymą pateikė Nirav Mehta balandžio 11 d 2018-04-11 00:26 '18 prie 0:26 2018-04-11 00:26

Radau, kas man veikė (grąžinkite vieną failą į iš anksto susijungimo būseną):

 git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset* 
1
31 окт. Atsakymą pateikė Malcolm Boekhoff spalio 31 d. 2017-10-31 03:56 '17 at 3:56 2017-10-31 03:56