{"id":22891,"date":"2025-10-17T17:41:35","date_gmt":"2025-10-17T15:41:35","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=22891"},"modified":"2025-11-01T19:50:41","modified_gmt":"2025-11-01T18:50:41","slug":"vermeide-git-foxtrot-merge-schritt-fuer-schritt-anleitung-mit-loesung","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=22891","title":{"rendered":"Vermeide git Foxtrot-Merge &#8211; Schritt f\u00fcr Schritt Anleitung mit L\u00f6sung"},"content":{"rendered":"<p>Der <a href=\"https:\/\/bit-booster.blogspot.com\/\" target=\"_blank\">Foxtrott-Merge ist wie Tanzen mit Git<\/a> \u2013 nur dass hier nicht die F\u00fc\u00dfe stolpern, sondern die Commits. Beide starten synchron, drehen sich elegant umeinander, bis einer pl\u00f6tzlich im falschen Takt mitschreibt. W\u00e4hrend T\u00e4nzer das charmant \u00fcberspielen, verursacht es in Git eine chaotische Merge-Historie. Der Foxtrott bringt Schwung ins Parkett, der Foxtrott-Merge dagegen Unordnung ins Repository. <\/p>\n<p>Und das Beste daran: Ich kann zwar kein <a href=\"https:\/\/bit-booster.blogspot.com\/\" target=\"_blank\">Foxtrott tanzen<\/a>, aber diesen Merge krieg ich jedes Mal hin \u2013 leider. In diesem Sinne mal eine Anleitung mit L\u00f6sung.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/foxtrot.jpeg\" alt=\"\" width=\"1024\" height=\"1024\" class=\"aligncenter size-full wp-image-22900\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/foxtrot.jpeg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/foxtrot-300x300.jpeg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/foxtrot-150x150.jpeg 150w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/foxtrot-768x768.jpeg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/foxtrot-100x100.jpeg 100w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/foxtrot-120x120.jpeg 120w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Ein Foxtrot Merge ist ein problematischer Merge-Commit in Git, bei dem die Reihenfolge der Parent-Commits vertauscht ist und dadurch die First-Parent-Historie des Hauptzweigs durcheinanderbringt. <\/p>\n<p>Konkret entsteht ein Foxtrot Merge, wenn du lokale \u00c4nderungen committed hast, dann \u00a0<strong>git pull<\/strong>\u00a0 ausf\u00fchrst (was automatisch einen Merge erstellt), und dieser Merge-Commit den Remote-Branch als zweiten statt als ersten Parent referenziert.<\/p>\n<p>Das Problem wollen wir mal auf einem Raspberry PI 2 W Zero mit Kali (jedes andere Betriebssystem geht auch \ud83d\ude09 nachstellen und zum Schluss eine L\u00f6sung zum verhindern aufzeigen. Wir machen grob das:<!--more--><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/git-foxtrot.jpg\" alt=\"\" width=\"858\" height=\"999\" class=\"aligncenter size-full wp-image-22904\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/git-foxtrot.jpg 858w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/git-foxtrot-258x300.jpg 258w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/git-foxtrot-768x894.jpg 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p><strong>Das Problem<\/strong><br \/>\nBei einem Merge-Commit sind die Eltern geordnet: Der erste Parent ist HEAD (der Commit, auf dem du warst), der zweite Parent ist der Commit, den du mergst. <\/p>\n<p>Ein Foxtrot Merge macht \u00a0<strong>origin\/master<\/strong>\u00a0 zum zweiten Parent, wodurch die First-Parent-Historie \u2013 die Git in vielen Befehlen wie \u00a0git log &#8211;first-parent\u00a0 verwendet \u2013 verf\u00e4lscht wird. Dies erschwert die Nachvollziehbarkeit der Haupt-Entwicklungslinie erheblich. <\/p>\n<p>Hier eine Schritt f\u00fcr Schritt Anleitung, oder auch <a href=\"https:\/\/gitlab.com\/IT-Berater\/twmathe\/-\/blob\/7337b7d98d693ebdc4e2daf36a4cd9d9e58fad79\/scripte\/git-foxtrot-merge\/simulation-git-foxtrot-merge.sh\" target=\"_blank\">hier ein Script auf GitLab<\/a>, welches alles automatisch erstellt.<\/p>\n<p><strong>1. Neues Repository initialisieren<\/strong><\/p>\n<p>Ein neues leeres Repository wird angelegt und initialisiert.<br \/>\n&#8222;`<br \/>\nmkdir foxtrot-demo<br \/>\ncd foxtrot-demo<br \/>\ngit init<br \/>\n&#8222;`<\/p>\n<p><strong>2. Erster Commit<\/strong><\/p>\n<p>Eine erste Datei wird angelegt und commitet.<br \/>\n&#8222;`<br \/>\necho &#8222;1. Initial content&#8220; > file.txt<br \/>\ngit add file.txt<br \/>\n# Optional, wenn noch nicht gemacht<br \/>\n# git config &#8211;global user.email &#8222;you@example.com&#8220;<br \/>\n# git config &#8211;global user.name &#8222;Your Name&#8220;<\/p>\n<p>git commit -m &#8222;1. Initial commit&#8220;<br \/>\ngit log &#8211;oneline &#8211;graph &#8211;all &#8211;decorate<br \/>\n&#8222;`<br \/>\nGraph:<br \/>\n&#8222;`<br \/>\n# * 144b377 (HEAD -> master) 1. Initial commit<br \/>\n&#8222;`<br \/>\nDer `master`-Branch zeigt auf den ersten Commit.<\/p>\n<p><strong>3. Remote anlegen und verbinden<\/strong><\/p>\n<p>Das lokale Repository wird als Bare Repository geklont und als Remote eingerichtet.<br \/>\n&#8222;`<br \/>\ncd ..<br \/>\ngit clone &#8211;bare foxtrot-demo foxtrot-remote.git<br \/>\ncd foxtrot-demo<br \/>\ngit remote add origin ..\/foxtrot-remote.git<br \/>\ngit remote -v<br \/>\n# Ergebnis:<br \/>\n# origin\t..\/foxtrot-remote.git\/ (fetch)<br \/>\n# origin\t..\/foxtrot-remote.git\/ (push)<\/p>\n<p>git push -u origin master<br \/>\ngit log &#8211;oneline &#8211;graph &#8211;all &#8211;decorate<br \/>\n&#8222;`<br \/>\nKeine Ver\u00e4nderung im Graph \u2014 er ist nur gespiegelt.<\/p>\n<p>Graph:<br \/>\n&#8222;`<br \/>\n* 144b377 (HEAD -> master, origin\/master) 1. Initial commit<br \/>\n&#8222;`<\/p>\n<p><strong>4. Parallelen Klon als zweites Repository erstellen<\/strong><br \/>\n&#8222;`<br \/>\ncd ..<br \/>\ngit clone foxtrot-remote.git foxtrot-other<br \/>\ncd foxtrot-other<br \/>\ngit log &#8211;oneline &#8211;graph &#8211;all &#8211;decorate<br \/>\n&#8222;`<br \/>\nGraph: identisch mit dem ersten Repository.<\/p>\n<p>&#8222;`<br \/>\n# * 144b377 (HEAD -> master, origin\/master, origin\/HEAD) 1. Initial commit<\/p>\n<p>&#8222;`<\/p>\n<p><strong>5. \u00c4nderung im Remote-Klon durchf\u00fchren<\/strong><\/p>\n<p>Eine neue Zeile wird hinzugef\u00fcgt, commitet und ins Remote gepusht.<br \/>\n&#8222;`<br \/>\necho &#8222;2. Remote change&#8220; >> file.txt<br \/>\ngit add file.txt<br \/>\ngit commit -m &#8222;2. Remote commit&#8220;<br \/>\ngit push origin master<br \/>\ngit log &#8211;oneline &#8211;graph &#8211;all &#8211;decorate<br \/>\n&#8222;`<br \/>\nGraph:<br \/>\n&#8222;`<br \/>\n* 59cdc2d (HEAD -> master, origin\/master, origin\/HEAD) 2. Remote commit<br \/>\n* 144b377 1. Initial commit<br \/>\n&#8222;`<br \/>\nJetzt enth\u00e4lt das Remote einen zus\u00e4tzlichen Commit.<\/p>\n<p><strong>6. \u00c4nderung im ersten Repository lokal durchf\u00fchren<\/strong><\/p>\n<p>Zur\u00fcck im Haupt-Repository entsteht ein lokaler Commit ohne vorheriges Pull.<br \/>\n&#8222;`<br \/>\ncd ..\/foxtrot-demo<br \/>\necho &#8222;3. Local change&#8220; >> file.txt<br \/>\ngit add file.txt<br \/>\ngit commit -m &#8222;3. Local commit&#8220;<br \/>\ngit log &#8211;oneline &#8211;graph &#8211;all &#8211;decorate<br \/>\n&#8222;`<br \/>\nGraph:<br \/>\n&#8222;`<br \/>\n* 5f8b0f4 (HEAD -> master) 3. Local commit<br \/>\n* 144b377 (origin\/master) 1. Initial commit<br \/>\n&#8222;`<br \/>\nDas lokale Repository wei\u00df noch nichts vom Remote-Commit. Die beiden Verl\u00e4ufe haben sich getrennt.<\/p>\n<p><strong>7. Foxtrot-Merge erzeugen durch Pull<\/strong><\/p>\n<p>Ein normales `git pull` wird ausgef\u00fchrt.<br \/>\n&#8222;`<br \/>\ngit pull origin master<br \/>\n# Es wird diese ausf\u00fchrliche Meldung ausgegeben:<br \/>\nremote: Enumerating objects: 5, done.<br \/>\nremote: Counting objects: 100% (5\/5), done.<br \/>\nremote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)<br \/>\nUnpacking objects: 100% (3\/3), 264 bytes | 52.00 KiB\/s, done.<br \/>\nFrom ..\/foxtrot-remote<br \/>\n * branch            master     -> FETCH_HEAD<br \/>\n   144b377..59cdc2d  master     -> origin\/master<br \/>\nhint: You have divergent branches and need to specify how to reconcile them.<br \/>\nhint: You can do so by running one of the following commands sometime before<br \/>\nhint: your next pull:<br \/>\nhint:<br \/>\nhint:   git config pull.rebase false  # merge<br \/>\nhint:   git config pull.rebase true   # rebase<br \/>\nhint:   git config pull.ff only       # fast-forward only<br \/>\nhint:<br \/>\nhint: You can replace &#8222;git config&#8220; with &#8222;git config &#8211;global&#8220; to set a default<br \/>\nhint: preference for all repositories. You can also pass &#8211;rebase, &#8211;no-rebase,<br \/>\nhint: or &#8211;ff-only on the command line to override the configured default per<br \/>\nhint: invocation.<br \/>\nfatal: Need to specify how to reconcile divergent branches.<\/p>\n<p># wir erzwingen nun nur einmalig, f\u00fcr die Erzeugung des Foxtrot merge, man k\u00f6nnte es auch wie oben beschrieben mit<br \/>\n# git config pull.rebase false<br \/>\n# dauerhaft f\u00fcr das Repo einstellen oder auch Global mit<br \/>\n# git config &#8211;global pull.rebase false<\/p>\n<p># also nur einmalig mit<br \/>\ngit pull &#8211;no-rebase origin master<\/p>\n<p># Merge conflikt aufl\u00f6sen<br \/>\ngit add file.txt<br \/>\ngit commit -m &#8222;\u00e4nderungen wegen merge conflict&#8220;<\/p>\n<p>git log &#8211;oneline &#8211;graph &#8211;all &#8211;decorate<br \/>\n&#8222;`<\/p>\n<p>Graph:<br \/>\n&#8222;`<br \/>\n*   7469ab1 (HEAD -> master) \u00e4nderungen wegen merge conflict<br \/>\n|\\<br \/>\n| * 59cdc2d (origin\/master) 2. Remote commit<br \/>\n* | 5f8b0f4 3. Local commit<br \/>\n|\/<br \/>\n* 144b377 1. Initial commit<br \/>\n&#8222;`<br \/>\n<strong><br \/>\nHier entsteht der eigentliche Foxtrot-Merge.<\/strong><\/p>\n<p>\t-Commit-ID 7469ab1 ist der Merge-Commit, der durch das Zusammenf\u00fchren des lokalen und des Remote-Zweigs entstanden ist.<\/p>\n<p>\t-Commit-ID 5f8b0f4 ist der lokale Commit auf deinem Branch vor dem Merge.<\/p>\n<p>\t-Commit-ID 59cdc2d ist der Remote-Commit, der parallel entstanden ist und im Remote-Repository liegt.<\/p>\n<p>\t-Commit-ID 144b377 ist der urspr\u00fcngliche Initial-Commit, von dem sowohl die lokalen als auch die Remote-\u00c4nderungen ausgegangen sind.<\/p>\n<p>Der Merge-Commit \u00a0<strong>7469ab1<\/strong>\u00a0 hat zuerst den lokalen Commit <strong>5f8b0f4<\/strong> als Parent und zweiten den Remote-Commit <strong>59cdc2d<\/strong>. <\/p>\n<p>Dadurch wird die Hauptlinie der Historie (first parent) in die falsche Richtung gef\u00fchrt: Die <strong>erste Elternlinie<\/strong> folgt dem lokalen Commit, <strong>nicht<\/strong> dem Remote-Commit. <\/p>\n<p>Der Remote-Commit h\u00e4ngt nur noch seitlich am Verlauf und wird in der First-Parent-Historie nicht als direkter Fortschritt des Branches betrachtet. <\/p>\n<p><strong>Dieses Muster ist charakteristisch f\u00fcr einen Foxtrot-Merge.<\/strong><\/p>\n<p>Infolgedessen f\u00fchrt eine Historienbetrachtung, die nur der ersten Elternlinie folgt (z. B. mit \u00a0git log &#8211;first-parent\u00a0), dazu, dass wichtige Remote-Commits im Verlauf <strong>verschwinden<\/strong> und die <strong>Nachvollziehbarkeit der Entwicklung erschwert wird<\/strong>.<\/p>\n<p>Oder auch mit:<br \/>\n&#8222;`<br \/>\ngit log &#8211;all &#8211;date-order &#8211;pretty=&#8220;%h|%p|%d&#8220;<br \/>\n7469ab1|5f8b0f4 59cdc2d| (HEAD -> master)<br \/>\n5f8b0f4|144b377|<br \/>\n59cdc2d|144b377| (origin\/master)<br \/>\n144b377||<br \/>\n&#8222;`<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/wenzlaff.de-2025-10-16-um-19.05.19.png\" alt=\"\" width=\"612\" height=\"222\" class=\"aligncenter size-full wp-image-22894\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/wenzlaff.de-2025-10-16-um-19.05.19.png 612w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2025\/10\/wenzlaff.de-2025-10-16-um-19.05.19-300x109.png 300w\" sizes=\"auto, (max-width: 612px) 100vw, 612px\" \/><\/p>\n<p>Ein:<br \/>\n&#8222;`<br \/>\ngit log &#8211;first-parent<br \/>\n# liefert<br \/>\ncommit 7469ab165b778faff283e480a5980dab821b08ef (HEAD -> master)<br \/>\nMerge: 5f8b0f4 59cdc2d<br \/>\nAuthor: Thomas Wenzlaff <kleinhirn><br \/>\nDate:   Thu Oct 16 18:56:30 2025 +0200<\/p>\n<p>    \u00e4nderungen wegen merge conflict<\/p>\n<p>commit 5f8b0f431bda9ed15bcd4feb9df48a0cf9c0182f<br \/>\nAuthor: Thomas Wenzlaff <kleinhirn><br \/>\nDate:   Thu Oct 16 18:43:12 2025 +0200<\/p>\n<p>    3. Local commit<\/p>\n<p>commit 144b37719658c67291ad14552c51f9767dcf6f72<br \/>\nAuthor: Thomas Wenzlaff <kleinhirne><br \/>\nDate:   Thu Oct 16 18:29:51 2025 +0200<\/p>\n<p>    1. Initial commit<br \/>\n&#8222;`<\/p>\n<p><strong>8. Merge ins Remote \u00fcbertragen<\/strong><\/p>\n<p>Damit wird der fehlerhafte Merge dauerhaft im Remote verankert.  <\/p>\n<p>&#8222;`<br \/>\ngit push origin master<br \/>\ngit log &#8211;oneline &#8211;graph &#8211;all &#8211;decorate<br \/>\n&#8222;`<br \/>\nGraph:<br \/>\n&#8222;`<br \/>\n*   7469ab1 (HEAD -> master, origin\/master) \u00e4nderungen wegen merge conflict<br \/>\n|\\<br \/>\n| * 59cdc2d 2. Remote commit<br \/>\n* | 5f8b0f4 3. Local commit<br \/>\n|\/<br \/>\n* 144b377 1. Initial commit<br \/>\n&#8222;`<\/p>\n<p>Jetzt befindet sich der Foxtrot-Merge auch auf dem Remote. <\/p>\n<p>Die Commitreihenfolge ist invertiert \u2013 <strong>origin\/master<\/strong> verliert seine klare First-Parent-Linie.<\/p>\n<p><strong>9. Kontrolle und Bewertung <\/strong><\/p>\n<p>Der Graph zeigt nun deutlich die Verzweigung mit <strong>verkehrter<\/strong> Merge-Reihenfolge.  <\/p>\n<p>Wenn man den Verlauf mit `&#8211;first-parent` betrachtet, ist der Remote-Commit 59cdc2d nicht mehr sichtbar.<br \/>\n&#8222;`<br \/>\ngit log &#8211;first-parent<br \/>\ncommit 7469ab165b778faff283e480a5980dab821b08ef (HEAD -> master, origin\/master)<br \/>\nMerge: 5f8b0f4 59cdc2d<br \/>\nAuthor: Thomas Wenzlaff <kleinhirn><br \/>\nDate:   Thu Oct 16 18:56:30 2025 +0200<\/p>\n<p>    \u00e4nderungen wegen merge conflict<\/p>\n<p>commit 5f8b0f431bda9ed15bcd4feb9df48a0cf9c0182f<br \/>\nAuthor: Thomas Wenzlaff <kleinhirn><br \/>\nDate:   Thu Oct 16 18:43:12 2025 +0200<\/p>\n<p>    3. Local commit<\/p>\n<p>commit 144b37719658c67291ad14552c51f9767dcf6f72<br \/>\nAuthor: Thomas Wenzlaff <kleinhirn><br \/>\nDate:   Thu Oct 16 18:29:51 2025 +0200<\/p>\n<p>    1. Initial commit<br \/>\n&#8222;`<br \/>\nDadurch wird die Analyse von Release-Historien oder automatischen Deployments schwierig.  <\/p>\n<p>Mit dieser visualisierten Schrittfolge ist nachvollziehbar, wie ein <strong>Foxtrot-Merge<\/strong> entsteht \u2013<br \/>\ndurch gleichzeitige lokale Commits und nachfolgendes einfaches `git pull`, das automatisch einen Merge in falscher Elternreihenfolge erzeugt.<br \/>\n<strong><br \/>\nWas kann man aber nun tun? Wie kann man Foxrot-Merge verhindern?<\/strong><\/p>\n<p>Die zuverl\u00e4ssigste Methode ist ein Pre-Receive-Hook auf dem Git-Server, der Foxtrot-Merges beim Push automatisch blockiert.<br \/>\nGitLab z.B. hat ein offenes Feature-Request f\u00fcr native Foxtrot-Merge-Pr\u00e4vention.<\/p>\n<p>Um Foxtrot-Merges in Teams zu vermeiden, ben\u00f6tigst du klare Richtlinien, die technische Ma\u00dfnahmen mit organisatorischen Best Practices kombinieren.<\/p>\n<p>Rebase-Workflow etablieren, als Team-Richtlinie: <strong>Immer rebase verwenden<\/strong>, wie auch oben von git ausgegeben wird.<\/p>\n<p>git config &#8211;global pull.rebase true<\/p>\n<p># Oder pro Repository<\/p>\n<p>git config pull.rebase true<\/p>\n<p>Dies erzwingt automatisch \u00a0<strong>git pull &#8211;rebase\u00a0<\/strong> statt dem gef\u00e4hrlichen \u00a0<strong>git pull<\/strong>.<\/p>\n<p>Oder<br \/>\n# Im Repository konfigurieren<\/p>\n<p>git config merge.ff only<\/p>\n<p>Dies erlaubt nur Fast-Forward-Merges, wodurch Foxtrot-Merges unm\u00f6glich werden.<\/p>\n<p><strong>Best Practices:<\/strong><\/p>\n<p>&#8211; <strong>Niemals<\/strong> \u00a0git pull\u00a0 ohne \u00a0<strong>&#8211;rebase<\/strong>\u00a0 auf Hauptbranches verwenden<\/p>\n<p>&#8211; <strong>Niemals<\/strong> \u00a0git merge master\u00a0 in lokale Branches ausf\u00fchren, wenn diese auf \u00a0master\u00a0 gemerged werden sollen<\/p>\n<p>&#8211; <strong>Regelm\u00e4\u00dfig<\/strong> \u00a0<strong>git fetch<\/strong>\u00a0 gefolgt von \u00a0<strong>git rebase origin\/master<\/strong>\u00a0 verwenden<\/p>\n<p>&#8211; Pull-Request-Workflow konsequent einhalten<\/p>\n<p><strong>Grundlegende Team-Regeln<\/strong><\/p>\n<p>Niemals direkt auf Master\/Main arbeiten:\u2028 Entwickler sollten ausschlie\u00dflich auf Feature-Branches arbeiten und nie direkt Commits auf \u00a0master\u00a0 oder \u00a0main\u00a0 erstellen. Dies verhindert die Hauptursache von Foxtrot-Merges \u2013 lokale \u00c4nderungen auf dem Hauptbranch gefolgt von einem \u00a0git pull\u00a0.<\/p>\n<p>Pull-Request-Workflow durchsetzen: \u2028Alle \u00c4nderungen m\u00fcssen \u00fcber Pull Requests in den Hauptbranch gelangen. Konfiguriere Branch-Protection-Rules, die direkte Pushes auf \u00a0master\u00a0 blockieren und Code-Reviews erzwingen.<\/p>\n<p>Rebase statt Merge f\u00fcr Feature-Branch-Updates:\u2028 Wenn Feature-Branches mit dem aktuellen \u00a0master\u00a0 synchronisiert werden m\u00fcssen, <em>verwende ausschlie\u00dflich<\/em> \u00a0<strong>git rebase<\/strong>\u00a0, nicht \u00a0git merge\u00a0:<br \/>\n<strong><br \/>\ngit fetch origin<br \/>\ngit rebase origin\/master<\/strong><\/p>\n<p>Diese Regel h\u00e4lt die Historie linear und verhindert unn\u00f6tige Merge-Commits.<\/p>\n<p><a href=\"https:\/\/gitlab.com\/IT-Berater\/twmathe\/-\/blob\/7337b7d98d693ebdc4e2daf36a4cd9d9e58fad79\/scripte\/git-foxtrot-merge\/simulation-git-foxtrot-merge.sh\" target=\"_blank\">Hier im Repo<\/a> das Script, das alle Schritte automatisch ausf\u00fchrt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der Foxtrott-Merge ist wie Tanzen mit Git \u2013 nur dass hier nicht die F\u00fc\u00dfe stolpern, sondern die Commits. Beide starten synchron, drehen sich elegant umeinander, bis einer pl\u00f6tzlich im falschen Takt mitschreibt. W\u00e4hrend T\u00e4nzer das charmant \u00fcberspielen, verursacht es in Git eine chaotische Merge-Historie. Der Foxtrott bringt Schwung ins Parkett, der Foxtrott-Merge dagegen Unordnung ins &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=22891\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eVermeide git Foxtrot-Merge &#8211; Schritt f\u00fcr Schritt Anleitung mit L\u00f6sung\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,4176,2172,1023],"tags":[2184,6214,6240,6237,325,6238,6239,6241],"class_list":["post-22891","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-git","category-kali-linux-2","category-raspberry-pi","tag-anleitung","tag-best-practice","tag-foxtrot","tag-foxtrot-merge","tag-git","tag-merge","tag-pull","tag-tanzen-loesung"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22891","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=22891"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22891\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22891"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22891"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}