{"id":53577,"date":"2023-06-29T12:28:55","date_gmt":"2023-06-29T10:28:55","guid":{"rendered":"https:\/\/kinsta.com\/nl\/?p=53577&#038;preview=true&#038;preview_id=53577"},"modified":"2023-07-04T12:08:05","modified_gmt":"2023-07-04T10:08:05","slug":"git-merge","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/","title":{"rendered":"Zo voer je complexe Git merge taken uit"},"content":{"rendered":"<p>Met alles wat je er te doen valt binnen een ontwikkelingsproject, kan je stellen dat <a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git<\/a> een ware uitkomst is. Maar als je veel mensen op de dansvloer hebt, zullen er ongetwijfeld een of twee op elkaars tenen gaan staan. Voor jouw project betekent dit dat twee developers aan dezelfde code kunnen werken en beiden commits moeten maken. Voor deze situaties bieden Git merge strategie\u00ebn uitkomst om dit conflict op te lossen.<\/p>\n<p>Hoewel een Git merge eenvoudig kan zijn, zijn er vaak andere momenten waarop een geavanceerde aanpak vereist is. Je zult dus strategie\u00ebn moeten gebruiken zoals recursief mergen, drie-wegs merges en nog veel meer. Het kan zelfs zo zijn dat je op een gegeven moment een Git merge ongedaan moet maken.<\/p>\n<p>Deze tutorial bespreekt een aantal complexe Git merge technieken om aan je arsenaal toe te voegen. Laten we meteen beginnen!<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Inleiding: Git merge strategie\u00ebn<\/h2>\n<p>Het kernconcept van een merge is eenvoudig: je voegt twee branches samen om meerdere commits in \u00e9\u00e9n te veranderen. Er zijn echter een aantal technieken die je kunt gebruiken om er zeker van te zijn dat je de juiste code commit en samenvoegt.<\/p>\n<p>We gaan hier kijken naar een paar belangrijke strategie\u00ebn die je onder de knie wilt hebben. Ze staan niet op volgorde en op een bepaald moment in je <a href=\"https:\/\/kinsta.com\/nl\/blog\/zo-word-webdeveloper\/\" rel=\"noopener\">ontwikkelcarri\u00e8re<\/a> kun je ze allemaal nodig hebben. Bovendien zul je ook een goed begrip willen hebben van de basisconcepten van Git, zoals pointers, branches en commits. <\/p>\n<h3>Het verschil tussen twee- en driewegs merges<\/h3>\n<p>Het is handig om het verschil te begrijpen tussen een tweewegs merge en zijn driewegs equivalent. De meeste merge strategie\u00ebn die we hierna behandelen gaan over driewegs situaties. Het is goed om het even te hebben over wat een driewegs merge is. Neem het volgende voorbeeld:<\/p>\n<ul>\n<li>Je hebt een <strong>main branch<\/strong> met een aantal commits en een feature branch die ook commits heeft.<\/li>\n<li>Echter, als <strong>de main branch <\/strong>nu verdere commits uitvoert, zullen beide branches divergeren.<\/li>\n<li>Simpel gezegd: zowel <strong>main<\/strong> als de feature branch hebben commits die de ander niet heeft. Als je deze merget met een tweerichtings aanpak, verlies je een commit (waarschijnlijk op <strong>main<\/strong>.)<\/li>\n<li>In plaats daarvan zal Git een nieuwe merge commit maken van zowel de huidige <strong>main<\/strong>\u00a0als de feature branch.<\/li>\n<\/ul>\n<p>Heel kort door de bocht zal Git naar drie verschillende snapshots kijken om wijzigingen te mergen: het hoofd van <strong>main<\/strong>, het hoofd van de feature branch, en de gemeenschappelijke parent. Dit zal de laatste commit zijn die gemeenschappelijk is voor zowel <strong>main<\/strong> als de feature branch.<\/p>\n<p>In de praktijk hoef je je geen zorgen te maken of een bepaalde merge strategie twee- of drieweg is. Vaak moet je een strategie hoe dan ook gebruiken. In ieder geval is het handig om te weten hoe Git &#8216;denkt&#8217; als het aankomt op het mergens van <a href=\"https:\/\/docs.sevalla.com\/applications\/git\/github#import-a-repository-to-github\" rel=\"noopener\">branches en repo&#8217;s<\/a>.<\/p>\n<h3>Fast-forward mergen<\/h3>\n<p>Bij de eerste strategie hoef je misschien geen actie uit te voeren om het uit te voeren. Een fast-forward merge verplaatst de pointer naar de laatste commit op <strong>main <\/strong>zonder een extra commit aan te maken (wat verwarrend kan zijn.) Het is een nette aanpak die veel developers standaard zullen gebruiken.<\/p>\n<p>De techniek begint met een main branch die al dan niet commits kan hebben. In dit geval open je een nieuwe branch, werk je aan de code en maak je commits. Op dit punt moet je die wijzigingen ook terug naar <strong>de main <\/strong>mergen. Een fast-forward merge heeft \u00e9\u00e9n vereiste om uit te voeren:<\/p>\n<ul>\n<li style=\"font-weight: 400\">Je moet ervoor zorgen dat er geen andere commits plaatsvinden op <strong>main<\/strong> terwijl je aan je nieuwe branch werkt.<\/li>\n<\/ul>\n<p>Dit zal niet altijd mogelijk zijn, vooral als je in een groot team werkt. Als je er desondanks voor kiest om je commits te mergen met een main branch die actueel is en zonder eigen commits, dan zal dit een fast-forward merge uitvoeren. Je kunt dit op een paar verschillende manieren doen:<\/p>\n<pre><code class=\"language-bash\">git merge &lt;branch&gt;\n\ngit merge --ff-only\n<\/code><\/pre>\n<p>Vaak hoef je niet aan te geven dat je een fast-forward merge wilt uitvoeren. Dit type merges komt voor bij <a href=\"https:\/\/kinsta.com\/nl\/blog\/git-voor-webdevelopment\/\" rel=\"noopener\">soloprojecten<\/a> of projecten met kleine teams. In een omgeving waarin veel tegelijk gebeurt, is dit een zeldzame merge en zul je vaak andere zien.<\/p>\n<h3>Recursief mergen<\/h3>\n<p>Een recursieve merge is vaak de standaard, simpelweg omdat deze vaker voorkomt dan andere soorten merges. Een recursieve merge is wanneer je commits uitvoert op een branch, maar verdere commits gebeuren ook op <strong>main<\/strong>.<\/p>\n<p>Als het tijd is om samen te voegen, zal Git recursief over de branch gaan om de definitieve commit te doen. Dit betekent dat een merge commit twee parents zal hebben als je hem voltooid hebt.<\/p>\n<p>Net als met een fast-forward merge, zul je normaal gesproken geen recursieve merge hoeven te specificeren. Je kunt ervoor zorgen dat Git niet voor bijvoorbeeld een fast-forward merge kiest door de volgende commando&#8217;s en flags te gebruiken:<\/p>\n<pre><code class=\"language-bash\">git merge --no-ff\n\ngit merge -s recursive &lt;branch1&gt; &lt;branch2&gt;\n<\/code><\/pre>\n<p>De tweede regel gebruikt de <code>-s<\/code> strategie optie en expliciete naamgeving om een merge uit te voeren. In tegenstelling tot een fast-forward merge<em>,<\/em> cre\u00ebert een recursieve merge een speciale merge commit. Voor merges in twee richtingen is een recursieve strategie solide en werkt goed.<\/p>\n<h3>Ours en theirs<\/h3>\n<p>Een veel voorkomende situatie tijdens ontwikkeling is die waarbij je een nieuwe feature binnen je project cre\u00ebert die uiteindelijk geen groen licht krijgt. In veel gevallen moet je veel code mergen die ook afhankelijk is van elkaar. Een &#8216;ours&#8217; merge is de beste manier om deze conflicten op te lossen.<\/p>\n<p>Dit type merge kan zoveel branches aan als je nodig hebt en negeert alle wijzigingen op die andere branches. Het is geweldig als je een opruiming wil doen van oude features of ongewenste ontwikkeling. Hier is het commando dat je nodig hebt:<\/p>\n<pre><code class=\"language-bash\">git merge -s ours &lt;branch1&gt; &lt;branch2&gt;<\/code><\/pre>\n<p>Een ours merge betekent in wezen dat de huidige branch <em>de jure<\/em> de code bevat. Dit sluit aan bij &#8217;theirs&#8217; merges, die de andere branch als correct behandelt. Je moet hier echter een andere strategie optie doorgeven:<\/p>\n<pre><code class=\"language-bash\">git merge -X theirs &lt;branch2&gt;\n<\/code><\/pre>\n<p>Het gebruik van ours en theirs merges kan verwarrend zijn, maar het is over het algemeen veilig om je aan de typische use cases te houden (die van het behouden van alles in de huidige branch en het weggooien van de rest).<\/p>\n<h3>Octopus<\/h3>\n<p>Dealen met meerdere heads &#8211; d.w.z. meer dan \u00e9\u00e9n branch mergen in een andere &#8211; kan een lastig scenario zijn voor een git merge. Met andere woorden,\u00a0 je hebt meer dan twee handen nodig hebt om de conflicten op te lossen. Dit is perfect voor een octopus merge.<\/p>\n<p>Octopus merges zijn als het ware het tegenovergestelde van ours en theirs merges. De typische use case is dat je meerdere commits voor vergelijkbare feature wilt mergen tot \u00e9\u00e9n. Dit is hoe je het doorgeeft:<\/p>\n<pre><code class=\"language-bash\">git merge -s octopus &lt;branch1&gt; &lt;branch2&gt;\n<\/code><\/pre>\n<p>Git zal echter een octopus merge weigeren als je een handmatige resolutie moet maken. Voor automatische resoluties zal een octopus merge standaard zijn als je meerdere branches tot \u00e9\u00e9n moet samenvoegen.<\/p>\n<h3>Resolve<\/h3>\n<p>E\u00e9n van de veiligste manieren om commits samen te voegen is een resolve merge, perfect voor als je een situatie hebt met <a href=\"https:\/\/tonyg.github.io\/revctrl.org\/CrissCrossMerge.html\" target=\"_blank\" rel=\"noopener noreferrer\">criss-cross merges<\/a>. Het is daarnaast een snelle resolutiemethode die je kan implementeren. Je wilt deze wellicht ook gebruiken voor complexere merge histories &#8211; maar alleen met twee heads.<\/p>\n<pre><code class=\"language-bash\">git merge -s resolve &lt;branch1&gt; &lt;branch2&gt;\n<\/code><\/pre>\n<p>Omdat een resolve merge een drieweg algoritme gebruikt om te werken met zowel je huidige branch als de branch waar je vanaf pullt, is het misschien niet zo flexibel als andere merge methoden. Echter, voor de specifieke use case waarvoor je hem nodig hebt, is een resolve merge bijna perfect.<\/p>\n<h3>Subtree<\/h3>\n<p>Deze partner van een recursieve merge kan je mogelijk verwarren. We zullen proberen dit uit te leggen aan de hand van een duidelijk voorbeeld:<\/p>\n<ul>\n<li>Neem eerst twee verschillende trees- X en Y. Dit zullen vaak twee repo&#8217;s zijn.<\/li>\n<li>Je wilt beide trees samenvoegen tot \u00e9\u00e9n.<\/li>\n<li>Als tree Y overeenkomt met een van de subtrees in X, dan wordt tree Y gewijzigd om overeen te komen met de structuur van X.<\/li>\n<\/ul>\n<p>Dit betekent dat een subtree merge fantastisch is als je <a href=\"https:\/\/kinsta.com\/nl\/blog\/monorepo-vs-multi-repo\/\" rel=\"noopener\">meerdere repo&#8217;s wilt combineren<\/a> tot \u00e9\u00e9n definitieve. Het zal ook de nodige wijzigingen aanbrengen in de gemeenschappelijke &#8216;ancestor&#8217;-tree van beide branches.<\/p>\n<pre><code class=\"language-bash\">git merge -s subtree &lt;branch1&gt; &lt;branch2&gt;\n<\/code><\/pre>\n<p>Een subtree merge is dus wat je zoekt als je twee repositories wilt combineren. Het is goed mogelijk dat je moeite hebt om te begrijpen welke merge strategie voor jou de juiste is. Verder in dit artikel bespreken we een paar tools die je hierbij kunnen helpen.<\/p>\n<p>Maar voordat we dit doen, zijn er een aantal geavanceerde merge conflicten waarvan je moet weten hoe je ze oplost.<\/p>\n<h2>Zo ga je om met meer complexe Git merge conflicten<\/h2>\n<p>Het mergen van branches in Git komt in de praktijk vaak neer op het managen en het oplossen van conflicten. Hoe <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-bureau\/\" rel=\"noopener\">groter je team<\/a> en project, hoe groter de kans op conflicten. Sommige daarvan kunnen complex zijn en moeilijk op te lossen.<\/p>\n<p>Gezien hoe conflicten tijd, geld en middelen kunnen opslokken, is het belangrijk om te weten hoe je ze snel in de kiem kunt smoren. In de meeste gevallen werken twee developers aan hetzelfde pakket code en besluiten ze allebei om een commit te doen.<\/p>\n<p>Soms kan dit betekenen dat je de merge helemaal niet kunt starten vanwege wijzigingen die op pending staan of dat er een fout optreedt tijdens de merge die handmatig ingrijpen vereist. Zodra je werkdirectory &#8216;schoon&#8217; is kun je beginnen. Vaak zal Git je op de hoogte stellen van een conflict bij het starten van een merge:<\/p>\n<figure id=\"attachment_155619\" aria-describedby=\"caption-attachment-155619\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155619 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-conflict.png\" alt=\"Een Terminal venster met Git commando's om alle branches te laten zien en dan wijzigingen te mergen.Een fout wordt getoond als een merge conflict met instructies om de resultaten van de conflicten te repareren en te committen.\" width=\"1000\" height=\"412\"><figcaption id=\"caption-attachment-155619\" class=\"wp-caption-text\">Een Terminal venster dat een merge conflict in Git laat zien.<\/figcaption><\/figure>\n<p>Voor meer informatie kun je een <code>git status<\/code> uitvoeren en de details bekijken:<\/p>\n<figure id=\"attachment_155623\" aria-describedby=\"caption-attachment-155623\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155623 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-status.png\" alt=\"Een Terminal venster dat het resultaat laat zien van een git status commando.Het toont een lijst van bestanden in het groen, met instructies om niet-gesmeerde paden op te lossen.\" width=\"1000\" height=\"342\"><figcaption id=\"caption-attachment-155623\" class=\"wp-caption-text\">Een Terminal venster dat de resultaten van een git status commando laat zien.<\/figcaption><\/figure>\n<p>Nu kun je beginnen te werken aan de verschillende bestanden die het conflict veroorzaken. De tools en technieken die we hieronder bespreken zullen je helpen.<\/p>\n<h3>Merges afbreken en resetten<\/h3>\n<p>Soms moet je de merge helemaal stoppen en met een schone lei beginnen. In feite zijn beide commando&#8217;s die we noemen geschikt voor situaties waarin je nog niet weet wat je met een conflict moet doen.<\/p>\n<p>Je kunt ervoor kiezen om een merge die bezig is af te breken of te resetten met de volgende commando&#8217;s:<\/p>\n<pre><code class=\"language-bash\">git merge --abort\n\ngit reset\n<\/code><\/pre>\n<p>De twee commando&#8217;s lijken op elkaar, maar je gebruikt ze in verschillende omstandigheden. Het afbreken van een merge zal de branch terugzetten naar de status van voor de merge. In sommige gevallen zal dit echter niet werken. Als je working directory bijvoorbeeld niet-gecommitte en niet-gestashte wijzigingen bevat, zul je geen abort kunnen uitvoeren.<\/p>\n<p>Een merge reset betekent dat je de bestanden terugdraait naar een bekende &#8216;goede&#8217; state. Dit laatste is iets om te overwegen als Git er niet in slaagt om de merge te starten. Merk op dat dit commando <a href=\"https:\/\/kinsta.com\/nl\/blog\/git-delete-lokale-branch\/\" rel=\"noopener\">alle wijzigingen zal verwijderen<\/a> die je niet commit, wat betekent dat dit een handeling is die zorgvuldigheid vereist.<\/p>\n<h3>Conflicten checken<\/h3>\n<p>De meeste merge conflicten zullen eenvoudig te achterhalen en op te lossen zijn. In sommige gevallen zul je echter dieper moeten graven om erachter te komen waarom een conflict ontstaat en hoe je het kunt oplossen.<\/p>\n<p>Je kunt meer context krijgen na een <code>git merge<\/code> door een checkout te gebruiken:<\/p>\n<pre><code class=\"language-bash\">git checkout --conflict=diff3 &lt;filename&gt;\n<\/code><\/pre>\n<p>Met dit commando pak je de typische navigatie die een checkout je geeft en maak je een vergelijking tussen de twee bestanden die het conflict laat zien:<\/p>\n<figure id=\"attachment_155618\" aria-describedby=\"caption-attachment-155618\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155618 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/checkout-merge-conflict.png\" alt=\"Een code editor die de resultaten laat zien van het uitvoeren van een git checkout --conflict commando.Het markeert delen van de code in rood en gebruikt symbolen om aan te geven waar er een wijziging is die een commit verhindert om plaats te vinden.\" width=\"1000\" height=\"486\"><figcaption id=\"caption-attachment-155618\" class=\"wp-caption-text\">Checkout van een conflict binnen een specifiek projectbestand.<\/figcaption><\/figure>\n<p>In technische zin wordt het bestand opnieuw gecontroleerd en worden de conflictmarkers vervangen. Je kunt dit een paar keer doen tijdens een resolutie. Als je hier het argument <code>diff3 <\/code>\u00a0doorgeeft, krijg je de basisversie en alternatieven in de &#8216;ours&#8217; en &#8217;theirs&#8217; versies.<\/p>\n<p>Let op dat de standaard argumentoptie <code>merge<\/code> is, die je niet hoeft te specificeren tenzij je de stijl van het merge confict wijzigt ten opzichte van de standaard.<\/p>\n<h3>Negatieve ruimte negeren<\/h3>\n<p><a href=\"https:\/\/kinsta.com\/nl\/blog\/webdesign-best-practices\/\" rel=\"noopener\">Negatieve ruimte<\/a> en het gebruik ervan is een veel voorkomend discussiepunt. Elke <a href=\"https:\/\/kinsta.com\/nl\/blog\/beste-programmeertaal-om-te-leren\/\" rel=\"noopener\">programmeertaal<\/a> gebruikt zijn eigen spacing en zelfs individuele developers gebruiken verschillende opmaak.<\/p>\n<p>Of je spaties of tabs moet gebruiken is een discussiepunt waar we onze handen niet aan vuil zullen maken. Als je echter situaties hebt waarbij je de opmaak van de een naar de ander verandert, afhankelijk van het bestand en de codeerstandaard, dan zou je tegen dit Git merge probleem aan kunnen lopen.<\/p>\n<p>Je zult weten dat dit de reden is waarom de merge mislukt, omdat er regels verwijderd en toegevoegd zullen zijn als je naar het conflict kijkt:<\/p>\n<figure id=\"attachment_155627\" aria-describedby=\"caption-attachment-155627\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155627 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/negative-space-conflict.png\" alt=\"Een code editor die de verschillen laat zien tussen twee bestanden met merge conflicten.Elk verschilgebied gebruikt symbolen om de wijziging aan te geven, samen met rode markering voor hen.\" width=\"1000\" height=\"692\"><figcaption id=\"caption-attachment-155627\" class=\"wp-caption-text\">Een bestand met de conflictverschillen in een editor.<\/figcaption><\/figure>\n<p>Dit komt omdat Git naar die regels kijkt en de negatieve ruimte als een wijziging beschouwt.<\/p>\n<p>Je kunt echter specifieke argumenten toevoegen aan het <code>git merge<\/code> commando dat negatieve spaties in de relevante bestanden over het hoofd zal zien:<\/p>\n<pre><code class=\"language-bash\">git merge -Xignore-all-space\n\ngit merge -Xignore-space-change\n<\/code><\/pre>\n<p>Hoewel deze twee argumenten op elkaar lijken, hebben ze een uniek verschil. Als je ervoor kiest om alle negatieve ruimte te negeren, dan zal Git dat doen. Het is een brede benadering, maar in tegenstelling tot <code>-Xignore-space-change<\/code> zal het alleen reeksen van \u00e9\u00e9n of meer negatieve spaties als gelijkwaardig tellen. Als zodanig zal het enkele spaties aan het eind van regels negeren.<\/p>\n<p>Voor extra veiligheid kun je de merge ook controleren met het <code>--no-commit<\/code> commando, om te controleren of je negatieve spaties op de juiste manier negeert en telt.<\/p>\n<h3>Logs mergen<\/h3>\n<p><a href=\"https:\/\/kinsta.com\/docs\/devkinsta\/logging\/\" rel=\"noopener\">Loggen is cruciaal<\/a> voor bijna elk stuk software dat data doorgeeft. Bij Git kun je de logs gebruiken om meer details over een merge conflict te achterhalen. Je hebt toegang tot deze informatie met <code>git log<\/code>:<\/p>\n<figure id=\"attachment_155621\" aria-describedby=\"caption-attachment-155621\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155621 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-log-file.png\" alt=\"Een Terminal venster dat de Git log voor een repository laat zien.Er zijn twee commits met gele titels, samen met details over de auteur, datum en commit boodschap.\" width=\"1000\" height=\"537\"><figcaption id=\"caption-attachment-155621\" class=\"wp-caption-text\">De Git log uitvoeren en bekijken in de Terminal.<\/figcaption><\/figure>\n<p>Het is in wezen een tekstbestand dat elke actie binnen een repo dumpt. Je kunt echter verdere argumenten toevoegen om de weergave te verfijnen en alleen de commits te zien die je wilt:<\/p>\n<pre><code class=\"language-bash\">git log --oneline --left-right &lt;branch1&gt;...&lt;branch2&gt;\n<\/code><\/pre>\n<p>Dit gebruikt een <a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Git-Tools-Revision-Selection#_triple_dot\" target=\"_blank\" rel=\"noopener noreferrer\">&#8216;Triple Dot&#8217;<\/a> om een lijst te geven van commits die betrokken zijn bij twee branches tijdens een merge. Het zal alle commits filteren die beide branches delen, wat een selectie van commits overlaat die je verder kan onderzoeken.<\/p>\n<p>Je kunt ook <code>git log --oneline --left-right --merge<\/code> gebruiken om alleen commits te laten zien aan beide kanten van een merge die een conflicterend bestand &#8216;aanraken&#8217;. De <code>-p<\/code> optie zal je de exacte wijzigingen voor een specifieke &#8216;diff&#8217; laten zien, maar merk op dat dit alleen geldt voor commits die niet samengevoegd zijn. Hier is een omweg voor, die we hierna behandelen.<\/p>\n<h3>Het combined diff format gebruiken om een Git merge conflict te onderzoeken<\/h3>\n<p>Je kunt de view die je krijgt met <code>git log<\/code> verder gebruiken om merge conflicten te onderzoeken. In normale omstandigheden zal Git code samenvoegen en alles dat lukt gaan stagen. Dit laat alleen de conflicterende regels over, en die kun je zien met het <code>git diff<\/code> commando:<\/p>\n<figure id=\"attachment_155620\" aria-describedby=\"caption-attachment-155620\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155620 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-diff.png\" alt=\"Een Terminal venster dat de uitvoer van een git diff commando laat zien.Het toont details van de wijzigingen in groene en rode tekst, samen met meer details van de verschillen met bestandsnamen binnen het archief.\" width=\"1000\" height=\"714\"><figcaption id=\"caption-attachment-155620\" class=\"wp-caption-text\">Een git diff commando uitvoeren in de Terminal.<\/figcaption><\/figure>\n<p>Dit &#8216;combined diff&#8217; format voegt twee extra kolommen met informatie toe. De eerste vertelt je of een regel verschilt tussen jouw (&#8216;ours&#8217;) branch en de working copy; de tweede geeft je dezelfde informatie voor de &#8217;theirs&#8217; branch.<\/p>\n<p>Wat tekens betreft geeft een plusteken aan of een regel een toevoeging is aan de working copy, maar niet in die specifieke kant van de merge, en een minteken geeft aan of de regel verwijderd is.<\/p>\n<p>Merk op dat je dit combined diff format ook in Git&#8217;s log kunt zien door een paar commando&#8217;s te gebruiken:<\/p>\n<pre><code class=\"language-bash\">git show\n\ngit log --cc -p\n<\/code><\/pre>\n<p>Het eerste is een commando dat je gebruikt op een merge commit om zijn geschiedenis te zien. Het tweede commando gebruikt de functionaliteit van <code>-p<\/code> om veranderingen aan een niet-merge commit naast het combined diff format te laten zien.<\/p>\n<h2>Zo maak je een Git merge ongedaan<\/h2>\n<p>Fouten kunnen gebeuren, en je kunt merges uitvoeren waar je later spijt van krijgt. In sommige gevallen kun je eenvoudig de meest recente commit wijzigen met <code>git commit --amend<\/code>. Dit zal de editor openen zodat je het laatste commit bericht kunt wijzigen.<\/p>\n<p>Hoewel je complexere merge conflicten en de resulterende wijzigingen <em>kunt<\/em> terugdraaien, kan het lastig zijn omdat commits vaak permanent zijn.<\/p>\n<p>Als zodanig zijn er veel stappen die je moet volgen:<\/p>\n<ul>\n<li>Ten eerste moet je commits bekijken en verwijzingen vinden naar de merges die je nodig hebt.<\/li>\n<li>Vervolgens moet je branches checkouten om commit histories te bekijken.<\/li>\n<li>Als je eenmaal kennis hebt opgedaan van de branches en commits die je nodig hebt, zijn er specifieke Git commando&#8217;s die je moet uitvoeren op basis van de door jou gewenste actie.<\/li>\n<\/ul>\n<p>Laten we alles in meer detail bekijken en beginnen met het reviewproces. Van daaruit kunnen we je een snelle manier laten zien om een Git merge ongedaan te maken, en dan kijken naar specifieke commando&#8217;s voor meer geavanceerde use cases.<\/p>\n<h3>Commits reviewen<\/h3>\n<p>Het <code>git log --oneline<\/code> commando is geweldig als je de revisie ID&#8217;s en commit berichten met betrekking tot de huidige branch wilt zien:<\/p>\n<figure id=\"attachment_155622\" aria-describedby=\"caption-attachment-155622\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155622 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-log-oneline.png\" alt=\"Een deel van een Terminal venster dat de uitvoer van een \u00e9\u00e9n line Git diff commando laat zien. Het toont een minimaal aantal details: de hash van de commit, branches en boodschap voor elk voordat het de Terminal prompt toont.\" width=\"1000\" height=\"356\"><figcaption id=\"caption-attachment-155622\" class=\"wp-caption-text\">Het uitvoeren van een \u00e9\u00e9nregelig git diff commando in de Terminal.<\/figcaption><\/figure>\n<p>Het <code>git log --branches=*<\/code> commando zal je dezelfde informatie laten zien, maar dan voor alle branches. Je kunt de referentie ID&#8217;s naast een <code>git checkout<\/code> gebruiken om een &#8216;detached <code>HEAD<\/code>&#8216; state te maken. Dit betekent dat je technisch gezien op geen enkele branch werkt, en zodra je terugschakelt naar een gevestigde branch, &#8216;orphan&#8217; je de wijzigingen.<\/p>\n<p>Als zodanig kun je de checkout bijna als een risicovrije speeltuin gebruiken. Echter, als je de wijzigingen wilt behouden, kun je de branch checkouten en <a href=\"https:\/\/kinsta.com\/nl\/blog\/git-rename-branch\/\" target=\"_blank\" rel=\"noopener noreferrer\">een nieuwe naam geven<\/a> met <code>git checkout -b &lt;branch-name&gt;<\/code>. Dit is een goede manier om een Git merge ongedaan te maken, maar er zijn meer genuanceerde manieren om dit te doen voor geavanceerd gebruik.<\/p>\n<h3>Git reset gebruiken<\/h3>\n<p>Veel van je merge conflicten zouden op een lokale repo kunnen plaatsvinden. In deze gevallen is <code>git reset<\/code> het commando dat je nodig hebt. Dit commando heeft echter meer parameters en argumenten die je wil kennen. Hier lees je hoe je het commando in de praktijk gebruikt:<\/p>\n<pre><code class=\"language-bash\">git reset --hard &lt;reference&gt;\n<\/code><\/pre>\n<p>Het eerste deel hiervan &#8211; <code>git reset --hard<\/code> &#8211; doorloopt drie stappen:<\/p>\n<ul>\n<li style=\"font-weight: 400\">Het verplaatst de reference branch naar zijn locatie voor de merge commit.<\/li>\n<li style=\"font-weight: 400\">De harde reset zorgt ervoor dat de &#8216;index&#8217; (d.w.z. de volgende voorgestelde commit snapshot) eruit ziet als de reference branch.<\/li>\n<li style=\"font-weight: 400\">Het laat de working directoy eruit zien als de index.<\/li>\n<\/ul>\n<p>Zodra je dit commando gebruikt, verwijdert de commit historie latere commits en reset het de historie naar de gerefereerde ID. Het is een nette manier om een Git merge ongedaan te maken, maar het is niet geschikt voor alle use cases.<\/p>\n<p>Je zult bijvoorbeeld een fout veroorzaken als je een lokale reset commit naar een <a href=\"https:\/\/kinsta.com\/nl\/blog\/gitlab-en-github\/\" rel=\"noopener\">remote repo<\/a> probeert te pushen die die commit bevat. In dit scenario is er een ander commando dat je kunt gebruiken.<\/p>\n<h3>Git revert gebruiken<\/h3>\n<p>Hoewel <code>git reset<\/code> en <code>git revert<\/code> op elkaar lijken, zijn er een paar belangrijke verschillen. In de voorbeelden tot nu toe, houdt het ongedaan maken in het verplaatsen van de referentie-aanwijzers en HEAD naar een specifieke commit. Het lijkt op het schudden van speelkaarten om een nieuwe volgorde te maken.<\/p>\n<p>In tegenstelling hiermee cre\u00ebert <code>git revert<\/code> een nieuwe commit gebaseerd op backtracking wijzigingen, werkt dan de referentiepunten bij en maakt de branch de nieuwe &#8217;tip&#8217; Dit is ook waarom je dit commando zou moeten gebruiken voor remote repo samenvoeg conflicten.<\/p>\n<p>Je zou <code>git revert &lt;reference&gt;<\/code> kunnen gebruiken om een Git merge ongedaan te maken. Merk op dat je altijd een commit referentie moet specificeren, anders zal het commando niet uitvoeren. Je kunt ook <code>HEAD<\/code> aan het commando meegeven om terug te keren naar de laatste commit.<\/p>\n<p>Je kunt Git echter meer duidelijkheid geven over wat je wilt doen:<\/p>\n<pre><code class=\"language-bash\">git revert -m 1 &lt;reference&gt;\n<\/code><\/pre>\n<p>Als je de merge aanroept, zal de nieuwe commit twee &#8216;ouders&#8217; hebben De ene heeft betrekking op de referentie die je opgeeft, en de andere is de top van de branch die je wilt samenvoegen. In dit geval vertelt <code>-m 1<\/code> Git om de eerste ouder &#8211; d.w.z. de gespecificeerde referentie &#8211; als de &#8216;hoofdlijn&#8217; te houden.<\/p>\n<p>De standaard optie voor <code>git revert<\/code> is <code>-e<\/code> of <code>--edit<\/code>. Dit zal de editor openen om de commit boodschap aan te passen voordat je terugdraait. Je kunt echter ook <code>--no-edit<\/code> opgeven, wat de editor niet zal openen.<\/p>\n<p>Je kunt ook <code>-n<\/code> of <code>--no-commit<\/code> doorgeven. Dit vertelt <code>git revert<\/code> om <em>geen<\/em> nieuwe commit aan te maken, maar de wijzigingen &#8216;om te keren&#8217; en ze toe te voegen aan de staging index en de werkmap.<\/p>\n<h2>Het verschil tussen merging vs rebasing in Git<\/h2>\n<p>In plaats van het <code>git merge<\/code> commando te gebruiken, kun je ook <code>git rebase<\/code> gebruiken. Dit is ook een manier om wijzigingen in \u00e9\u00e9n map te integreren, maar met een verschil:<\/p>\n<ul>\n<li>Een driewegs merge is de standaard als je <code>git merge<\/code> gebruikt. Het combineert snapshots van twee huidige branches en voegt het samen met een gemeenschappelijke ancestor van beide om een nieuwe commit te maken.<\/li>\n<li>Rebasen houdt in dat je een gepatchte wijziging van een afwijkende branch neemt en toepast op een andere, zonder de ancestor nodig te hebben. Dit betekent dat er geen nieuwe commit zal zijn.<\/li>\n<\/ul>\n<p>Om dit commando te gebruiken, checkout je naar een branch waar je naar wilt rebasen. Vanaf daar kun je het volgende commando gebruiken:<\/p>\n<pre><code class=\"language-bash\">git rebase -i &lt;reference&gt;\n<\/code><\/pre>\n<p>In veel situaties zal je referentie je main brach zijn. De optie <code>-i<\/code> start &#8216;interactive rebasing&#8217;. Dit geeft je de mogelijkheid om de commits aan te passen terwijl ze over worden gezet. Je kunt dit gebruiken om de commit historie op te schonen, wat \u00e9\u00e9n van de grote voordelen is van het gebruik van <code>git rebase<\/code>.<\/p>\n<p>Het uitvoeren van het commando zal een lijst van mogelijke commits die verplaatst moeten worden in de editor laten zien. Dit geeft je volledige vrijheid om te veranderen hoe de commit geschiedenis eruit ziet. Je kunt ook commits mergen als je het <code>pick<\/code> commando verandert in <code>fixup<\/code>. Zodra je je wijzigingen opslaat, zal Git de rebase uitvoeren.<\/p>\n<p>Over het algemeen gebruik je Git merge voor veel conflicten. Maar rebasen heeft ook veel voordelen. Terwijl merge eenvoudig te gebruiken is en je de context rondom je merge historie laat behouden, kan rebasen netter zijn omdat je je commit historie kunt vereenvoudigen tot \u00e9\u00e9n.<\/p>\n<p>Desondanks moet je voorzichtiger zijn met rebasen, omdat de kans op fouten enorm is. Bovendien zou je deze techniek niet op publieke branches moeten gebruiken, aangezien rebasen alleen jouw repo zal be\u00efnvloeden. Om de resulterende problemen op te lossen, moet je nog meer merges doen en zul je meerdere commits zien.<\/p>\n<h2>Tools die je helpen om een Git merge beter te beheren<\/h2>\n<p>Gezien de complexiteit rondom Git merge conflicten, zou je wel eens een helpende hand kunnen gebruiken. Er zijn genoeg tools beschikbaar om je te helpen een succesvolle merge uit te voeren, en als je <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-editor\/\" rel=\"noopener\">Intellij IDEA<\/a> gebruikt, heb je een ingebouwde methode met het <strong>Branches<\/strong> menu:<\/p>\n<figure id=\"attachment_155624\" aria-describedby=\"caption-attachment-155624\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155624 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/intellij-branches.png\" alt=\"De onderste hoek van de Intellij IDEA code editor, met het Git widget paneel. Het contextmenu van de rechtermuisknop wordt getoond, met de optie Checkout om wijzigingen aan de branch te bekijken.\" width=\"1000\" height=\"378\"><figcaption id=\"caption-attachment-155624\" class=\"wp-caption-text\">Een branch controleren binnen Intellij IDEA.<\/figcaption><\/figure>\n<p><a href=\"https:\/\/code.visualstudio.com\/#built-in-git\" target=\"_blank\" rel=\"noopener noreferrer\">VSCode<\/a> heeft ook soortgelijke functionaliteit in zijn gebruikersinterface (UI.) Oudere Atom gebruikers zullen merken dat Microsoft zijn fantastische <a href=\"https:\/\/kinsta.com\/nl\/blog\/git-vs-github\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git integratie<\/a> hier heeft voortgezet, compleet met de mogelijkheid om <a href=\"https:\/\/kinsta.com\/blog\/what-is-github\/\" rel=\"noopener\">verbinding te maken met GitHub<\/a> zonder verdere uitbreidingen of add-ons.<\/p>\n<p>Je krijgt ook meer opties met het <strong>Command Palette<\/strong>. Dit is zelfs het geval in editors die voortbouwen op het open-source framework van VSCode, zoals <a href=\"https:\/\/www.onivim.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Onivim2<\/a>:<\/p>\n<figure id=\"attachment_155628\" aria-describedby=\"caption-attachment-155628\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155628 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/onivim-git-merge.png\" alt=\"Een deel van het Onivim2 scherm met het Command Palette en het Git: Merge Branch commando.\" width=\"1000\" height=\"396\"><figcaption id=\"caption-attachment-155628\" class=\"wp-caption-text\">Toegang tot het Git: Merge Branch commando vanuit het Command Palette in Onivim2.<\/figcaption><\/figure>\n<p>Het voordeel hier, zoals bij alle tools in deze lijst, is dat je de commandoregel niet nodig hebt om merges uit te voeren. Je moet meestal een bron en doel branch selecteren uit een drop-down menu en dan de editor de merge laten uitvoeren. Toch hoef je niet hands-off te werken. Je kunt de wijzigingen achteraf bekijken en dan de commit doen die je nodig hebt.<\/p>\n<p>Een editor die een aparte grafische gebruikersinterface (GUI) biedt voor het werken met Git is <a href=\"https:\/\/kinsta.com\/blog\/how-to-use-sublime-text\/\" rel=\"noopener\">Sublime Text<\/a>. Als je deze editor gebruikt, zou <a href=\"https:\/\/www.sublimemerge.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Sublime Merge<\/a> een ideale toevoeging aan je werkproces kunnen zijn:<\/p>\n<figure id=\"attachment_155629\" aria-describedby=\"caption-attachment-155629\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155629 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/sublime-merge.png\" alt=\"De Subline Merge interface, die een lijst van commits aan de linkerkant van het scherm laat zien, samen met een samenvatting van de wijzigingen en conflicten met een specifieke commit aan de rechterkant.\" width=\"1000\" height=\"498\"><figcaption id=\"caption-attachment-155629\" class=\"wp-caption-text\">De Sublime Merge app.<\/figcaption><\/figure>\n<p>Ongeacht je keuze voor een code editor, zal het vaak de mogelijkheid bieden om met Git te werken zonder de commandoregel te gebruiken. Dit is zelfs het geval met Vim en Neovim, met behulp van <a href=\"https:\/\/github.com\/tpope\/vim-fugitive\" target=\"_blank\" rel=\"noopener noreferrer\">Tim Pope&#8217;s Git Fugitive<\/a> plugin, die fantastisch en eenvoudig te gebruiken is.<\/p>\n<p>Er zijn echter een paar speciale samenvoegprogramma&#8217;s van derden die zich alleen op deze taak richten.<\/p>\n<h3>Dedicated Git merge apps<\/h3>\n<p><a href=\"https:\/\/mergify.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Mergify<\/a> is bijvoorbeeld een bedrijfsmatige manier om code te mergen die ge\u00efntegreerd is in je continuous integration\/continuous delivery (CI\/CD)\u00a0 pijplijn en workflow:<\/p>\n<figure id=\"attachment_155626\" aria-describedby=\"caption-attachment-155626\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155626 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/mergify-app.png\" alt=\"Een deel van de Mergify website met een aantal witomlijnde graphics op een zwarte achtergrond. Er zijn lijsten met Git branches, timers, code editors en grafieken.\" width=\"1000\" height=\"640\"><figcaption id=\"caption-attachment-155626\" class=\"wp-caption-text\">De Mergify website.<\/figcaption><\/figure>\n<p>Sommige van de features hier helpen je om het bijwerken van je pull requests v\u00f3\u00f3r het mergen te automatiseren, ze opnieuw te rangschikken op basis van prioriteit en ze ook in batches te mergen. Voor een open source oplossing kan <a href=\"http:\/\/meldmerge.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Meld<\/a> waardevol zijn:<\/p>\n<figure id=\"attachment_155625\" aria-describedby=\"caption-attachment-155625\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155625 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/meld-app.png\" alt=\"De Meld app interface toont code naast elkaar, compleet met blauwe en groene markeringen voor wijzigingen tussen de bestanden.\" width=\"1000\" height=\"651\"><figcaption id=\"caption-attachment-155625\" class=\"wp-caption-text\">De Meld app interface.<\/figcaption><\/figure>\n<p>De stabiele versie ondersteunt Windows en <a href=\"https:\/\/kinsta.com\/nl\/blog\/linux-opdrachten\/\" rel=\"noopener\">Linux<\/a> en draait onder de <a href=\"https:\/\/kinsta.com\/learn\/wordpress-gpl\/\" rel=\"noopener\">GPL licentie<\/a>. Dit geeft je basisfunctionaliteit om branches te vergelijken, merges te bewerken en meer. Je krijgt zelfs twee- of driewegs vergelijkingen en ondersteuning voor andere <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-versiebeheer\/\" rel=\"noopener\">versiebeheersystemen<\/a> zoals <a href=\"https:\/\/subversion.apache.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Subversion<\/a>.<\/p>\n<h2>Samenvatting<\/h2>\n<p>Git is een essenti\u00eble tool om effici\u00ebnt samen te werken en codeveranderingen te beheren. Maar als meerdere developers aan dezelfde code werken, kunnen er conflicten ontstaan. Git merge strategie\u00ebn zullen je helpen om deze conflicten op te lossen, en er zijn veel manieren om de klus te klaren. Voor complexere Git merge strategie\u00ebn moet je je richten op geavanceerde tactieken.<\/p>\n<p>Soms zijn ze eenvoudig, zoals het negeren van negatieve ruimtes of het doorzoeken van de zoeklogs. Je hoeft echter ook niet altijd de commandoregel te gebruiken. Er zijn genoeg apps om je te helpen, en je code editor zal vaak ook een ingebouwde interface gebruiken.<\/p>\n<p>Als je <a href=\"https:\/\/sevalla.com\/application-hosting\/\">Applicatie Hosting<\/a> van hoge kwaliteit zoekt, dan kunnen wij je helpen. Onze cloud-based Applicatie Hosting diensten zorgen ervoor dat je full-stack app in een mum van tijd klaar is voor piekverkeer.<\/p>\n<p>Welke van deze Git merge strategie\u00ebn helpt jou uit de problemen? Laat het ons weten in het commentsectie hieronder!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Met alles wat je er te doen valt binnen een ontwikkelingsproject, kan je stellen dat Git een ware uitkomst is. Maar als je veel mensen op &#8230;<\/p>\n","protected":false},"author":199,"featured_media":53578,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[912],"class_list":["post-53577","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-git"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Zo voer je complexe Git merge taken uit - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Als je veel commits te verwerken hebt, zullen sommige commits conflicteren met andere en een merge nodig hebben. Deze post bespreekt hoe je complexe Git merge taken uitvoert!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zo voer je complexe Git merge taken uit\" \/>\n<meta property=\"og:description\" content=\"Als je veel commits te verwerken hebt, zullen sommige commits conflicteren met andere en een merge nodig hebben. Deze post bespreekt hoe je complexe Git merge taken uitvoert!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-29T10:28:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-04T10:08:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jeremy Holcombe\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Als je veel commits te verwerken hebt, zullen sommige commits conflicteren met andere en een merge nodig hebben. Deze post bespreekt hoe je complexe Git merge taken uitvoert!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremy Holcombe\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/\"},\"author\":{\"name\":\"Jeremy Holcombe\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\"},\"headline\":\"Zo voer je complexe Git merge taken uit\",\"datePublished\":\"2023-06-29T10:28:55+00:00\",\"dateModified\":\"2023-07-04T10:08:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/\"},\"wordCount\":4335,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg\",\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/\",\"name\":\"Zo voer je complexe Git merge taken uit - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg\",\"datePublished\":\"2023-06-29T10:28:55+00:00\",\"dateModified\":\"2023-07-04T10:08:05+00:00\",\"description\":\"Als je veel commits te verwerken hebt, zullen sommige commits conflicteren met andere en een merge nodig hebben. Deze post bespreekt hoe je complexe Git merge taken uitvoert!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Git\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/git\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Zo voer je complexe Git merge taken uit\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/nl\/#website\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snelle, veilige, premium hostingoplossingen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/nl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\",\"https:\/\/x.com\/Kinsta_NL\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\",\"name\":\"Jeremy Holcombe\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"caption\":\"Jeremy Holcombe\"},\"description\":\"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/jeremyholcombe\/\"],\"url\":\"https:\/\/kinsta.com\/nl\/blog\/author\/jeremyholcombe\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Zo voer je complexe Git merge taken uit - Kinsta\u00ae","description":"Als je veel commits te verwerken hebt, zullen sommige commits conflicteren met andere en een merge nodig hebben. Deze post bespreekt hoe je complexe Git merge taken uitvoert!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/","og_locale":"nl_NL","og_type":"article","og_title":"Zo voer je complexe Git merge taken uit","og_description":"Als je veel commits te verwerken hebt, zullen sommige commits conflicteren met andere en een merge nodig hebben. Deze post bespreekt hoe je complexe Git merge taken uitvoert!","og_url":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2023-06-29T10:28:55+00:00","article_modified_time":"2023-07-04T10:08:05+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg","type":"image\/jpeg"}],"author":"Jeremy Holcombe","twitter_card":"summary_large_image","twitter_description":"Als je veel commits te verwerken hebt, zullen sommige commits conflicteren met andere en een merge nodig hebben. Deze post bespreekt hoe je complexe Git merge taken uitvoert!","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg","twitter_creator":"@Kinsta_NL","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Jeremy Holcombe","Geschatte leestijd":"22 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/"},"author":{"name":"Jeremy Holcombe","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21"},"headline":"Zo voer je complexe Git merge taken uit","datePublished":"2023-06-29T10:28:55+00:00","dateModified":"2023-07-04T10:08:05+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/"},"wordCount":4335,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg","inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/nl\/blog\/git-merge\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/","url":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/","name":"Zo voer je complexe Git merge taken uit - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg","datePublished":"2023-06-29T10:28:55+00:00","dateModified":"2023-07-04T10:08:05+00:00","description":"Als je veel commits te verwerken hebt, zullen sommige commits conflicteren met andere en een merge nodig hebben. Deze post bespreekt hoe je complexe Git merge taken uitvoert!","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/git-merge\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/06\/git-merge.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/git-merge\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"Git","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/git\/"},{"@type":"ListItem","position":3,"name":"Zo voer je complexe Git merge taken uit"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/nl\/#website","url":"https:\/\/kinsta.com\/nl\/","name":"Kinsta\u00ae","description":"Snelle, veilige, premium hostingoplossingen","publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/nl\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","https:\/\/x.com\/Kinsta_NL","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21","name":"Jeremy Holcombe","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","caption":"Jeremy Holcombe"},"description":"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.","sameAs":["https:\/\/www.linkedin.com\/in\/jeremyholcombe\/"],"url":"https:\/\/kinsta.com\/nl\/blog\/author\/jeremyholcombe\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/53577","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/users\/199"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=53577"}],"version-history":[{"count":14,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/53577\/revisions"}],"predecessor-version":[{"id":53735,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/53577\/revisions\/53735"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53577\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53577\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53577\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53577\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53577\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53577\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53577\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53577\/translations\/es"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/53577\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/53578"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=53577"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=53577"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=53577"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}