Vraag Ik kwam een ​​samenvoegingsconflict tegen. Hoe kan ik de samenvoeging afbreken?


ik gebruikte git pull en had een samenvoegingsconflict:

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?


1911
2017-09-19 13:21


oorsprong


antwoorden:


Sinds jouw pull was toen niet succesvol HEAD (niet HEAD^) is de laatste "geldige" commit in uw branche:

git reset --hard HEAD

Het andere stuk dat je wilt, is om je wijzigingen te laten oversturen.

In oudere versies van git kon je de "hunne" samenvoegstrategie gebruiken:

git pull --strategy=theirs remote_branch

Maar dit is sindsdien verwijderd, zoals uitgelegd in dit bericht door Junio ​​Hamano (de Git-onderhouder). Zoals opgemerkt in de link, in plaats daarvan zou je dit doen:

git fetch origin
git reset --hard origin

1727
2017-09-19 14:33



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

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

Zorg er zoals altijd voor dat je geen niet-gecommiteerde wijzigingen hebt voordat je met een fusie begint.

Van de git merge man page

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

MERGE_HEAD is aanwezig wanneer een samenvoeging bezig is.

Wat betreft niet-gecommiteerde wijzigingen bij het starten van een samenvoeging:

Als je wijzigingen hebt die je niet wilt plegen voordat je een samenvoeging start, gewoon git stash ze voor de fusie en git stash pop na het beëindigen van de samenvoeging of het afbreken.


1584
2018-03-28 23:16



git merge --abort

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

Als er ongecommitteerde werkwijzigingen aanwezig waren bij het samenvoegen   begonnen, git merge --abort zal in sommige gevallen niet kunnen   reconstrueer deze wijzigingen. Het wordt daarom aanbevolen om altijd   commit of stash je wijzigingen voordat je git merge uitvoert.

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

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


378
2017-11-12 21:40



In deze specifieke use-case wil je niet echt de samenvoeging afbreken, maar het conflict op een bepaalde manier oplossen.

Het is niet echt nodig om een ​​fusie met een andere strategie opnieuw in te stellen en uit te voeren. De conflicten zijn correct gemarkeerd door git en de vereiste om de andere partijen 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 beschikbaar in de index. (Hier worden ze van gelezen voor gebruik in een 3-weg diff-tool van git mergetool.) Je kunt gebruiken git show 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 om de externe versie woordelijk 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

73
2017-09-20 10:41



ik denk dat het is git reset jij hebt nodig.

Pas op voor dat git revert betekent iets heel anders dan laten we zeggen svn revert - in Subversion zal de terugzetting uw (niet-gecommitteerde) wijzigingen negeren, waarbij het bestand wordt teruggezonden naar de huidige versie vanuit de repository, terwijl git revert "maakt" een commit ongedaan.

git reset zou het equivalent van moeten doen svn revert, dat wil zeggen, verwijder je ongewenste wijzigingen.


72
2017-09-19 13:25



Aangezien opmerkingen dat suggereren git reset --merge is een alias voor git merge --abort, het is de moeite waard om dat op te merken git merge --abort is alleen equivalent aan git reset --mergeaangezien a MERGE_HEAD is aanwezig. Dit kan worden gelezen in de hulp voor het samenvoegen commando.

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

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

Persoonlijk vind ik dat git reset --merge veel krachtiger voor scenario's vergelijkbaar met de beschreven en mislukte samenvoegingen in het algemeen.


29
2018-04-02 12:16



Sinds Git 1.6.1.3 git checkout kan aan beide zijden van een samenvoeging afrekenen:

git checkout --theirs _widget.html.erb

16
2017-07-17 01:29



Een alternatief, dat de staat van het werkexemplaar bewaart, is:

git stash
git merge --abort
git stash pop

Over het algemeen raad ik dit af, omdat het effectief lijkt op fuseren in Subversion, omdat het de vertakkingsrelaties weggooit in de volgende commit.


13
2017-07-13 18:57



En als je eindigt met samenvoegconflict en geen dingen hoeft te plegen, maar nog steeds samenvoegfouten worden weergegeven nadat alle onderstaande opdrachten zijn toegepast,

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

Verwijder alstublieft

.git \ index.lock

bestand [knip plakken naar een andere locatie in geval van herstel] en voer vervolgens een van onderstaande commando's in, afhankelijk van welke versie je wilt.

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

Ik hoop dat het helpt !!!


8
2018-04-10 21:26