CINXE.COM
Git - Transfer Protokolle
<!DOCTYPE html> <html lang="de"> <head> <meta charset='utf-8'> <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Git - Transfer Protokolle</title> <link href="/favicon.ico" rel='shortcut icon' type='image/x-icon'> <link rel="stylesheet" href="/application.min.css"> <script src="/js/modernizr.js"></script> <script src="/js/modernize.js"></script> </head> <body id="documentation"> <div class="inner"> <header> <a href="/"><img src="/images/logo@2x.png" width="110" height="46" alt="Git" /></a> <span id="tagline"></span> <script type="text/javascript"> const taglines = [ "fast-version-control", "everything-is-local", "distributed-even-if-your-workflow-isnt", "local-branching-on-the-cheap", "distributed-is-the-new-centralized" ]; var tagline = taglines[Math.floor(Math.random() * taglines.length)]; document.getElementById('tagline').innerHTML = '--' + tagline; </script> <form id="search" action="/search/results"> <input id="search-text" name="search" placeholder="Type / to search entire site…" autocomplete="off" type="text" /> </form> <div id="search-results"></div> </header> </div> <div class="inner"> <div id="content-wrapper"> <div tabindex="1" class="sidebar-btn"></div> <aside class="sidebar" id="sidebar"> <nav> <ul> <li> <a href="/about">About</a> <ul> </ul> </li> <li> <a href="/doc" class="active">Documentation</a> <ul class="expanded"> <li> <a href="/docs">Reference</a> </li> <li> <a href="/book" class="active">Book</a> </li> <li> <a href="/videos">Videos</a> </li> <li> <a href="/doc/ext">External Links</a> </li> </ul> </li> <li> <a href="/downloads">Downloads</a> <ul > <li> <a href="/downloads/guis">GUI Clients</a> </li> <li> <a href="/downloads/logos">Logos</a> </li> </ul> </li> <li> <a href="/community">Community</a> </li> </ul> <hr class="sidebar"> <p> This book is available in <a href="/book/en/v2/Git-Internals-Transfer-Protocols">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git%e2%80%99in-Daxili-%c4%b0%c5%9fl%c9%99ri-Transfer-Protokollar%c4%b1">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-Interna-Transfer-Protokolle">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Los-entresijos-internos-de-Git-Protocolos-de-transferencia">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Les-tripes-de-Git-Les-protocoles-de-transfert">Français</a>,</td></tr> <tr><td><a href="/book/gr">Ελληνικά</a>,</td></tr> <tr><td><a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-%e8%bb%a2%e9%80%81%e3%83%97%e3%83%ad%e3%83%88%e3%82%b3%e3%83%ab">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-%eb%8d%b0%ec%9d%b4%ed%84%b0-%ec%a0%84%ec%86%a1-%ed%94%84%eb%a1%9c%ed%86%a0%ec%bd%9c">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Git-Binnenwerk-Uitwisseling-protocollen">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/Git-%d0%b8%d0%b7%d0%bd%d1%83%d1%82%d1%80%d0%b8-%d0%9f%d1%80%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bb%d1%8b-%d0%bf%d0%b5%d1%80%d0%b5%d0%b4%d0%b0%d1%87%d0%b8-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Notranjost-Gita-Protokoli-prenosa">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Mga-Panloob-ng-GIT-Transfer-Protocols">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/Git-%d0%b7%d1%81%d0%b5%d1%80%d0%b5%d0%b4%d0%b8%d0%bd%d0%b8-%d0%9f%d1%80%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bb%d0%b8-%d0%bf%d0%b5%d1%80%d0%b5%d0%b4%d0%b0%d1%87%d1%96">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-%e4%bc%a0%e8%be%93%e5%8d%8f%e8%ae%ae">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Git-Internals-P%c5%99enosov%c3%a9-protokoly">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/%d0%92%d0%bd%d0%b0%d1%82%d1%80%d0%b5%d1%88%d0%bd%d0%be%d1%81%d1%82%d0%b0-%d0%bd%d0%b0-Git-Transfer-Protocols">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Protoko%c5%82y-transferu">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%93%d0%b8%d1%82-%d0%b8%d0%b7%d0%bd%d1%83%d1%82%d1%80%d0%b0-%d0%9f%d1%80%d0%be%d1%82%d0%be%d0%ba%d0%be%d0%bb%d0%b8-%d0%b7%d0%b0-%d0%bf%d1%80%d0%b5%d0%bd%d0%be%d1%81">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-Internals-Transfer-Protocols">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Git-Internals-Transfer-Protocols">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-Internals-Transfer-Protocols">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Git-Internals-Transfer-Protocols" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-Internals-Transfer-Protocols">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-Internals-Transfer-Protocols">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-Internals-Transfer-Protocols">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Transfer-Protocols">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Internos-do-Git-Transfer-Protocols">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-Internals-Transfer-Protocols">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Transfer-Protokolleri">Türkçe</a>.</td></tr> </table> </p> <hr class="sidebar"/> <p> The source of this book is <a href="https://github.com/progit/progit2-de">hosted on GitHub.</a></br> Patches, suggestions and comments are welcome. </p> </nav> </aside> <div id="content"> <div id="book-chapters"> <a class="dropdown-trigger" id="book-chapters-trigger" data-panel-id="chapters-dropdown" href="#">Chapters ▾</a> <div class='dropdown-panel' id='chapters-dropdown'> <div class='three-column'> <div class="column-left"> <ol class='book-toc'> <li class='chapter'> <h2>1. <a href="/book/de/v2/Erste-Schritte-Was-ist-Versionsverwaltung%3F">Erste Schritte</a></h2> <ol> <li> 1.1 <a href="/book/de/v2/Erste-Schritte-Was-ist-Versionsverwaltung%3F">Was ist Versionsverwaltung?</a> </li> <li> 1.2 <a href="/book/de/v2/Erste-Schritte-Kurzer-%c3%9cberblick-%c3%bcber-die-Historie-von-Git">Kurzer Überblick über die Historie von Git</a> </li> <li> 1.3 <a href="/book/de/v2/Erste-Schritte-Was-ist-Git%3F">Was ist Git?</a> </li> <li> 1.4 <a href="/book/de/v2/Erste-Schritte-Die-Kommandozeile">Die Kommandozeile</a> </li> <li> 1.5 <a href="/book/de/v2/Erste-Schritte-Git-installieren">Git installieren</a> </li> <li> 1.6 <a href="/book/de/v2/Erste-Schritte-Git-Basis-Konfiguration">Git Basis-Konfiguration</a> </li> <li> 1.7 <a href="/book/de/v2/Erste-Schritte-Hilfe-finden">Hilfe finden</a> </li> <li> 1.8 <a href="/book/de/v2/Erste-Schritte-Zusammenfassung">Zusammenfassung</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/de/v2/Git-Grundlagen-Ein-Git-Repository-anlegen">Git Grundlagen</a></h2> <ol> <li> 2.1 <a href="/book/de/v2/Git-Grundlagen-Ein-Git-Repository-anlegen">Ein Git-Repository anlegen</a> </li> <li> 2.2 <a href="/book/de/v2/Git-Grundlagen-%c3%84nderungen-nachverfolgen-und-im-Repository-speichern">Änderungen nachverfolgen und im Repository speichern</a> </li> <li> 2.3 <a href="/book/de/v2/Git-Grundlagen-Anzeigen-der-Commit-Historie">Anzeigen der Commit-Historie</a> </li> <li> 2.4 <a href="/book/de/v2/Git-Grundlagen-Ungewollte-%c3%84nderungen-r%c3%bcckg%c3%a4ngig-machen">Ungewollte Änderungen rückgängig machen</a> </li> <li> 2.5 <a href="/book/de/v2/Git-Grundlagen-Mit-Remotes-arbeiten">Mit Remotes arbeiten</a> </li> <li> 2.6 <a href="/book/de/v2/Git-Grundlagen-Taggen">Taggen</a> </li> <li> 2.7 <a href="/book/de/v2/Git-Grundlagen-Git-Aliases">Git Aliases</a> </li> <li> 2.8 <a href="/book/de/v2/Git-Grundlagen-Zusammenfassung">Zusammenfassung</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/de/v2/Git-Branching-Branches-auf-einen-Blick">Git Branching</a></h2> <ol> <li> 3.1 <a href="/book/de/v2/Git-Branching-Branches-auf-einen-Blick">Branches auf einen Blick</a> </li> <li> 3.2 <a href="/book/de/v2/Git-Branching-Einfaches-Branching-und-Merging">Einfaches Branching und Merging</a> </li> <li> 3.3 <a href="/book/de/v2/Git-Branching-Branch-Management">Branch-Management</a> </li> <li> 3.4 <a href="/book/de/v2/Git-Branching-Branching-Workflows">Branching-Workflows</a> </li> <li> 3.5 <a href="/book/de/v2/Git-Branching-Remote-Branches">Remote-Branches</a> </li> <li> 3.6 <a href="/book/de/v2/Git-Branching-Rebasing">Rebasing</a> </li> <li> 3.7 <a href="/book/de/v2/Git-Branching-Zusammenfassung">Zusammenfassung</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/de/v2/Git-auf-dem-Server-Die-Protokolle">Git auf dem Server</a></h2> <ol> <li> 4.1 <a href="/book/de/v2/Git-auf-dem-Server-Die-Protokolle">Die Protokolle</a> </li> <li> 4.2 <a href="/book/de/v2/Git-auf-dem-Server-Git-auf-einem-Server-einrichten">Git auf einem Server einrichten</a> </li> <li> 4.3 <a href="/book/de/v2/Git-auf-dem-Server-Erstellung-eines-SSH-Public-Keys">Erstellung eines SSH-Public-Keys</a> </li> <li> 4.4 <a href="/book/de/v2/Git-auf-dem-Server-Einrichten-des-Servers">Einrichten des Servers</a> </li> <li> 4.5 <a href="/book/de/v2/Git-auf-dem-Server-Git-Daemon">Git-Daemon</a> </li> <li> 4.6 <a href="/book/de/v2/Git-auf-dem-Server-Smart-HTTP">Smart HTTP</a> </li> <li> 4.7 <a href="/book/de/v2/Git-auf-dem-Server-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/de/v2/Git-auf-dem-Server-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/de/v2/Git-auf-dem-Server-Von-Drittanbietern-gehostete-Optionen">Von Drittanbietern gehostete Optionen</a> </li> <li> 4.10 <a href="/book/de/v2/Git-auf-dem-Server-Zusammenfassung">Zusammenfassung</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/de/v2/Verteiltes-Git-Verteilter-Arbeitsablauf">Verteiltes Git</a></h2> <ol> <li> 5.1 <a href="/book/de/v2/Verteiltes-Git-Verteilter-Arbeitsablauf">Verteilter Arbeitsablauf</a> </li> <li> 5.2 <a href="/book/de/v2/Verteiltes-Git-An-einem-Projekt-mitwirken">An einem Projekt mitwirken</a> </li> <li> 5.3 <a href="/book/de/v2/Verteiltes-Git-Ein-Projekt-verwalten">Ein Projekt verwalten</a> </li> <li> 5.4 <a href="/book/de/v2/Verteiltes-Git-Zusammenfassung">Zusammenfassung</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/de/v2/GitHub-Einrichten-und-Konfigurieren-eines-Kontos">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/de/v2/GitHub-Einrichten-und-Konfigurieren-eines-Kontos">Einrichten und Konfigurieren eines Kontos</a> </li> <li> 6.2 <a href="/book/de/v2/GitHub-Mitwirken-an-einem-Projekt">Mitwirken an einem Projekt</a> </li> <li> 6.3 <a href="/book/de/v2/GitHub-Ein-Projekt-betreuen">Ein Projekt betreuen</a> </li> <li> 6.4 <a href="/book/de/v2/GitHub-Verwalten-einer-Organisation">Verwalten einer Organisation</a> </li> <li> 6.5 <a href="/book/de/v2/GitHub-Skripte-mit-GitHub">Skripte mit GitHub</a> </li> <li> 6.6 <a href="/book/de/v2/GitHub-Zusammenfassung">Zusammenfassung</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/de/v2/Git-Tools-Revisions-Auswahl">Git Tools</a></h2> <ol> <li> 7.1 <a href="/book/de/v2/Git-Tools-Revisions-Auswahl">Revisions-Auswahl</a> </li> <li> 7.2 <a href="/book/de/v2/Git-Tools-Interaktives-Stagen">Interaktives Stagen</a> </li> <li> 7.3 <a href="/book/de/v2/Git-Tools-Stashen-und-Bereinigen">Stashen und Bereinigen</a> </li> <li> 7.4 <a href="/book/de/v2/Git-Tools-Deine-Arbeit-signieren">Deine Arbeit signieren</a> </li> <li> 7.5 <a href="/book/de/v2/Git-Tools-Suchen">Suchen</a> </li> <li> 7.6 <a href="/book/de/v2/Git-Tools-Den-Verlauf-umschreiben">Den Verlauf umschreiben</a> </li> <li> 7.7 <a href="/book/de/v2/Git-Tools-Reset-entzaubert">Reset entzaubert</a> </li> <li> 7.8 <a href="/book/de/v2/Git-Tools-Fortgeschrittenes-Merging">Fortgeschrittenes Merging</a> </li> <li> 7.9 <a href="/book/de/v2/Git-Tools-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/de/v2/Git-Tools-Debuggen-mit-Git">Debuggen mit Git</a> </li> <li> 7.11 <a href="/book/de/v2/Git-Tools-Submodule">Submodule</a> </li> <li> 7.12 <a href="/book/de/v2/Git-Tools-Bundling">Bundling</a> </li> <li> 7.13 <a href="/book/de/v2/Git-Tools-Replace-Ersetzen">Replace (Ersetzen)</a> </li> <li> 7.14 <a href="/book/de/v2/Git-Tools-Anmeldeinformationen-speichern">Anmeldeinformationen speichern</a> </li> <li> 7.15 <a href="/book/de/v2/Git-Tools-Zusammenfassung">Zusammenfassung</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/de/v2/Git-einrichten-Git-Konfiguration">Git einrichten</a></h2> <ol> <li> 8.1 <a href="/book/de/v2/Git-einrichten-Git-Konfiguration">Git Konfiguration</a> </li> <li> 8.2 <a href="/book/de/v2/Git-einrichten-Git-Attribute">Git-Attribute</a> </li> <li> 8.3 <a href="/book/de/v2/Git-einrichten-Git-Hooks">Git Hooks</a> </li> <li> 8.4 <a href="/book/de/v2/Git-einrichten-Beispiel-f%c3%bcr-Git-forcierte-Regeln">Beispiel für Git-forcierte Regeln</a> </li> <li> 8.5 <a href="/book/de/v2/Git-einrichten-Zusammenfassung">Zusammenfassung</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/de/v2/Git-und-andere-VCS-Systeme-Git-als-Client">Git und andere VCS-Systeme</a></h2> <ol> <li> 9.1 <a href="/book/de/v2/Git-und-andere-VCS-Systeme-Git-als-Client">Git als Client</a> </li> <li> 9.2 <a href="/book/de/v2/Git-und-andere-VCS-Systeme-Migration-zu-Git">Migration zu Git</a> </li> <li> 9.3 <a href="/book/de/v2/Git-und-andere-VCS-Systeme-Zusammenfassung">Zusammenfassung</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/de/v2/Git-Interna-Basisbefehle-und-Standardbefehle-Plumbing-and-Porcelain">Git Interna</a></h2> <ol> <li> 10.1 <a href="/book/de/v2/Git-Interna-Basisbefehle-und-Standardbefehle-Plumbing-and-Porcelain">Basisbefehle und Standardbefehle (Plumbing and Porcelain)</a> </li> <li> 10.2 <a href="/book/de/v2/Git-Interna-Git-Objekte">Git Objekte</a> </li> <li> 10.3 <a href="/book/de/v2/Git-Interna-Git-Referenzen">Git Referenzen</a> </li> <li> 10.4 <a href="/book/de/v2/Git-Interna-Packdateien-engl-Packfiles">Packdateien (engl. Packfiles)</a> </li> <li> 10.5 <a href="/book/de/v2/Git-Interna-Die-Referenzspezifikation-engl-Refspec">Die Referenzspezifikation (engl. Refspec)</a> </li> <li> 10.6 <a href="/book/de/v2/Git-Interna-Transfer-Protokolle" class="active">Transfer Protokolle</a> </li> <li> 10.7 <a href="/book/de/v2/Git-Interna-Wartung-und-Datenwiederherstellung">Wartung und Datenwiederherstellung</a> </li> <li> 10.8 <a href="/book/de/v2/Git-Interna-Zusammenfassung">Zusammenfassung</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/de/v2/Anhang-A:-Git-in-anderen-Umgebungen-Grafische-Schnittstellen">Anhang A: Git in anderen Umgebungen</a></h2> <ol> <li> A1.1 <a href="/book/de/v2/Anhang-A:-Git-in-anderen-Umgebungen-Grafische-Schnittstellen">Grafische Schnittstellen</a> </li> <li> A1.2 <a href="/book/de/v2/Anhang-A:-Git-in-anderen-Umgebungen-Git-in-Visual-Studio">Git in Visual Studio</a> </li> <li> A1.3 <a href="/book/de/v2/Anhang-A:-Git-in-anderen-Umgebungen-Git-in-Visual-Studio-Code">Git in Visual Studio Code</a> </li> <li> A1.4 <a href="/book/de/v2/Anhang-A:-Git-in-anderen-Umgebungen-Git-in-IntelliJ-/-PyCharm-/-WebStorm-/-PhpStorm-/-RubyMine">Git in IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine</a> </li> <li> A1.5 <a href="/book/de/v2/Anhang-A:-Git-in-anderen-Umgebungen-Git-in-Sublime-Text">Git in Sublime Text</a> </li> <li> A1.6 <a href="/book/de/v2/Anhang-A:-Git-in-anderen-Umgebungen-Git-in-Bash">Git in Bash</a> </li> <li> A1.7 <a href="/book/de/v2/Anhang-A:-Git-in-anderen-Umgebungen-Git-in-Zsh">Git in Zsh</a> </li> <li> A1.8 <a href="/book/de/v2/Anhang-A:-Git-in-anderen-Umgebungen-Git-in-PowerShell">Git in PowerShell</a> </li> <li> A1.9 <a href="/book/de/v2/Anhang-A:-Git-in-anderen-Umgebungen-Zusammenfassung">Zusammenfassung</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/de/v2/Anhang-B:-Git-in-deine-Anwendungen-einbetten-Die-Git-Kommandozeile">Anhang B: Git in deine Anwendungen einbetten</a></h2> <ol> <li> A2.1 <a href="/book/de/v2/Anhang-B:-Git-in-deine-Anwendungen-einbetten-Die-Git-Kommandozeile">Die Git-Kommandozeile</a> </li> <li> A2.2 <a href="/book/de/v2/Anhang-B:-Git-in-deine-Anwendungen-einbetten-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/de/v2/Anhang-B:-Git-in-deine-Anwendungen-einbetten-JGit">JGit</a> </li> <li> A2.4 <a href="/book/de/v2/Anhang-B:-Git-in-deine-Anwendungen-einbetten-go-git">go-git</a> </li> <li> A2.5 <a href="/book/de/v2/Anhang-B:-Git-in-deine-Anwendungen-einbetten-Dulwich">Dulwich</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Setup-und-Konfiguration">Anhang C: Git Kommandos</a></h2> <ol> <li> A3.1 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Setup-und-Konfiguration">Setup und Konfiguration</a> </li> <li> A3.2 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Projekte-importieren-und-erstellen">Projekte importieren und erstellen</a> </li> <li> A3.3 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Einfache-Snapshot-Funktionen">Einfache Snapshot-Funktionen</a> </li> <li> A3.4 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Branching-und-Merging">Branching und Merging</a> </li> <li> A3.5 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Projekte-gemeinsam-nutzen-und-aktualisieren">Projekte gemeinsam nutzen und aktualisieren</a> </li> <li> A3.6 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Kontrollieren-und-Vergleichen">Kontrollieren und Vergleichen</a> </li> <li> A3.7 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Debugging">Debugging</a> </li> <li> A3.8 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Patchen-bzw-Fehlerkorrektur">Patchen bzw. Fehlerkorrektur</a> </li> <li> A3.9 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-E-mails">E-mails</a> </li> <li> A3.10 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Externe-Systeme">Externe Systeme</a> </li> <li> A3.11 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Administration">Administration</a> </li> <li> A3.12 <a href="/book/de/v2/Anhang-C:-Git-Kommandos-Basisbefehle">Basisbefehle</a> </li> </ol> </li> </ol> </div> </div> </div> <span class="light" id="edition"> 2nd Edition </span> </div> <div id="main" data-pagefind-filter="category:book" data-pagefind-meta="category:Book" data-pagefind-weight="0.05" data-pagefind-body class="book edition2"> <h1>10.6 Git Interna - Transfer Protokolle</h1> <div> <h2 id="_transfer_protokolle">Transfer Protokolle</h2> <div class="paragraph"> <p>Git kann Daten zwischen zwei Repositorys hauptsächlich auf zwei Arten übertragen: mittels dem „dummen“ Protokoll und dem „intelligenten“ Protokoll. In diesem Abschnitt wird kurz erläutert, wie diese beiden Hauptprotokolle funktionieren.</p> </div> <div class="sect3"> <h3 id="_das_dumme_protokoll">Das dumme Protokoll</h3> <div class="paragraph"> <p>Wenn du ein Repository einrichtest, das schreibgeschützt über HTTP bereitgestellt wird, wird wahrscheinlich das dumme Protokoll verwendet. Dieses Protokoll wird als „dumm“ bezeichnet, da es während des Transportvorgangs keinen Git-spezifischen Code auf der Serverseite erfordert. Der Abrufprozess besteht aus einer Reihe von HTTP <code>GET</code> Abfragen, bei denen der Client das Layout des Git-Repositorys auf dem Server übernehmen kann.</p> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Anmerkung</div> </td> <td class="content"> <div class="paragraph"> <p>Das dumme Protokoll wird heutzutage ziemlich selten verwendet. Es ist schwierig, es sicher oder privat einzurichten, daher lehnen die meisten Git-Hosts (sowohl cloudbasiert als auch on-premise) die Verwendung ab. Es wird generell empfohlen, das smarte Protokoll zu verwenden, welches wir weiter unten beschreiben.</p> </div> </td> </tr> </table> </div> <div class="paragraph"> <p>Folgen wir dem <code>http-fetch</code> Prozess für die simplegit-Bibliothek:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git clone http://server/simplegit-progit.git</code></pre> </div> </div> <div class="paragraph"> <p>Das erste, was dieser Befehl tut, ist das pullen der Datei <code>info/refs</code>. Diese Datei wird mit dem Befehl <code>update-server-info</code> geschrieben. Aus diesem Grund musst du diesen als <code>post-receive</code> Hook aktivieren, damit der HTTP-Transport ordnungsgemäß funktioniert:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> GET info/refs ca82a6dff817ec66f44342007202690a93763949 refs/heads/master</code></pre> </div> </div> <div class="paragraph"> <p>Jetzt hast du eine Liste der remote Referenzen und der SHA-1s. Als Nächstes suchst du nach der HEAD-Referenz, damit du weißt, was du abschließend überprüfen musst:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> GET HEAD ref: refs/heads/master</code></pre> </div> </div> <div class="paragraph"> <p>Du musst den 'master'-Branch auschecken, wenn du den Vorgang abgeschlossen hast. Jetzt kannst du mit dem laufenden Prozess beginnen. Da dein Ausgangspunkt das Commit-Objekt <code>ca82a6</code> ist, das du in der Datei <code>info/refs</code> gesehen hast, rufst du zunächst Folgendes ab:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> GET objects/ca/82a6dff817ec66f44342007202690a93763949 (179 bytes of binary data)</code></pre> </div> </div> <div class="paragraph"> <p>Du erhältst ein Objekt zurück – das Objekt befindet sich in losem Format auf dem Server und du hast es über einen statischen HTTP-GET-Aufruf abgerufen. Du kannst es zlib-dekomprimieren, den Header entfernen und den Commit-Inhalt anzeigen:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p ca82a6dff817ec66f44342007202690a93763949 tree cfda3bf379e4f8dba8717dee55aab78aef7f4daf parent 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 author Scott Chacon <schacon@gmail.com> 1205815931 -0700 committer Scott Chacon <schacon@gmail.com> 1240030591 -0700 Change version number</code></pre> </div> </div> <div class="paragraph"> <p>Als nächstes musst du zwei weitere Objekte abrufen – <code>cfda3b</code>, das ist der Inhaltsbaum, auf den das gerade abgerufene Commit verweist; und <code>085bb3</code>, welches das übergeordnete Commit ist:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> GET objects/08/5bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 (179 bytes of data)</code></pre> </div> </div> <div class="paragraph"> <p>Damit hast du dein nächstes Commit-Objekt. Hole dir nun das Baumobjekt:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> GET objects/cf/da3bf379e4f8dba8717dee55aab78aef7f4daf (404 - Not Found)</code></pre> </div> </div> <div class="paragraph"> <p>Hoppla – es sieht so aus, als ob das Baum-Objekt auf dem Server nicht im losen Format vorliegt, sodass du eine 404-Antwort erhältst. Dafür gibt es mehrere Gründe: Das Objekt befindet sich möglicherweise in einem alternativen Repository oder in einemr Paketdatei (engl. packfile) in diesem Repository. Git sucht zuerst nach allen gelisteten Alternativen:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> GET objects/info/http-alternates (empty file)</code></pre> </div> </div> <div class="paragraph"> <p>Falls dies eine Liste alternativer URLs zurückgibt, sucht Git dort nach losen Dateien und packfiles. Dies ist ein nützlicher Mechanismus für Projekte, die sich gegenseitig forken, um Objekte auf der Festplatte zu teilen. Da in diesem Fall jedoch keine Alternativen aufgeführt sind, muss sich dein Objekt in einem packfile befinden. Um zu sehen, welche packfiles auf diesem Server verfügbar sind, musst du die Datei <code>objects/info/packs</code> abrufen, die eine Liste dieser Dateien enthält (dies wird ebenfalls mittels <code>update-server-info</code> generiert):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> GET objects/info/packs P pack-816a9b2334da9953e530f27bcac22082a9f5b835.pack</code></pre> </div> </div> <div class="paragraph"> <p>Es gibt nur ein packfile auf dem Server, sodass sich dein Objekt offensichtlich dort befindet. Überprüfe jedoch den Index, um dies auch sicherzustellen. Dies ist ebenfalls nützlich, wenn sich mehrere packfiles auf dem Server befinden. Du kannst so prüfen, welches packfile das gewünschte Objekt enthält:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> GET objects/pack/pack-816a9b2334da9953e530f27bcac22082a9f5b835.idx (4k of binary data)</code></pre> </div> </div> <div class="paragraph"> <p>Nachdem du nun den packfile-Index hast, kannst du sehen, ob sich dein Objekt darin befindet. Der Index listet die SHA-1-Werte der in dem packfile enthaltenen Objekte und die Offsets zu diesen Objekten. Dein Objekt ist vorhanden, also holen dir das ganze packfile:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> GET objects/pack/pack-816a9b2334da9953e530f27bcac22082a9f5b835.pack (13k of binary data)</code></pre> </div> </div> <div class="paragraph"> <p>Nun hast du dein Baumobjekt und kannst deine Commits weiter durchgehen. Sie befinden sich alle in dem gerade heruntergeladenen packfile, sodass du keine weiteren Anfragen an deinen Server stellen musst. Git checkt eine Arbeitskopie des <code>master</code> Branches aus, auf die in der HEAD-Referenz verwiesen wurde, die du zu Beginn heruntergeladen hast.</p> </div> </div> <div class="sect3"> <h3 id="_das_smarte_protokoll">Das smarte Protokoll</h3> <div class="paragraph"> <p>Das dumme Protokoll ist einfach, aber ein bisschen ineffizient. Es kann keine Daten vom Client auf den Server schreiben. Das Smart-Protokoll wird oft zum Übertragen von Daten genutzt. Es erfordert jedoch einen intelligenten Git-Prozess auf der Remote-Seite. Es kann lokale Daten lesen, herausfinden, was der Client hat und benötigt, und eine benutzerdefiniertes packfile dafür generieren. Es gibt zwei Arten von Prozessen um Daten zu übertragen: zwei zum Hochladen von Daten und zwei zum Herunterladen von Daten.</p> </div> <div class="sect4"> <h4 id="_daten_hochladen">Daten hochladen</h4> <div class="paragraph"> <p> Um Daten remote hochzuladen, verwendet Git die Prozesse <code>send-pack</code> und <code>receive-pack</code>. Der <code>send-pack</code> Prozess wird auf dem Client ausgeführt und stellt eine Verbindung zu einem <code>receive-pack</code> Prozess auf der Remote-Seite her.</p> </div> <div class="sect5"> <h6 id="_ssh">SSH</h6> <div class="paragraph"> <p>Angenommen, du führst in deinem Projekt <code>git push origin master</code> aus, und <code>origin</code> ist als URL definiert, die das SSH-Protokoll verwendet. Git startet den <code>send-pack</code> Prozess, der eine Verbindung über SSH zu deinem Server aufbaut. Es wird versucht, einen Befehl auf dem Remote-Server über einen SSH-Aufruf auszuführen, der in etwa so aussieht:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ ssh -x git@server "git-receive-pack 'simplegit-progit.git'" 00a5ca82a6dff817ec66f4437202690a93763949 refs/heads/master□report-status \ delete-refs side-band-64k quiet ofs-delta \ agent=git/2:2.1.1+github-607-gfba4028 delete-refs 0000</code></pre> </div> </div> <div class="paragraph"> <p>Der Befehl <code>git-receive-pack</code> antwortet sofort mit einer Zeile für jede Referenz, die er derzeit hat – in diesem Fall nur den <code>master</code> Branch und seinen SHA-1. Die erste Zeile enthält auch eine Liste der Serverfunktionen (hier <code>report-status</code>, <code>delete-refs</code> und einige andere, einschließlich der Client-ID).</p> </div> <div class="paragraph"> <p>Die Daten werden in Paketen (eng. chunks) übertragen. Jeder Chunk beginnt mit einem 4-stelligen Hex-Wert, der angibt, wie lang der Chunk ist (einschließlich der 4 Bytes der Gesamtlänge). Die Pakete enthalten in der Regel eine einzige Zeile mit Daten und einen abschließenden Zeilenvorschub. Dein erster Chunk beginnt mit 00a5, also hexadezimal für 165, womit das Paket 165 Bytes lang ist. Der nächste Chunk ist 0000, d.h. der Server ist mit seiner Referenzliste fertig.</p> </div> <div class="paragraph"> <p>Jetzt, da der Server-Status bekannt ist, bestimmt dein <code>send-pack</code> Prozess, welche Commits er hat, die der Server nicht hat. Für jede Referenz, die durch diesen Push aktualisiert wird, teilt der <code>send-pack</code> Prozess dem <code>receive-pack</code> Prozess diese Informationen mit. Wenn du beispielsweise den <code>master</code> Branch aktualisieren und einen <code>experiment</code> Branch hinzufügst, sieht die Antwort von <code>send-pack</code> möglicherweise so aus:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>0076ca82a6dff817ec66f44342007202690a93763949 15027957951b64cf874c3557a0f3547bd83b3ff6 \ refs/heads/master report-status 006c0000000000000000000000000000000000000000 cdfdb42577e2506715f8cfeacdbabc092bf63e8d \ refs/heads/experiment 0000</code></pre> </div> </div> <div class="paragraph"> <p>Git sendet eine Zeile für jede Referenz, die du aktualisierst, mit der Länge der Zeile, dem alten SHA-1, dem neuen SHA-1 und der Referenz, die aktualisiert wird. Die erste Zeile enthält auch die Funktionen des Clients. Der SHA-1-Wert aller Nullen bedeutet, dass zuvor nichts vorhanden war, da du die experiment-Referenz hinzufügst. Wenn du eine Referenz löschst, siehst du das Gegenteil: Alle Nullen auf der rechten Seite.</p> </div> <div class="paragraph"> <p>Als nächstes sendet der Client ein packfile mit allen Objekten, die der Server noch nicht hat. Schließlich antwortet der Server mit einer Erfolgs- oder Fehlermeldung:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>000eunpack ok</code></pre> </div> </div> </div> <div class="sect5"> <h6 id="_https">HTTP(S)</h6> <div class="paragraph"> <p>Der Prozess über HTTP ist fast derselbe, nur das Handshaking ist ein wenig anders. Die Verbindung wird mit folgender Anfrage initiiert:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> GET http://server/simplegit-progit.git/info/refs?service=git-receive-pack 001f# service=git-receive-pack 00ab6c5f0e45abd7832bf23074a333f739977c9e8188 refs/heads/master□report-status \ delete-refs side-band-64k quiet ofs-delta \ agent=git/2:2.1.1~vmg-bitmaps-bugaloo-608-g116744e 0000</code></pre> </div> </div> <div class="paragraph"> <p>Das ist das Ende der ersten Client-Server-Unterhaltung. Der Client stellt dann eine weitere Anfrage, diesmal einen <code>POST</code>, mit den Daten, die <code>send-pack</code> liefert.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> POST http://server/simplegit-progit.git/git-receive-pack</code></pre> </div> </div> <div class="paragraph"> <p>Die <code>POST</code> Abfrage enthält die <code>send-pack</code> Ausgabe und das packfile als Nutzdaten. Der Server zeigt dann mit seiner HTTP-Antwort Erfolg oder Fehler an.</p> </div> <div class="paragraph"> <p>Denke daran, dass das HTTP-Protokoll diese Daten möglicherweise zusätzlich in einen „chunked transfer“ Code verpackt.</p> </div> </div> </div> <div class="sect4"> <h4 id="_daten_herunterladen">Daten herunterladen</h4> <div class="paragraph"> <p> Wenn du Daten herunterlädst, sind die Prozesse <code>fetch-pack</code> und <code>upload-pack</code> beteiligt. Der Client initiiert einen <code>fetch-Pack</code> Prozess, der eine Verbindung zu einem <code>upload-pack</code> Prozess auf der Remote-Seite herstellt, um auszuhandeln, welche Daten nach übertragen werden sollen.</p> </div> <div class="sect5"> <h6 id="_ssh_2">SSH</h6> <div class="paragraph"> <p>Wenn du den Abruf über SSH ausführst, führt <code>fetch-pack</code> in etwa Folgendes aus:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ ssh -x git@server "git-upload-pack 'simplegit-progit.git'"</code></pre> </div> </div> <div class="paragraph"> <p>Nachdem <code>fetch-pack</code> eine Verbindung hergestellt hat, sendet <code>upload-pack</code> in etwas Folgendes zurück:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>00dfca82a6dff817ec66f44342007202690a93763949 HEAD□multi_ack thin-pack \ side-band side-band-64k ofs-delta shallow no-progress include-tag \ multi_ack_detailed symref=HEAD:refs/heads/master \ agent=git/2:2.1.1+github-607-gfba4028 003fe2409a098dc3e53539a9028a94b6224db9d6a6b6 refs/heads/master 0000</code></pre> </div> </div> <div class="paragraph"> <p>Dies ist sehr ähnlich zu dem, was <code>receive-pack</code> antwortet, aber die Einsatzmöglichkeiten sind unterschiedlich. Außerdem wird zurückgesendet, worauf HEAD verweist (<code>symref=HEAD:refs/heads/master</code>), sodass der Client weiß, was er überprüfen muss, wenn es sich um einen Klon handelt.</p> </div> <div class="paragraph"> <p>Zu diesem Punkt prüft der <code>fetch-pack</code> Prozess, über welche Objekte er verfügt, und antwortet mit den Objekten, die er benötigt, indem er „want“ und dann den gewünschten SHA-1 sendet. Es sendet alle Objekte, die es bereits hat, mit „have“ und dann den SHA-1. Am Ende dieser Liste wird „done“ geschrieben, um den `upload-pack“-Prozess einzuleiten, der das packfile mit den benötigten Daten sendet:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>003cwant ca82a6dff817ec66f44342007202690a93763949 ofs-delta 0032have 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 0009done 0000</code></pre> </div> </div> </div> <div class="sect5"> <h6 id="_https_2">HTTP(S)</h6> <div class="paragraph"> <p>Der Handshake für einen Abrufvorgang benötigt zwei HTTP Aufrufe. Das erste ist ein <code>GET</code> zum selben Endpunkt, der im dummen Protokoll verwendet wird:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> GET $GIT_URL/info/refs?service=git-upload-pack 001e# service=git-upload-pack 00e7ca82a6dff817ec66f44342007202690a93763949 HEAD□multi_ack thin-pack \ side-band side-band-64k ofs-delta shallow no-progress include-tag \ multi_ack_detailed no-done symref=HEAD:refs/heads/master \ agent=git/2:2.1.1+github-607-gfba4028 003fca82a6dff817ec66f44342007202690a93763949 refs/heads/master 0000</code></pre> </div> </div> <div class="paragraph"> <p>Dies ist dem Aufrufen von <code>git-upload-pack</code> über eine SSH-Verbindung sehr ähnlich. Der zweite Austausch wird als separater Aufruf ausgeführt:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code>=> POST $GIT_URL/git-upload-pack HTTP/1.0 0032want 0a53e9ddeaddad63ad106860237bbf53411d11a7 0032have 441b40d833fdfa93eb2908e52742248faf0ee993 0000</code></pre> </div> </div> <div class="paragraph"> <p>Auch dies ist das gleiche Format wie oben. Die Antwort auf diese Anfrage zeigt Erfolg oder Fehler an und enthält das packfile.</p> </div> </div> </div> </div> <div class="sect3"> <h3 id="_zusammenfassung_der_protokolle">Zusammenfassung der Protokolle</h3> <div class="paragraph"> <p>Dieser Abschnitt enthält eine sehr grundlegende Übersicht über die Transfer Protokolle. Das Protokoll enthält viele andere Funktionen, wie z.B. <code>multi_ack</code> oder <code>side-band</code>, die jedoch nicht in diesem Buch behandelt werden. Wir haben versucht, dir ein Gefühl für das allgemeine Hin und Her zwischen Client und Server zu vermitteln. Wenn du mehr Informationen diesbezüglich benötigst, solltest du dir den Git-Quellcode ansehen.</p> </div> </div> <div id="nav"><a href="/book/de/v2/Git-Interna-Die-Referenzspezifikation-engl-Refspec">prev</a> | <a href="/book/de/v2/Git-Interna-Wartung-und-Datenwiederherstellung">next</a></div> </div> </div> </div> </div> <footer> <div class="site-source"> <a href="/site">About this site</a><br> Patches, suggestions, and comments are welcome. </div> <div class="sfc-member"> Git is a member of <a href="/sfc">Software Freedom Conservancy</a> </div> </footer> <a href="#top" class="no-js scrollToTop" id="scrollToTop" data-label="Scroll to top"> <img src="/images/icons/chevron-up@2x.png" width="20" height="20" alt="scroll-to-top"/> </a> <script src="/js/jquery-1.7.1.min.js"></script> <script src="/js/jquery-ui-1.8.18.custom.min.js"></script> <script src="/js/jquery.defaultvalue.js"></script> <script src="/js/session.min.js"></script> <script src="/js/application.min.js"></script> </div> </body> </html>