{"id":63183,"date":"2023-06-26T17:34:09","date_gmt":"2023-06-26T16:34:09","guid":{"rendered":"https:\/\/kinsta.com\/de\/?p=63183&#038;preview=true&#038;preview_id=63183"},"modified":"2023-07-27T10:27:48","modified_gmt":"2023-07-27T09:27:48","slug":"git-fortgeschritten","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/","title":{"rendered":"Git f\u00fcr Fortgeschrittene: Leistungsstarke Befehle jenseits der Grundlagen"},"content":{"rendered":"<p><a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git<\/a> ist ein leistungsf\u00e4higes Werkzeug f\u00fcr die Versionskontrolle und hat in diesem Bereich eine Art Monopolstellung. F\u00fcr die meisten allt\u00e4glichen Aufgaben ist Git dank seiner Befehlswiederholungen einfach zu verwenden. Es gibt jedoch viele Situationen, in denen du mehr als nur die Grundlagen brauchst. Deshalb gibt es viele fortgeschrittene Git-Befehle, mit denen du deine Git-Kenntnisse auf die n\u00e4chste Stufe heben kannst.<\/p>\n<p>Dabei lernst du auch verschiedene Git-Konzepte kennen, mit denen du normalerweise nicht konfrontiert wirst. Zum Beispiel das Stashing im Gegensatz zum Commit von \u00c4nderungen, das Rebasing und das Hinzuf\u00fcgen von Dateien zu deinem Staging-Bereich. Wenn du sie einmal gelernt hast, wirst du vielleicht feststellen, dass du f\u00fcr dein Team von noch gr\u00f6\u00dferem Wert bist.<\/p>\n<p>In diesem Blogbeitrag werden verschiedene Power-Befehle vorgestellt, die du kennen solltest. Um sie zu nutzen, musst du jedoch einige F\u00e4higkeiten, Konzepte und Informationen zur Hand haben. Schauen wir uns das zuerst an.<br \/>\n<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>Empfohlene Voraussetzungen<\/h2>\n<p>Auch wenn du die <a href=\"https:\/\/kinsta.com\/de\/blog\/git-fuer-die-webentwicklung\/\" rel=\"noopener\">Grundlagen von Git<\/a> beherrschst und einige der Zwischenbefehle wie <code>git delete<\/code> verstehst, brauchst du mehr in deinem Werkzeugkasten, um mit fortgeschrittenen Befehlen umgehen zu k\u00f6nnen.<\/p>\n<p>Die Tipps, die wir hier geben, eignen sich nicht f\u00fcr Git-Anf\u00e4nger. Wenn <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-versionskontrolle\/\" rel=\"noopener\">Versionskontrolle<\/a> im Allgemeinen neu f\u00fcr dich ist, empfehlen wir dir, einige Zeit damit zu verbringen, die grundlegenden Befehle t\u00e4glich zu benutzen, bevor du dein Repertoire erweiterst.<\/p>\n<p>Hier ist eine kurze Liste von Aspekten, die du verstehen musst:<\/p>\n<ul>\n<li>Grundlegende Git-Konzepte wie Commits, Branches, Pull Requests und mehr.<\/li>\n<li>Vertrautheit mit den grundlegenden Git-Befehlen wie <code>git add<\/code>, <code>git merge<\/code>, <code>git commit<\/code> und <code>git push<\/code>.<\/li>\n<li>F\u00fcr fortgeschrittene Git-Aufgaben musst du in der Lage sein, in <a href=\"https:\/\/kinsta.com\/de\/blog\/linux-befehle\/\" rel=\"noopener\">einem Terminal zu navigieren<\/a>.<\/li>\n<\/ul>\n<p>Es ist hilfreich, Erfahrung mit Git in einer Teamumgebung zu haben, da viele dieser Befehle einen gro\u00dfen Einfluss auf eine gemeinsame Codebasis haben k\u00f6nnen. Es k\u00f6nnte zum Beispiel sein, dass du einige dieser Befehle nur in einer verantwortlichen Position verwendest. Das bedeutet, dass du vorsichtig sein musst und wissen musst, <em>wann<\/em> du diese Befehle verwendest.<\/p>\n<h2>Git f\u00fcr Fortgeschrittene: 12 wichtige Befehle, die du kennen solltest<\/h2>\n<p>Der Rest dieses Artikels befasst sich mit 12 verschiedenen fortgeschrittenen Git-Befehlen, die \u00fcber die Grundlagen hinausgehen und dich in einen Git-Assistenten verwandeln werden. Beginnen wir mit einem Befehl, den du vielleicht h\u00e4ufiger verwendest als andere.<\/p>\n<h3>1. Rebasing<\/h3>\n<p>Rebasing ist ein m\u00e4chtiger Git-Befehl, der eine Alternative zu einer Pull-Anfrage ist. Mit ihm kannst du alle neuen Commits, die du nach einer Zweig-Divergenz machst, in einen neuen Branch ziehen und die \u00c4nderungen an der Spitze der Basis einf\u00fcgen. Das ist n\u00fctzlich, wenn du aus irgendeinem Grund \u00c4nderungen aus einem anderen Zweig \u00fcbernehmen willst, ohne einen Merge Commit zu erstellen.<\/p>\n<p>Ein h\u00e4ufiger Anwendungsfall f\u00fcr das Rebasing ist, wenn du an einem Feature-Zweig arbeitest und \u00c4nderungen aus dem Hauptzweig \u00fcbernehmen willst, ohne einen Merge Commit zu erstellen. Das hilft dabei, die Historie deines Projekts sauber zu halten, obwohl es l\u00e4nger dauern kann und du beim Zusammenf\u00fchren mehr Fehler siehst.<\/p>\n<p>Um einen Zweig neu zu verankern, verwendest du den Befehl <code>git rebase<\/code>. Hier ein Beispiel, bei dem wir einen Zweig auf einen anderen umbinden:<\/p>\n<pre><code class=\"language-bash\">git checkout foo-branch\n\ngit rebase main\n<\/code><\/pre>\n<p>Du kannst auch die Commits auflisten, die du ver\u00f6ffentlichen willst, und sie vorher bearbeiten. So kannst du Commits zusammenfassen, Commit-Nachrichten bearbeiten und vieles mehr. Du kannst das <code>--interactive<\/code> oder <code>--i<\/code> Flag verwenden, um einen &#8222;interaktiven Rebase&#8220; durchzuf\u00fchren<\/p>\n<pre><code class=\"language-bash\">git rebase --interactive &lt;other-branch-name&gt;<\/code><\/pre>\n<p>Apropos, das Zusammenfassen von Commits zu einem einzigen, um die Commit-Historie aufzur\u00e4umen, ist ein h\u00e4ufiger Anwendungsfall f\u00fcr Rebase. Dadurch wird dein Commit-Verlauf leichter zu lesen und zu verstehen.<\/p>\n<p>Bei einem Rebase folgst du dem Flag mit der Anzahl der Commits, die du zusammenf\u00fchren m\u00f6chtest, um die Commits zu einem einzigen zu kombinieren:<\/p>\n<pre><code class=\"language-bash\">git rebase -i HEAD~3\n<\/code><\/pre>\n<p>Daraufhin \u00f6ffnet sich ein interaktives Rebase-Fenster, \u00e4hnlich wie ein Commit-Fenster, in dem du die Commits, die du entfernen m\u00f6chtest, ausw\u00e4hlen und bearbeiten kannst:<\/p>\n<figure id=\"attachment_155613\" aria-describedby=\"caption-attachment-155613\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155613 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-rebase-terminal.png\" alt=\"Ein Teil des Terminalfensters zeigt die Ausgabe eines git rebase-Befehls. Der Bildschirm zeigt drei Commits, daneben Hash-IDs und den Befehl \"pick\". Darunter befindet sich eine Liste von Befehlen, die beim Erstellen eines benutzerdefinierten Rebase helfen.\" width=\"1000\" height=\"606\"><figcaption id=\"caption-attachment-155613\" class=\"wp-caption-text\">Ausf\u00fchren eines git rebase im Terminal<\/figcaption><\/figure>\n<p>Oben auf dem Bildschirm siehst du eine Liste der Commits und unten eine Auswahl an Befehlen sowie einige andere wichtige Informationen. Die Standardoption ist <code>pick<\/code>, mit der du einen Commit als denjenigen ausw\u00e4hlst, den du ohne \u00c4nderungen verwenden willst.<\/p>\n<p>Es gibt aber <a href=\"https:\/\/git-scm.com\/docs\/git-rebase\" target=\"_blank\" rel=\"noopener noreferrer\">noch viele andere Befehle<\/a>, die dir beim Rebase helfen. Du kannst zum Beispiel einen Commit neu formulieren oder mehrere Commits zusammenfassen. Um \u00c4nderungen vorzunehmen und die Befehle zu verwenden, wirst du mit dem Editor deines Terminals arbeiten. Die Standardeinstellung ist oft Vim, was bedeutet, dass du <a href=\"https:\/\/linuxhandbook.com\/basic-vim-commands\/\" target=\"_blank\" rel=\"noopener noreferrer\">diesen Editor kennen musst<\/a>.<\/p>\n<p>Der letzte Schritt besteht darin, deine \u00c4nderungen zu speichern und sie dann in den remoten Zweig zu \u00fcbertragen.<\/p>\n<h3>2. R\u00fcckg\u00e4ngig machen, Zur\u00fccksetzen und Unstaging<\/h3>\n<p>Git ist ber\u00fcchtigt, wenn es darum geht, \u00c4nderungen r\u00fcckg\u00e4ngig zu machen. Es ist generell ein schwieriger Prozess, der oft zu Fehlern f\u00fchrt. Wenn du jedoch \u00c4nderungen in deinem Arbeitsverzeichnis oder Staging-Bereich vorgenommen hast, die du r\u00fcckg\u00e4ngig machen m\u00f6chtest, gibt es einige Git-Befehle, die dir dabei helfen k\u00f6nnen.<\/p>\n<p>Git gibt dir sogar eine Anleitung, wie du eine Datei r\u00fcckg\u00e4ngig machen kannst, wenn du ein <code>git status<\/code> ausf\u00fchrst:<\/p>\n<figure id=\"attachment_155614\" aria-describedby=\"caption-attachment-155614\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155614 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-status-guidance.png\" alt=\"Ein Terminalfenster, in dem der Benutzer einen Git-Status-Befehl ausf\u00fchrt. Die Ausgabe zeigt den aktuellen Zweig und die \u00c4nderungen, die \u00fcbertragen werden sollen. Au\u00dferdem gibt es Anweisungen, um eine Datei zu entstagen.\" width=\"1000\" height=\"435\"><figcaption id=\"caption-attachment-155614\" class=\"wp-caption-text\">Git zeigt dir bei der Statusausgabe, wie du eine Datei zur\u00fccksetzen kannst<\/figcaption><\/figure>\n<p>So kannst du eine \u00dcbergabe aus dem aktuellen Zweig entfernen und sie problemlos an einen anderen Zweig senden:<\/p>\n<pre><code class=\"language-bash\">git reset HEAD &lt;commit&gt;\n<\/code><\/pre>\n<p>Das hat den Effekt, dass du deinen Zweig um einen Commit zur\u00fccksetzt, so als ob du den letzten bekannten Commit entfernst. Es kann sogar vorkommen, dass du einen Zweig auf seinen urspr\u00fcnglichen Zustand zur\u00fccksetzen m\u00f6chtest. In diesem Fall kannst du ihn gegen den Remote-Ursprung zur\u00fccksetzen &#8211; zum Beispiel mit <code>git reset --hard origin\/main<\/code>. Beachte jedoch, dass diese \u00c4nderungen dann f\u00fcr immer verschwunden sind.<\/p>\n<p>Den Befehl <code>git checkout<\/code> wirst du zwar h\u00e4ufig verwenden und er gilt als grundlegend, du kannst ihn aber auch verwenden, um Dateien vor einem Commit freizugeben:<\/p>\n<pre><code class=\"language-bash\">git checkout -- &lt;filename&gt;\n<\/code><\/pre>\n<p>Beachte das Leerzeichen zwischen den Bindestrichen und dem Platzhalter f\u00fcr den Dateinamen. In diesem Fall hebt der Befehl den Zustand der angegebenen Datei auf und verwirft die \u00c4nderungen aus dem Arbeitsverzeichnis. Beachte, dass dadurch alle lokalen \u00c4nderungen, die du an einer Datei vorgenommen hast, gel\u00f6scht werden. Vergewissere dich also doppelt und dreifach, dass du die ungespeicherten \u00c4nderungen nicht brauchst.<\/p>\n<p>Du kannst auch <code>git revert<\/code> verwenden, um \u00c4nderungen an einer \u00dcbertragung vorzunehmen. Dabei werden die \u00c4nderungen jedoch nicht r\u00fcckg\u00e4ngig gemacht, sondern es wird eine neue \u00dcbertragung erstellt, indem die \u00c4nderungen der vorherigen \u00dcbertragung r\u00fcckg\u00e4ngig gemacht werden.<\/p>\n<p>Der Hauptunterschied besteht darin, dass der Befehl keine Referenzzeiger auf den neuen Commit verschiebt, sondern alte Commits beibeh\u00e4lt. Das ist n\u00fctzlich, wenn du \u00c4nderungen r\u00fcckg\u00e4ngig machen willst, ohne sie aus deinem Commit-Verlauf zu l\u00f6schen.<\/p>\n<p>Der Befehl erwartet eine Referenz, und es ist ganz einfach, den letzten Commit r\u00fcckg\u00e4ngig zu machen:<\/p>\n<pre><code class=\"language-bash\">git revert HEAD\n<\/code><\/pre>\n<p>Du hast jedoch viel mehr M\u00f6glichkeiten, Dateien und Commits wiederherzustellen und zu \u00e4ndern. Die n\u00e4chsten beiden Eintr\u00e4ge auf dieser Liste der fortgeschrittenen Git-Befehle befassen sich damit.<\/p>\n<h3>3. Dateien im Standardzustand wiederherstellen<\/h3>\n<p>Mit Git kannst du eine Datei ganz einfach in ihren Standardzustand zur\u00fcckversetzen, indem du einen relativ neuen Befehl verwendest: <code>git restore<\/code>. In den meisten F\u00e4llen solltest du diesen Befehl als Ersatz f\u00fcr <code>git reset<\/code> betrachten, da er viel mehr M\u00f6glichkeiten bietet. Mit <code>git restore --staged &lt;filename&gt;<\/code> kannst du zum Beispiel das gleiche Ergebnis erzielen wie mit <code>git reset HEAD<\/code>.<\/p>\n<p>Der Befehl kann aber noch mehr &#8211; du kannst auch Dateien in den Standardzustand zur\u00fcckversetzen. Wie das geht, siehst du, wenn du auch <code>git status <\/code>ausf\u00fchrst:<\/p>\n<pre><code class=\"language-bash\">git restore &lt;filename&gt;\n<\/code><\/pre>\n<p>Damit werden die \u00c4nderungen aus dem Arbeitsverzeichnis entfernt, als ob nichts passiert w\u00e4re. Wie bei <code>git checkout -- &lt;filename&gt;<\/code> solltest du sicherstellen, dass du keine der lokalen \u00c4nderungen m\u00f6chtest, da sie f\u00fcr immer verloren sind.<\/p>\n<h3>4. \u00c4ndern von Commits<\/h3>\n<p>Es wird wahrscheinlich oft vorkommen, dass du einen Commit machst und dann merkst, dass du etwas Wichtiges vergessen hast. Mit Git kannst du den Commit ganz einfach \u00e4ndern und die fehlenden \u00c4nderungen einf\u00fcgen.<\/p>\n<p>Daf\u00fcr gibt es einen bestimmten Prozess:<\/p>\n<ul>\n<li>Zuerst nimmst du die \u00c4nderungen in den Dateien vor, die du f\u00fcr das Projekt brauchst.<\/li>\n<li>Stelle sie wie \u00fcblich mit <code>git add<\/code> bereit.<\/li>\n<li>\u00dcbertrage die \u00c4nderungen im Staging-Bereich mit einem anderen Befehl, um den Commit durchzuf\u00fchren:<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">git commit --amend\n<\/code><\/pre>\n<p>Dadurch wird der urspr\u00fcngliche Commit durch den neuen Commit ersetzt, wobei dein Staging-Bereich verwendet wird. Achte also darauf, dass du die alte Version des Commits nicht mehr brauchst, da sie verloren geht. Wir empfehlen dir au\u00dferdem, das <code>--amend<\/code> Flag f\u00fcr lokale Commits zu verwenden und nicht f\u00fcr Remote-Commits, und zwar aus \u00e4hnlichen Gr\u00fcnden, wie wir sie an anderer Stelle in diesem Beitrag beschreiben.<\/p>\n<p>Du kannst auch <code>git commit --amend<\/code> verwenden, um die Commit-Nachricht nur mit dem folgenden Befehl zu bearbeiten:<\/p>\n<pre><code class=\"language-bash\">git commit --amend -m \"New commit message\"\n<\/code><\/pre>\n<h3>5. Git Logging<\/h3>\n<p>Das Log von Git ist n\u00fctzlich, um den Verlauf eines Repositorys zu verstehen. Allerdings w\u00fcrden wir den Befehl <code>git log<\/code> nicht als fortgeschritten bezeichnen. Stattdessen kannst du <a href=\"https:\/\/git-scm.com\/docs\/git-log\" target=\"_blank\" rel=\"noopener noreferrer\">verschiedene Optionen<\/a> verwenden, um die Ausgabe nach deinen Bed\u00fcrfnissen zu filtern:<\/p>\n<pre><code class=\"language-bash\">git log\n\ngit log --decorate\n\ngit log --stat\n<\/code><\/pre>\n<p>Wenn du zum Beispiel einen Protokolleintrag dekorierst, werden die Ref-Namen f\u00fcr alle angezeigten Commits ausgegeben. Die Option <code>--stat<\/code> zeigt Einf\u00fcgungen und L\u00f6schungen f\u00fcr einen Commit an:<\/p>\n<figure id=\"attachment_155612\" aria-describedby=\"caption-attachment-155612\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155612 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-log-stat.png\" alt=\"Ein Terminalfenster, das die Ausgabe des Befehls git log --stat zeigt. Es zeigt zwei Commits mit dem goldfarbenen Hash, dem Autor, dem Datum des Commits, der Commit-Nachricht und der Anzahl der ge\u00e4nderten und eingef\u00fcgten Dateien.\" width=\"1000\" height=\"651\"><figcaption id=\"caption-attachment-155612\" class=\"wp-caption-text\">Ausf\u00fchren eines git log &#8211;stat Befehls im Terminal<\/figcaption><\/figure>\n<p>Du kannst auch andere Optionen verwenden, um die Ausgabe des Logs anzupassen &#8211; das sogenannte &#8222;Commit-Limiting&#8220; Nimm zum Beispiel die folgenden Befehle:<\/p>\n<pre><code class=\"language-bash\">git log --author=&lt;author-name&gt;\n\ngit log --grep=&lt;pattern-string&gt;\n<\/code><\/pre>\n<p>Hier kannst du das Protokoll nach bestimmten Autorennamen oder Textmustern filtern. Du kannst sogar mehrere Optionen und Flags kombinieren, um ein Protokoll f\u00fcr einen bestimmten Zweck zu erstellen. Nimm zum Beispiel diesen Befehl:<\/p>\n<pre><code class=\"language-bash\">git log --oneline --author=&lt;author-name&gt; --since=&lt;date&gt; feature-temp\n<\/code><\/pre>\n<p>Dieser Befehl sucht nach allen Commits mit dem <strong>feature-temp<\/strong> Zweig von einem bestimmten Autor seit einem bestimmten Datum und gibt sie dann in einzelnen Zeilen aus. Beachte, dass der Parameter <code>&lt;date&gt;<\/code> auch eine Zeichenkette sein kann:<\/p>\n<pre><code class=\"language-bash\">--since=\u201dTwo weeks ago\u201d\n<\/code><\/pre>\n<p>Wenn du eine bestimmte Datei anstelle eines Zweigs suchen willst, kannst du das auch tun:<\/p>\n<pre><code class=\"language-bash\">git log --oneline --author=bartonfink --since=\u201d5 days ago\u201d -- readme.rm\n<\/code><\/pre>\n<p>Diese Beispiele zeigen nur ansatzweise, was du mit deinen Logs machen kannst, aber es gibt viele M\u00f6glichkeiten, anhand deiner Suchkriterien genaue Commits darin zu finden.<\/p>\n<h3>6. Git-Hooks<\/h3>\n<p>Wahrscheinlich verwendest du manchmal Makros und andere automatisierte Skripte, um den Code auszuf\u00fchren. Git bietet diese Funktionen auch in Form von Hooks an. Diese Skripte werden als Reaktion auf bestimmte Ereignisse, wie z. B. Commits oder Pushes, automatisch ausgef\u00fchrt. Es gibt auch viele M\u00f6glichkeiten, Hooks zu verwenden, um die Formatierung von Code zu erzwingen, Tests durchzuf\u00fchren und vieles mehr.<\/p>\n<p>Es gibt zwei Arten von Hooks: client-seitig und server-seitig:<\/p>\n<ul>\n<li>Client-seitige Hooks werden durch lokale Aktionen wie Commits und Merges ausgel\u00f6st.<\/li>\n<li>Serverseitige Hooks werden aufgrund von Netzwerkoperationen ausgel\u00f6st. Das kann z. B. der Fall sein, wenn ein Projektarchiv einen Push-Commit erh\u00e4lt.<\/li>\n<\/ul>\n<p>Git f\u00fcllt dein Projektarchiv immer mit mehreren Beispiel-Hooks, wenn du <code>git init<\/code> aufrufst. Du musst jedoch die Erweiterung <strong>.sample<\/strong> entfernen, um sie nutzen zu k\u00f6nnen:<\/p>\n<figure id=\"attachment_155615\" aria-describedby=\"caption-attachment-155615\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155615 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/sample-hooks.png\" alt=\"Ein Finder-Fenster in macOS zeigt den versteckten Hooks-Ordner f\u00fcr ein Git Repo. Er enth\u00e4lt eine Reihe von Beispiel-Hook-Skriptdateien, die alle die Erweiterung .sample haben.\" width=\"1000\" height=\"713\"><figcaption id=\"caption-attachment-155615\" class=\"wp-caption-text\">Ein Ordner in macOS, der die Beispielhooks zeigt, die Git bei der Initialisierung installiert<\/figcaption><\/figure>\n<p>Beachte, dass du immer nur eine Art von Hook ausf\u00fchren kannst, obwohl es mit <a href=\"https:\/\/stackoverflow.com\/questions\/30104343\/multiple-git-hooks-for-the-same-trigger\" target=\"_blank\" rel=\"noopener noreferrer\">etwas Arbeit<\/a> m\u00f6glich ist, mehrere Skripte auf einmal zu verwenden. Daher sollten deine Dateinamen dem Typ des Hooks entsprechen, den du anhand der Beispielskripte verwenden m\u00f6chtest: <strong>pre-commit<\/strong>, <strong>update<\/strong> usw.<\/p>\n<h4>Einen Git-Hook erstellen<\/h4>\n<p>Um einen Git-Hook zu erstellen, musst du ein ausf\u00fchrbares Skript im Unterverzeichnis <strong>.git\/hooks <\/strong>ohne Erweiterung erstellen. Es wird trotzdem ausgef\u00fchrt, solange du es dem Ordner <strong>hooks<\/strong> hinzuf\u00fcgst.<\/p>\n<p>Du kannst jede beliebige Skriptsprache verwenden, solange sie als ausf\u00fchrbare Datei ausgef\u00fchrt werden kann. Wir schlagen <a href=\"https:\/\/kinsta.com\/de\/blog\/ruby-on-rails-vs-node-js\/\" rel=\"noopener\">Ruby<\/a> oder <a href=\"https:\/\/kinsta.com\/de\/blog\/python-befehle\/\" rel=\"noopener\">Python<\/a> vor, aber du kannst auch <a href=\"https:\/\/kinsta.com\/de\/blog\/skriptsprachen\/\" rel=\"noopener\">Bash, Perl und viele andere<\/a> verwenden. Du musst nur den Pfad zu deinem Interpreter \u00e4ndern, statt den Standardpfad zu Bash:<\/p>\n<pre><code class=\"language-bash\">#!\/usr\/bin\/env python\n<\/code><\/pre>\n<p>Von hier aus kannst du deinen Code wie gewohnt schreiben. Hier ist zum Beispiel ein <code>prepare-commit<\/code> Skript in Python, das den Benutzer dazu auffordert, gute Commit-Nachrichten zu schreiben:<\/p>\n<pre><code class=\"language-python\">#!\/usr\/bin\/env python\n\nimport sys, os\n\npath_commit_msg = sys.argv[1]\n\nwith open(commit_msg_filepath, 'w') as f:\n\nf.write(\"# You\u2019ll need to provide a better commit message than that, buddy!\")\n<\/code><\/pre>\n<p>Auch wenn es nicht immer notwendig ist, empfehlen wir dir, <code>chmod +x .git\/hooks\/&lt;hook-name&gt;<\/code> von der Kommandozeile aus zu starten, um sicherzustellen, dass du es ausf\u00fchren kannst.<\/p>\n<p>Insgesamt k\u00f6nnen Hooks ein m\u00e4chtiges Werkzeug sein, um sich wiederholende Aufgaben zu automatisieren und Best Practices in deinem Team durchzusetzen.<\/p>\n<h3>7. Commit-Referrals<\/h3>\n<p>In Git identifizierst du Commits anhand des SHA-1-<a href=\"https:\/\/kinsta.com\/de\/blog\/erzeugen-ssh-key\/\" rel=\"noopener\">Verschl\u00fcsselungshashs<\/a>. Es ist zwar m\u00f6glich, Commits anhand ihres vollst\u00e4ndigen Hashs zu referenzieren, aber das kann m\u00fchsam und fehleranf\u00e4llig sein:<\/p>\n<pre><code class=\"language-bash\">bc7623b7a94ed3d8feaffaf7580df3eca4f5f5ca\n<\/code><\/pre>\n<p>Stattdessen bietet Git mehrere M\u00f6glichkeiten, Commits mit k\u00fcrzeren, einpr\u00e4gsameren Namen zu bezeichnen. Du kannst zum Beispiel einen Zweig- oder Tag-Namen verwenden. Nehmen wir zum Beispiel einen Zweig namens &#8222;develop&#8220;. Hier ist ein Beispiel, in dem wir uns auf den letzten Commit in diesem Zweig beziehen:<\/p>\n<pre><code class=\"language-bash\">git diff develop..HEAD\n<\/code><\/pre>\n<p>Dies zeigt die Unterschiede zwischen dem letzten Commit (<code>HEAD<\/code>) auf dem Zweig &#8222;develop&#8220; und dem aktuellen Commit.<\/p>\n<p>Du kannst dich auch auf einen Commit durch seine relative Position in der Commit-Historie beziehen. Du kannst zum Beispiel auf zwei Commits vor dem aktuellen verweisen, indem du die Abk\u00fcrzung <code>HEAD~2<\/code> verwendest:<\/p>\n<pre><code class=\"language-bash\">git diff HEAD~2..HEAD\n<\/code><\/pre>\n<p>Git bietet noch <a href=\"https:\/\/stackoverflow.com\/questions\/26785118\/head-vs-head-vs-head-also-known-as-tilde-vs-caret-vs-at-sign\" target=\"_blank\" rel=\"noopener noreferrer\">weitere M\u00f6glichkeiten<\/a>, auf Commits zu verweisen, z. B. mit dem Symbol &#8222;@&#8220; auf den aktuellen Zweig oder mit dem Symbol &#8222;^&#8220; auf den Parent eines Commits. Durch die Verwendung dieser Abk\u00fcrzungen kannst du bei der Arbeit mit Commits Zeit sparen und Fehler vermeiden.<\/p>\n<h3>8. Verstecken<\/h3>\n<p>Unter normalen Umst\u00e4nden w\u00fcrdest du denken, dass es keine M\u00f6glichkeit gibt, \u00c4nderungen an Dateien zu speichern, ohne sie zu committen; das &#8222;Stashing&#8220; ist eine M\u00f6glichkeit, dies vor\u00fcbergehend zu tun. Es ist n\u00fctzlich, wenn du den Zweig wechseln oder an einer anderen Aufgabe arbeiten musst, deine \u00c4nderungen aber noch nicht festschreiben willst.<\/p>\n<p>Wenn du zum Beispiel mitten im Arbeitsfluss den Zweig wechseln musst, um an etwas zu arbeiten, kannst du die \u00c4nderungen im aktuellen Zweig speichern und den anderen auschecken. Von dort aus kannst du an dem anderen Zweig arbeiten und die \u00c4nderungen dann committen und pushen. Anschlie\u00dfend kannst du deine Arbeit im urspr\u00fcnglichen Zweig auschecken und wiederherstellen.<\/p>\n<p>Um \u00c4nderungen zwischenzuspeichern, gibt es zwei M\u00f6glichkeiten:<\/p>\n<pre><code class=\"language-bash\">git stash\n<\/code><\/pre>\n<p>Du speicherst deine \u00c4nderungen in einem neuen Stash und stellst dein Arbeitsverzeichnis auf den letzten <strong>HEAD<\/strong>-Commit zur\u00fcck (den Zustand, in dem du es vor den \u00c4nderungen hattest). Du kannst die \u00c4nderungen mit <code>git stash list<\/code> auflisten und den Stash mit <code>git stash show<\/code> \u00fcberpr\u00fcfen. Der letztgenannte Befehl kann auch jedes andere Format akzeptieren, das <code>git diff<\/code> akzeptiert.<\/p>\n<p>Von hier aus kannst du den Zweig wechseln oder an einer anderen Aufgabe arbeiten. Wenn du deine \u00c4nderungen abrufen willst, f\u00fchrst du den folgenden Befehl aus:<\/p>\n<pre><code class=\"language-bash\">git stash apply\n<\/code><\/pre>\n<p>Dadurch werden die zuletzt gespeicherten \u00c4nderungen auf dein Arbeitsverzeichnis angewendet. Beachte jedoch, dass du immer noch auf Konflikte sto\u00dfen kannst, wenn du die Datei zu stark \u00e4nderst. Schlie\u00dflich ist <code>git stash<\/code> nur eine vor\u00fcbergehende L\u00f6sung f\u00fcr das Problem, um das es geht.<\/p>\n<p>Du kannst auch mehrere Stashes haben und wie folgt angeben, welcher Stash angewendet werden soll:<\/p>\n<pre><code class=\"language-bash\">git stash apply stash@{n}\n<\/code><\/pre>\n<p>Der Platzhalter <code>{n}<\/code> nimmt eine ganze Zahl auf, und <code>stash@{0}<\/code> steht f\u00fcr den neuesten Stash. Die <a href=\"https:\/\/git-scm.com\/docs\/git-stash\" target=\"_blank\" rel=\"noopener noreferrer\">offizielle Git-Dokumentation<\/a> enth\u00e4lt einige weitere Beispiele f\u00fcr <code>git stash<\/code>.<\/p>\n<h3>9. Bisecting<\/h3>\n<p>Wir wetten, dass jeder schon einmal auf einen <a href=\"https:\/\/kinsta.com\/de\/blog\/code-review-tools\/\" rel=\"noopener\">Fehler oder ein Problem<\/a> gesto\u00dfen ist und nicht wusste, wo er anfangen sollte zu suchen. In solchen Situationen kann dir das &#8222;Bisecting&#8220; helfen, schnell den Commit zu finden, der das Problem verursacht hat.<\/p>\n<p>Kurz gesagt, sucht der Befehl nach Bugs durch eine Suche in deinen Commits. Sobald er den fehlerhaften Commit gefunden hat, gibt er ihn an dich zur\u00fcck. Das Besondere an diesem Befehl sind die vielen Unterbefehle, die du verwenden kannst.<\/p>\n<p>Um Bisecting zu verwenden, musst du zuerst den Befehl <code>git bisect start<\/code> ausf\u00fchren. Git f\u00fchrt dich dann zum ersten Commit in der Geschichte deines Projekts.<\/p>\n<p>Von hier aus musst du mit den entsprechenden Befehlen angeben, ob diese \u00dcbertragung gut oder schlecht ist:<\/p>\n<pre><code class=\"language-bash\">git bisect good\n\ngit bisect bad\n<\/code><\/pre>\n<p>Git leitet dich dann zum n\u00e4chsten Commit weiter, um dessen &#8222;Qualit\u00e4t&#8220; zu pr\u00fcfen Beachte, dass du &#8222;good&#8220; auch durch &#8222;old&#8220; und &#8222;bad&#8220; durch &#8222;new&#8220; ersetzen kannst, um deinem speziellen Anwendungsfall gerecht zu werden (obwohl du die Begriffe nicht mischen kannst)<\/p>\n<p>Von hier aus kannst du jeden Commit als gut oder schlecht markieren, bis du den Commit findest, der den Fehler verursacht hat. Du musst aber nicht jeden Commit durchforsten &#8211; du kannst genaue Bezeichnungen angeben, um deine Suche einzugrenzen und zu verk\u00fcrzen:<\/p>\n<pre><code class=\"language-bash\">git bisect bad feature-test\n<\/code><\/pre>\n<p>In diesem Fall wird ein Zweigname verwendet, aber es k\u00f6nnte auch eine bestimmte Revision mit einer Ganzzahl, einer Hash-Referenz und mehr sein. Sobald du den Fehler gefunden hast, kannst du einen der folgenden Befehle ausf\u00fchren, um zu deinem aktuellen Code zur\u00fcckzukehren:<\/p>\n<pre><code class=\"language-bash\">git bisect reset\n<\/code><\/pre>\n<p>Wie bei allen fortgeschrittenen Git-Befehlen auf dieser Liste gibt es noch viel mehr zu verstehen, und die <a href=\"https:\/\/git-scm.com\/docs\/git-bisect\" target=\"_blank\" rel=\"noopener noreferrer\">Git-Dokumentation<\/a> ist hier eine wichtige Lekt\u00fcre.<\/p>\n<h3>10. Verzweigungen vergleichen<\/h3>\n<p>In unserem Eintrag \u00fcber Commit-Referrals haben wir \u00fcber die Verwendung von <code>git diff<\/code> gesprochen. Jetzt ist es an der Zeit, das Ganze etwas genauer zu betrachten. Du wirst oft mehrere Zweige haben, die unterschiedliche \u00c4nderungen enthalten. Mit Git kannst du die Unterschiede zwischen zwei Zweigen mit dem Befehl <code>git diff<\/code> vergleichen. Du kannst diesen Befehl auf verschiedene Arten verwenden, oft in Verbindung mit anderen Befehlen, um ein Repo zu untersuchen und zu analysieren.<\/p>\n<p>Der grundlegende Befehl <code>git diff<\/code> gibt dir eine Ausgabe mit einer \u00dcbersicht der \u00c4nderungen. Sie sieht \u00e4hnlich aus wie die Ausgabe einer Commit-Merge-Untersuchung:<\/p>\n<figure id=\"attachment_155611\" aria-describedby=\"caption-attachment-155611\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155611 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-diff-output.png\" alt=\"Ein Teil des Terminalfensters, der eine typische Git-Diff-Ausgabe zeigt. Er zeigt die zu vergleichenden Dateien, die Indexverweise, den Schl\u00fcssel und die Legende f\u00fcr die \u00c4nderungen zwischen den Dokumenten sowie die eigentlichen \u00c4nderungen selbst.\" width=\"1000\" height=\"540\"><figcaption id=\"caption-attachment-155611\" class=\"wp-caption-text\">Die Ausgabe einer Git-Diff-Anfrage wird angezeigt<\/figcaption><\/figure>\n<p>Du kannst jedoch genaue Zweige, Hashes und vieles mehr aufschl\u00fcsseln. Um zum Beispiel zwei Zweige zu vergleichen, f\u00fchrst du den Befehl <code>git diff branch1..branch2<\/code> aus und ersetzt die Platzhalter:<\/p>\n<pre><code class=\"language-bash\">git diff feature-branch pre-prod\n<\/code><\/pre>\n<p>Du kannst auch die Unterschiede zwischen deinem aktuellen Zweig und einem anderen Zweig vergleichen:<\/p>\n<pre><code class=\"language-bash\">git diff HEAD..pre-prod\n<\/code><\/pre>\n<p>Wenn du hier zwei Punkte verwendest, erh\u00e4ltst du die Differenz zwischen den beiden Spitzen der Zweige. Wenn du hingegen drei Punkte verwendest, wird der Unterschied zwischen dem gemeinsamen Vorfahren der beiden Zweige ermittelt und f\u00fcr den Test verwendet.<\/p>\n<p>\u00c4hnlich wie bei <code>git log<\/code> kannst du die Ausgabe bereinigen und die Ergebnisse verfeinern. Zum Beispiel pr\u00fcft <code>git diff --name-only branch1..branch2<\/code> nur, welche Dateien sich unterscheiden und l\u00e4sst den Kontext weg:<\/p>\n<figure id=\"attachment_155610\" aria-describedby=\"caption-attachment-155610\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155610 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-diff-name-only.png\" alt=\"Ein Ausschnitt aus einem Terminal-Fenster, der zeigt, wie ein git diff --name-only-Befehl ausgef\u00fchrt wird. Er gibt nur eine Liste von Dateinamen zur\u00fcck, wie im Befehl angegeben.\" width=\"1000\" height=\"487\"><figcaption id=\"caption-attachment-155610\" class=\"wp-caption-text\">Ausf\u00fchren eines git diff &#8211;name-only-Befehls im Terminal<\/figcaption><\/figure>\n<p>Es kann sein, dass die Ausgabe schwer zu analysieren ist, besonders wenn der &#8222;diff&#8220; sehr lang ist. In diesen F\u00e4llen kannst du die Option <code>--color-words<\/code> verwenden:<\/p>\n<figure id=\"attachment_155609\" aria-describedby=\"caption-attachment-155609\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155609 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-diff-color-words.png\" alt=\"Ein Terminal-Fenster, das die ausf\u00fchrliche Ausgabe einer Git-Diff-Anfrage zeigt, komplett mit farblichen Hinweisen f\u00fcr W\u00f6rter. Es zeigt, welche Dateien verglichen werden, explizite Hinweise auf \u00c4nderungen und L\u00f6schungen zwischen Dateien und die \u00c4nderungen selbst in den Dateien. Sie sind farblich gekennzeichnet, um sie vom Rest des Textes zu unterscheiden.\" width=\"1000\" height=\"636\"><figcaption id=\"caption-attachment-155609\" class=\"wp-caption-text\">F\u00fchre den Befehl git diff &#8211;color-words aus und sieh dir die Ausgabe im Terminal an<\/figcaption><\/figure>\n<p>Insgesamt kann <code>git diff<\/code> genauso leistungsf\u00e4hig sein wie andere Befehle, vor allem, wenn du bestimmte Optionen aufrufst und die Unterschiede, die du zur\u00fcckbekommst, verfeinerst.<\/p>\n<h3>11. Anwenden einzelner Commits<\/h3>\n<p>Manchmal m\u00f6chtest du einen bestimmten Commit von einem Branch auf einen anderen anwenden, ohne die beiden Branches zusammenzuf\u00fchren. In Git kannst du dies mit <code>git cherry-pick<\/code> tun. Du solltest diese Funktion mit Bedacht einsetzen, aber <code>git cherry-pick<\/code> kann dir in einigen F\u00e4llen helfen.<\/p>\n<p>Eine Situation ist, wenn du veraltete Feature-Zweige hast, die du nicht in <code>main<\/code> oder <code>trunk<\/code> zusammenf\u00fchrst. Du k\u00f6nntest eine Kombination von Befehlen (wie <code>git log<\/code>) verwenden, um alte relevante Commits auszugraben und sie an anderer Stelle wieder anzuwenden.<\/p>\n<p>Verwende git log, um die Referenz eines Commits zu finden. Vergewissere dich dann, dass du dich in dem Zweig befindest, auf den du eine Referenz anwenden m\u00f6chtest. Nehmen wir zum Beispiel an, du m\u00f6chtest den Commit <code>xxxxxaaaaaa<\/code> in den Zweig &#8222;<code>trunk<\/code>&#8220; \u00fcbernehmen. Checke zuerst deinen Zweig aus..<\/p>\n<pre><code class=\"language-bash\">git checkout trunk\n<\/code><\/pre>\n<p>&#8230;und w\u00e4hle dann deinen Commit aus:<\/p>\n<pre><code class=\"language-bash\">git cherry-pick xxxxxaaaaaa\n<\/code><\/pre>\n<p>Deine Commit-Nachricht wird wahrscheinlich oft nicht mehr aktuell sein. Um dieses Problem zu l\u00f6sen, kannst du die Option <code>--edit<\/code> an den Befehl \u00fcbergeben. Damit kannst du eine neue Commit-Nachricht vor dem Cherry Picking eingeben.<\/p>\n<h3>12. &#8218;Git add&#8216; boosten<\/h3>\n<p>F\u00fcr unseren letzten fortgeschrittenen Git-Power-Befehl zeigen wir dir <code>git add<\/code>. Nein, das ist kein Tippfehler &#8211; dieser grundlegende Git-Befehl hat einige \u00fcberraschende Funktionen unter seiner Haube.<\/p>\n<p>Wenn du zum Beispiel einzelne Dateien zum Staging-Bereich hinzuf\u00fcgst, kannst du Folgendes verwenden:<\/p>\n<pre><code class=\"language-bash\">git add -p\n<\/code><\/pre>\n<p>Mit der Option <code>-p<\/code> kannst du \u00c4nderungen interaktiv einf\u00fcgen. Du kannst die \u00c4nderungen, die du an jeder Datei vorgenommen hast, \u00fcberpr\u00fcfen und dann ausw\u00e4hlen, welche du bereitstellen m\u00f6chtest. So kannst du viel Zeit sparen und vermeiden, dass du eine ungewollte \u00c4nderung einstellst.<\/p>\n<p>Du wei\u00dft vielleicht, dass du einzelne Dateien bereitstellen kannst, aber du kannst auch ein Verzeichnis angeben. Wenn du zum Beispiel alle Dateien im Verzeichnis &#8222;<code>new-feature<\/code>&#8220; bereitstellen m\u00f6chtest, kannst du das tun:<\/p>\n<pre><code class=\"language-bash\">git add new-feature\n<\/code><\/pre>\n<p>Vielleicht m\u00f6chtest du sogar sehen, wie das Ergebnis von <code>git add<\/code> aussieht, ohne den Prozess vollst\u00e4ndig auszuf\u00fchren. Daf\u00fcr hast du eine Option:<\/p>\n<pre><code class=\"language-bash\">git add --dry-run\n\ngit add -n\n<\/code><\/pre>\n<p>Wenn du diesen Vorgang ausf\u00fchrst, zeigt dir Git an, ob es die Dateien hinzuf\u00fcgen oder ignorieren wird. Apropos ignorierte Dateien: Du kannst sie auch zum Staging-Bereich hinzuf\u00fcgen, wenn du das m\u00f6chtest:<\/p>\n<pre><code class=\"language-bash\">git add --force\n\ngit add -f\n<\/code><\/pre>\n<p>Das Hinzuf\u00fcgen von Dateien zum Staging-Bereich kann komplexer sein als ein einfaches bin\u00e4res &#8222;Hinzuf\u00fcgen oder nicht hinzuf\u00fcgen&#8220;-Szenario. So kann einer der wichtigsten Befehle von Git unz\u00e4hlige Eventualit\u00e4ten abdecken.<\/p>\n<h2>Zusammenfassung<\/h2>\n<p>Wenn du die grundlegenden <a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git<\/a>-Befehle in der Tasche hast, hast du 80 Prozent dessen, was du brauchst, um die regul\u00e4ren Versionskontrollaufgaben deines Projekts zu erledigen. Bei den letzten 20 Prozent k\u00f6nnen jedoch die fortgeschrittenen Git-Befehle gl\u00e4nzen.<\/p>\n<p>Befehle und Techniken wie Rebasing, Bisecting, Wiederherstellen von Dateien und mehr helfen dir schnell aus der Patsche. Au\u00dferdem kannst du deinem Team und deinem Projekt einen gr\u00f6\u00dferen Nutzen bieten und dazu beitragen, Arbeitsabl\u00e4ufe zu rationalisieren, die Produktivit\u00e4t zu steigern und eine gr\u00f6\u00dfere Wirkung als Entwickler zu erzielen.<\/p>\n<p>Wird einer dieser fortgeschrittenen Git-Befehle Teil deiner t\u00e4glichen Arbeit werden? Lass es uns in den Kommentaren unten wissen!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Git ist ein leistungsf\u00e4higes Werkzeug f\u00fcr die Versionskontrolle und hat in diesem Bereich eine Art Monopolstellung. F\u00fcr die meisten allt\u00e4glichen Aufgaben ist Git dank seiner Befehlswiederholungen &#8230;<\/p>\n","protected":false},"author":199,"featured_media":63184,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[943],"class_list":["post-63183","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>Git f\u00fcr Fortgeschrittene: Leistungsstarke Befehle jenseits der Grundlagen - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Git ist zwar einfach zu bedienen, aber es ist ein komplexes Versionskontrollsystem. In diesem Beitrag geht es um einige fortgeschrittene Git-Befehle f\u00fcr Power-User!\" \/>\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\/de\/blog\/git-fortgeschritten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Git f\u00fcr Fortgeschrittene: Leistungsstarke Befehle jenseits der Grundlagen\" \/>\n<meta property=\"og:description\" content=\"Git ist zwar einfach zu bedienen, aber es ist ein komplexes Versionskontrollsystem. In diesem Beitrag geht es um einige fortgeschrittene Git-Befehle f\u00fcr Power-User!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-26T16:34:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-27T09:27:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.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=\"Git ist zwar einfach zu bedienen, aber es ist ein komplexes Versionskontrollsystem. In diesem Beitrag geht es um einige fortgeschrittene Git-Befehle f\u00fcr Power-User!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremy Holcombe\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/\"},\"author\":{\"name\":\"Jeremy Holcombe\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\"},\"headline\":\"Git f\u00fcr Fortgeschrittene: Leistungsstarke Befehle jenseits der Grundlagen\",\"datePublished\":\"2023-06-26T16:34:09+00:00\",\"dateModified\":\"2023-07-27T09:27:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/\"},\"wordCount\":3540,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.jpg\",\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/\",\"name\":\"Git f\u00fcr Fortgeschrittene: Leistungsstarke Befehle jenseits der Grundlagen - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.jpg\",\"datePublished\":\"2023-06-26T16:34:09+00:00\",\"dateModified\":\"2023-07-27T09:27:48+00:00\",\"description\":\"Git ist zwar einfach zu bedienen, aber es ist ein komplexes Versionskontrollsystem. In diesem Beitrag geht es um einige fortgeschrittene Git-Befehle f\u00fcr Power-User!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Git\",\"item\":\"https:\/\/kinsta.com\/de\/thema\/git\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Git f\u00fcr Fortgeschrittene: Leistungsstarke Befehle jenseits der Grundlagen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/de\/#website\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"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\/de\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\",\"name\":\"Jeremy Holcombe\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/jeremyholcombe\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Git f\u00fcr Fortgeschrittene: Leistungsstarke Befehle jenseits der Grundlagen - Kinsta\u00ae","description":"Git ist zwar einfach zu bedienen, aber es ist ein komplexes Versionskontrollsystem. In diesem Beitrag geht es um einige fortgeschrittene Git-Befehle f\u00fcr Power-User!","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\/de\/blog\/git-fortgeschritten\/","og_locale":"de_DE","og_type":"article","og_title":"Git f\u00fcr Fortgeschrittene: Leistungsstarke Befehle jenseits der Grundlagen","og_description":"Git ist zwar einfach zu bedienen, aber es ist ein komplexes Versionskontrollsystem. In diesem Beitrag geht es um einige fortgeschrittene Git-Befehle f\u00fcr Power-User!","og_url":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2023-06-26T16:34:09+00:00","article_modified_time":"2023-07-27T09:27:48+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.jpg","type":"image\/jpeg"}],"author":"Jeremy Holcombe","twitter_card":"summary_large_image","twitter_description":"Git ist zwar einfach zu bedienen, aber es ist ein komplexes Versionskontrollsystem. In diesem Beitrag geht es um einige fortgeschrittene Git-Befehle f\u00fcr Power-User!","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.jpg","twitter_creator":"@Kinsta_DE","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Jeremy Holcombe","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/"},"author":{"name":"Jeremy Holcombe","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21"},"headline":"Git f\u00fcr Fortgeschrittene: Leistungsstarke Befehle jenseits der Grundlagen","datePublished":"2023-06-26T16:34:09+00:00","dateModified":"2023-07-27T09:27:48+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/"},"wordCount":3540,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.jpg","inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/","url":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/","name":"Git f\u00fcr Fortgeschrittene: Leistungsstarke Befehle jenseits der Grundlagen - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.jpg","datePublished":"2023-06-26T16:34:09+00:00","dateModified":"2023-07-27T09:27:48+00:00","description":"Git ist zwar einfach zu bedienen, aber es ist ein komplexes Versionskontrollsystem. In diesem Beitrag geht es um einige fortgeschrittene Git-Befehle f\u00fcr Power-User!","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.jpg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/advanced-git.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/git-fortgeschritten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"Git","item":"https:\/\/kinsta.com\/de\/thema\/git\/"},{"@type":"ListItem","position":3,"name":"Git f\u00fcr Fortgeschrittene: Leistungsstarke Befehle jenseits der Grundlagen"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/de\/#website","url":"https:\/\/kinsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","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\/de\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21","name":"Jeremy Holcombe","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/jeremyholcombe\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/63183","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/users\/199"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=63183"}],"version-history":[{"count":6,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/63183\/revisions"}],"predecessor-version":[{"id":63464,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/63183\/revisions\/63464"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/63183\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/63183\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/63183\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/63183\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/63183\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/63183\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/63183\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/63183\/translations\/es"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/63183\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/63184"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=63183"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=63183"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=63183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}