Ik kwam een samenvoegconflict tegen. Hoe kan ik het samenvoegen afbreken?

Ik gebruikte git pullen had een samenvoegconflict:

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

Ik weet dat de andere versie van het bestand goed is en dat de mijne slecht is, dus al mijn wijzigingen moeten worden opgegeven. Hoe kan ik dit doen?


Antwoord 1, autoriteit 100%

Aangezien je pullniet succesvol was, is HEAD(niet HEAD^) de laatste “geldige” commit op je branch:

git reset --hard HEAD

Het andere deel dat u wilt, is om hun wijzigingen uw wijzigingen te laten overschrijven.

Oudere versies van git stonden je toe om de “hun” samenvoegstrategie te gebruiken:

git pull --strategy=theirs remote_branch

Maar dit is inmiddels verwijderd, zoals uitgelegd in dit bericht van Junio Hamano (de Git-beheerder). Zoals vermeld in de link, zou je in plaats daarvan dit doen:

git fetch origin
git reset --hard origin

Antwoord 2, autoriteit 88%

Als je git-versie >= 1.6.1 is, kun je git reset --mergegebruiken.

Ook, zoals @Michael Johnson vermeldt, als je git-versie >= 1.7.4 is, kun je ook git merge --abortgebruiken.

Zoals altijd, zorg ervoor dat u geen niet-vastgelegde wijzigingen heeft voordat u een samenvoeging start.

Van de git merge man-pagina

git merge --abortis gelijk aan git reset --mergewanneer MERGE_HEADaanwezig is.

MERGE_HEADis aanwezig wanneer een samenvoeging bezig is.

Ook met betrekking tot niet-vastgelegde wijzigingen bij het starten van een samenvoeging:

Als je wijzigingen hebt die je niet wilt vastleggen voordat je een merge start, git stashze gewoon voor de merge en git stash popna het voltooien van de merge of het afbreken het.


Antwoord 3, autoriteit 23%

git merge --abort

Breek het huidige proces voor conflictoplossing af en probeer te reconstrueren
de pre-merge-status.

Als er niet-vastgelegde wijzigingen in de werkboom aanwezig waren tijdens het samenvoegen
gestart, zal git merge --abortin sommige gevallen niet in staat zijn
deze veranderingen reconstrueren. Het is daarom aan te raden om altijd
commit of stash je wijzigingen voordat je git merge uitvoert.

git merge --abortis gelijk aan git reset --mergewanneer
MERGE_HEADis aanwezig.

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


Antwoord 4, autoriteit 4%

Ik denk dat je git resetnodig hebt.

Pas op dat git revertiets heel anders betekent dan, laten we zeggen, svn revert– in Subversion zal het terugzetten je (niet-vastgelegde) wijzigingen negeren, waardoor het bestand terugkeert naar de huidige versie uit de repository, terwijl git reverteen commit “ongedaan maakt”.

git resetzou het equivalent van svn revertmoeten doen, dat wil zeggen, je ongewenste wijzigingen negeren.


Antwoord 5, autoriteit 3%

In dit specifieke geval wil je het samenvoegen niet echt afbreken, maar het conflict op een bepaalde manier oplossen.

Het is ook niet nodig om te resetten en een merge uit te voeren met een andere strategie. De conflicten zijn correct gemarkeerd door git en de vereiste om de wijzigingen aan de andere kant te accepteren is alleen voor dit ene bestand.

Voor een niet-samengevoegd bestand in een conflict maakt git de gemeenschappelijke basis, lokale en externe versies van het bestand in de index beschikbaar. (Hier worden ze gelezen voor gebruik in een 3-way diff tool door git mergetool.) Je kunt git showgebruiken om ze te bekijken.

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

De eenvoudigste manier om het conflict op te lossen door de versie op afstand letterlijk te gebruiken, is:

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

Of, met git >= 1.6.1:

git checkout --theirs _widget.html.erb

Antwoord 6, autoriteit 3%

Voor git >= 1.6.1:

git merge --abort

Voor oudere versies van git zal dit het werk doen:

git reset --merge

of

git reset --hard

Antwoord 7, autoriteit 2%

Opmerkingen suggereren dat git reset --mergeeen alias is voor git merge --abort. Het is de moeite waard om op te merken dat git merge --abortalleen gelijk is aan git reset --mergegezien het feit dat een MERGE_HEADaanwezig is. Dit kan worden gelezen in de git help voor het merge commando.

git merge –abort is gelijk aan git reset –merge wanneer MERGE_HEAD aanwezig is.

Na een mislukte samenvoeging, wanneer er geen MERGE_HEADis, kan de mislukte samenvoeging ongedaan worden gemaakt met git reset --merge, maar niet noodzakelijk met git merge --abort. Het zijn niet alleen oude en nieuwe syntaxis voor hetzelfde.

Persoonlijk vind ik git reset --mergeveel krachtiger voor scenario’s die vergelijkbaar zijn met de beschreven, en mislukte samenvoegingen in het algemeen.


Antwoord 8, autoriteit 2%

U kunt de samenvoegstap afbreken:

git merge --abort

anders kunt u uw wijzigingen behouden (op welke tak u zich bevindt)

git checkout --ours file1 file2 ...

anders kunt u andere branch-wijzigingen behouden

git checkout --theirs file1 file2 ...

Antwoord 9

Als je een samenvoegconflict krijgt en niets hebt om vast te leggen, maar er wordt nog steeds een samenvoegfout weergegeven. Na het toepassen van alle onderstaande commando’s,

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

Verwijder

.git\index.lock

Bestand [knippen plakken naar een andere locatie in geval van herstel] en voer dan een van onderstaande commando’s in, afhankelijk van welke versie je wilt.

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

Hopelijk helpt dat!!!


Antwoord 10

Een alternatief dat de staat van de werkkopie behoudt is:

git stash
git merge --abort
git stash pop

Over het algemeen raad ik dit af, omdat het in feite hetzelfde is als mergen in Subversion, omdat het de branch-relaties in de volgende commit weggooit.


Antwoord 11

Sinds Git 1.6.1.3 git checkoutis in staat om aan beide kanten van een samenvoeging af te rekenen:

git checkout --theirs _widget.html.erb

Antwoord 12

Ik ontdekte dat het volgende voor mij werkte (zet een enkel bestand terug naar de pre-merge-status):

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*

Antwoord 13

Om voorkomenin dit soort problemen te komen kan men de git merge --abortbenadering uitbreiden en een aparte test branch maken voorsamenvoegen.

Case: je hebt een topic branch, deze is niet samengevoegd omdat je werd afgeleid/er kwam iets naar boven/je weet maar het is(of was) klaar.

Nu is het mogelijkom dit samen te voegen tot master?

Werk in een testbranch om een oplossing te schatten / vind, verlaat dan de test branch en pas de oplossing toe in de topic branch.

# Checkout the topic branch
git checkout topic-branch-1
# Create a _test_ branch on top of this
git checkout -b test
# Attempt to merge master
git merge master
# If it fails you can abandon the merge
git merge --abort
git checkout -
git branch -D test  # we don't care about this branch really...

Werk aan het oplossen van het conflict.

# Checkout the topic branch
git checkout topic-branch-1
# Create a _test_ branch on top of this
git checkout -b test
# Attempt to merge master
git merge master
# resolve conflicts, run it through tests, etc
# then
git commit <conflict-resolving>
# You *could* now even create a separate test branch on top of master
# and see if you are able to merge
git checkout master
git checkout -b master-test
git merge test

Eindig de topic branch weer af, pas de fix van de test branch toe en ga verder met de PR.
Verwijder tenslotte de test en master-test.

Betrokken? Ja, maar het zal niet knoeien met mijn onderwerp of master branch totdat ik goed en klaar ben.


Antwoord 14

Misschien niet wat de OP wilde, maar voor mij probeerde ik een stabiele branch samen te voegen met een feature branch en er waren te veel conflicten.
Het lukte me niet om de wijzigingen opnieuw in te stellen omdat de HEAD door veel commits was gewijzigd, dus de gemakkelijke oplossing was om het uitchecken naar een stabiele branch te forceren.
je kunt dan afrekenen naar de andere branch en het zal zijn zoals het was voor de merge.

git checkout -f master

git checkout side-branch


Antwoord 15

Bronboom

Omdat je je merge niet commit, dubbelklik dan gewoon op een andere branch (wat betekent checkout it) en wanneer sourcetree je vraagt om alle wijzigingen weg te gooien, ga dan akkoord 🙂

Bijwerken

Ik zie veel min-stemmen, maar elke opmerking… Ik zal dit antwoord achterlaten dat is bedoeld voor degenen die SourceTree als git-client gebruiken (zoals ik – wanneer ik op zoek ben naar een oplossing voor een vraag van OP)

Other episodes