CINXE.COM
Git - Replace (Ersetzen)
<!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 - Replace (Ersetzen)</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-Tools-Replace">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git-Al%c9%99tl%c9%99ri-D%c9%99yi%c5%9fdirm%c9%99k">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-Tools-Replace-Ersetzen">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Herramientas-de-Git-Replace">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Utilitaires-Git-Replace">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%e3%81%95%e3%81%be%e3%81%96%e3%81%be%e3%81%aa%e3%83%84%e3%83%bc%e3%83%ab-Git-%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e7%bd%ae%e3%81%8d%e6%8f%9b%e3%81%88">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git-%eb%8f%84%ea%b5%ac-Replace">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Git-Tools-Vervangen">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/%d0%98%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%8b-Git-%d0%97%d0%b0%d0%bc%d0%b5%d0%bd%d0%b0">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Orodja-Git-Zamenjava">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Mga-Git-na-Kasangkapan-Pagpapalit">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/%d0%86%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b8-Git-%d0%97%d0%b0%d0%bc%d1%96%d0%bd%d0%b0">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e5%b7%a5%e5%85%b7-%e6%9b%bf%e6%8d%a2">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Git-Tools-Replace">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/Git-%d0%90%d0%bb%d0%b0%d1%82%d0%ba%d0%b8-%d0%97%d0%b0%d0%bc%d0%b5%d0%bd%d1%83%d0%b2%d0%b0%d1%9a%d0%b5">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Narz%c4%99dzia-Gita-Replace">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%93%d0%b8%d1%82-%d0%b0%d0%bb%d0%b0%d1%82%d0%b8-%d0%97%d0%b0%d0%bc%d0%b5%d0%bd%d0%b0">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-Tools-Replace">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Git-%e5%b7%a5%e5%85%b7-Replace">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-Tools-Replace">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Git-Tools-Replace" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-Tools-Replace">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-Tools-Replace">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-Tools-Replace">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Git-Tools-Replace">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Ferramentas-do-Git-Replace">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-Tools-Replace">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Git-Nesnesini-De%c4%9fi%c5%9ftirme">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" class="active">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">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>7.13 Git Tools - Replace (Ersetzen)</h1> <div> <h2 id="_replace">Replace (Ersetzen)</h2> <div class="paragraph"> <p>Wie wir bereits betont haben, sind die Objekte in der Objektdatenbank von Git unveränderbar. Git bietet aber eine interessante Möglichkeit, so <em>zu tun, als ob</em> man Objekte in der Datenbank durch andere Objekte ersetzen würde.</p> </div> <div class="paragraph"> <p>Der Befehl <code>replace</code> ermöglicht es dir, ein Objekt in Git zu bestimmen und zu sagen „jedes Mal, wenn ich auf <em>dieses</em> Objekt verweise, behandle es so, als wäre es ein <em>anderes</em> Objekt“. Das wird am häufigsten zum Ersetzen eines Commits in deinem Verlauf durch einen anderen genutzt. Dadurch musst du nicht die gesamte Historie neu aufbauen, wie z.B. mit <code>git filter-branch</code>.</p> </div> <div class="paragraph"> <p>Nehmen wir zum Beispiel an, du hast einen riesigen Code-Verlauf und möchtest dein Repository aufsplitten in eins mit kurzen Verlauf für neue Entwickler und eins mit viel längeren und ausführlicheren Verlauf für Leute, die sich für Data Mining interessieren. Du kannst eine Historie in eine andere einpflanzen, indem du den frühesten Commit in der neuen Zeile durch den neuesten Commit in der älteren Zeile „ersetzt“. Das ist angenehm, weil es bedeutet, dass du nicht wirklich jeden Commit in der neuen Historie neu erstellen musst, wie du es normalerweise tun müsstest, um sie zusammenzufügen (weil die Elternabstammung die SHA-1-Werte beeinflusst).</p> </div> <div class="paragraph"> <p>Probieren wir das einmal aus. Nehmen wir ein vorhandenes Repository, teilen es in zwei Repositorys auf, ein aktuelles und ein altes. Dann untersuchen wir, wie wir sie rekombinieren können, ohne die aktuellen SHA-1-Werte des Repositorys durch <code>replace</code> zu verändern.</p> </div> <div class="paragraph"> <p>Wir werden ein kleines Repository mit fünf einfachen Commits verwenden:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log --oneline ef989d8 Fifth commit c6e1e95 Fourth commit 9c68fdc Third commit 945704c Second commit c1822cf First commit</code></pre> </div> </div> <div class="paragraph"> <p>Wir wollen dieses in zwei unterschiedliche Historien aufteilen. Eine Linie geht von Commit eins bis Commit vier – das wird die historische Linie sein. Die zweite Linie wird nur aus den Commits vier und fünf bestehen – das wird die jüngere Historie sein.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/de/v2/images/replace1.png" alt="replace1"> </div> <div class="title">Abbildung 163. Beispiel Git Historie</div> </div> <div class="paragraph"> <p>Die Erstellung des historischen Verlaufs ist einfach. Wir können einen Branch in den Verlauf einfügen und dann diesen Branch auf den <code>master</code> Branch eines neuen Remote-Repositorys pushen.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git branch history c6e1e95 $ git log --oneline --decorate ef989d8 (HEAD, master) Fifth commit c6e1e95 (history) Fourth commit 9c68fdc Third commit 945704c Second commit c1822cf First commit</code></pre> </div> </div> <div class="imageblock"> <div class="content"> <img src="/book/de/v2/images/replace2.png" alt="replace2"> </div> <div class="title">Abbildung 164. Erstellen eines neuen <code>history</code> Branches</div> </div> <div class="paragraph"> <p>Jetzt können wir den neuen Branch <code>history</code> in den <code>master</code> Branch unseres neuen Repositorys pushen:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git remote add project-history https://github.com/schacon/project-history $ git push project-history history:master Counting objects: 12, done. Delta compression using up to 2 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (12/12), 907 bytes, done. Total 12 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (12/12), done. To git@github.com:schacon/project-history.git * [new branch] history -> master</code></pre> </div> </div> <div class="paragraph"> <p>Damit ist unsere Historie veröffentlicht. Nun ist der schwierigere Teil, unsere jüngere Historie nach hinten zu kürzen, damit sie kleiner wird. Wir brauchen eine Überlappung, damit wir einen Commit in der einen durch einen gleichwertigen Commit in der anderen ersetzen können. Deshalb werden wir diesen Teil auf die Commits vier und fünf kürzen (so dass sich Commit vier überlappt).</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log --oneline --decorate ef989d8 (HEAD, master) Fifth commit c6e1e95 (history) Fourth commit 9c68fdc Third commit 945704c Second commit c1822cf First commit</code></pre> </div> </div> <div class="paragraph"> <p>In diesem Fall ist es nützlich, einen Basis-Commit zu erstellen, der Anweisungen zum Erweitern der Historie enthält, damit andere Entwickler wissen, was zu tun ist, wenn sie auf den ersten Commit in der getrennten Historie treffen und mehr brauchen. Was wir also vornehmen werden, ist ein erstes Commit-Objekt als unseren Basispunkt mit Anweisungen zu erstellen und dann die restlichen Commits (vier und fünf) darauf zu rebasen.</p> </div> <div class="paragraph"> <p>Dazu müssen wir einen Punkt wählen, an dem wir abspalten möchten, der in unserem Beispiel der dritte Commit ist. Er lautet <code>9c68fdc</code> im SHA-Vokabular. Unser Basis-Commit wird also auf diesem Baum basieren. Wir können unseren Basis-Commit mit dem Befehl <code>commit-tree</code> erstellen, der einfach einen Baum nimmt und uns ein brandneues, elternloses SHA-1-Commit-Objekt zurückgibt.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'Get history from blah blah blah' | git commit-tree 9c68fdc^{tree} 622e88e9cbfbacfb75b5279245b9fb38dfea10cf</code></pre> </div> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Anmerkung</div> </td> <td class="content"> <div class="paragraph"> <p>Das Kommando <code>commit-tree</code> gehört zu einer Reihe von Befehlen, die allgemein als „Basis“-Befehle (engl. 'plumbing' commands) bezeichnet werden. Diese Befehle sind im Allgemeinen nicht für den direkten Einsatz gedacht, sondern werden, eingebettet in <strong>andere</strong> Git-Befehle, um kleinere Aufgaben verwendet. Wenn wir bei derartigen Gelegenheiten etwas Ungewöhnliches durchführen müssen, dann erlauben sie uns, echte low-level Aufgaben zu erledigen, sind aber nicht für den täglichen Gebrauch gedacht. Du kannst mehr über Basisbefehle in <a href="/book/de/v2/ch00/_plumbing_porcelain">Basisbefehle und Standardbefehle (Plumbing and Porcelain)</a> nachlesen.</p> </div> </td> </tr> </table> </div> <div class="imageblock"> <div class="content"> <img src="/book/de/v2/images/replace3.png" alt="replace3"> </div> <div class="title">Abbildung 165. Erstellen eines Basis-Commits mit <code>commit-tree</code> </div> </div> <div class="paragraph"> <p>Jetzt, wo wir einen Basis-Commit haben, können wir den Rest unseres Verlaufs mit <code>git rebase --onto</code> darauf rebasen. Das Argument <code>--onto</code> ist der SHA-1, den wir gerade von <code>commit-tree</code> zurückbekommen haben. Der Rebase-Punkt wird der dritte Commit sein (das Elternteil des ersten Commits, den wir behalten wollen, <code>9c68fdc</code>):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git rebase --onto 622e88 9c68fdc First, rewinding head to replay your work on top of it... Applying: fourth commit Applying: fifth commit</code></pre> </div> </div> <div class="imageblock"> <div class="content"> <img src="/book/de/v2/images/replace4.png" alt="replace4"> </div> <div class="title">Abbildung 166. Rebasen der Historie auf den Basis-Commit</div> </div> <div class="paragraph"> <p>Nun haben wir also unseren jüngsten Verlauf auf einer Übergabebasis neu geschrieben, die jetzt Anweisungen enthält, wie wir die gesamte Historie rekonstruieren könnten, wenn wir es wollen. Wir können diesen neuen Verlauf auf ein neues Projekt übertragen. Wenn die Anwender jetzt dieses Repository klonen, sehen sie nur die beiden letzten Commits und dann einen Basis-Commit mit Anweisungen.</p> </div> <div class="paragraph"> <p>Lass uns nun die Rolle tauschen mit jemandem, der das Projekt zum ersten Mal klont und den gesamten Verlauf des Projekts haben will. Um die Verlaufsdaten nach dem Klonen dieses abgetrennten Repositorys zu erhalten, müsste man einen zweiten Remote für das historische Repository hinzufügen und fetchen:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git clone https://github.com/schacon/project $ cd project $ git log --oneline master e146b5f Fifth commit 81a708d Fourth commit 622e88e Get history from blah blah blah $ git remote add project-history https://github.com/schacon/project-history $ git fetch project-history From https://github.com/schacon/project-history * [new branch] master -> project-history/master</code></pre> </div> </div> <div class="paragraph"> <p>Nun würde die andere Person deine jüngsten Commits im <code>master</code> Branch und die historischen Commits im <code>project-history/master</code> Branch erhalten.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log --oneline master e146b5f Fifth commit 81a708d Fourth commit 622e88e Get history from blah blah blah $ git log --oneline project-history/master c6e1e95 Fourth commit 9c68fdc Third commit 945704c Second commit c1822cf First commit</code></pre> </div> </div> <div class="paragraph"> <p>Um sie zu vereinen, kannst du einfach <code>git replace</code> mit dem Commit, den du ersetzen willst, und dann den Commit, mit dem du ihn ersetzen willst, aufrufen. Wir wollen also den „vierten“ Commit im <code>master</code> Branch durch den "vierten" Commit im <code>project-history/master</code> Branch ersetzen:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git replace 81a708d c6e1e95</code></pre> </div> </div> <div class="paragraph"> <p>Wenn man sich nun den Verlauf des <code>master</code> Branch anschaut, sieht er so aus:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log --oneline master e146b5f Fifth commit 81a708d Fourth commit 9c68fdc Third commit 945704c Second commit c1822cf First commit</code></pre> </div> </div> <div class="paragraph"> <p>Klasse, oder? Ohne alle SHA-1s im Upstream ändern zu müssen, konnten wir einen Commit in unserer Historie durch einen ganz anderen ersetzen, und alle normalen Werkzeuge (<code>bisect</code>, <code>blame</code>, usw.) werden so funktionieren, wie wir es erwarten.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/de/v2/images/replace5.png" alt="replace5"> </div> <div class="title">Abbildung 167. Kombinieren der Commits mit <code>git replace</code> </div> </div> <div class="paragraph"> <p>Interessanterweise zeigt das Protokoll ('log') immer noch <code>81a708d</code> als SHA-1 an, obwohl es tatsächlich die <code>c6e1e95</code>-Commit-Daten verwendet, durch die wir es ersetzt haben. Selbst wenn du einen Befehl wie <code>cat-file</code> ausführst, zeigt er dir die ersetzten Daten an:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p 81a708d tree 7bc544cf438903b65ca9104a1e30345eee6c083d parent 9c68fdceee073230f19ebb8b5e7fc71b479c0252 author Scott Chacon <schacon@gmail.com> 1268712581 -0700 committer Scott Chacon <schacon@gmail.com> 1268712581 -0700 fourth commit</code></pre> </div> </div> <div class="paragraph"> <p>Vergiss nicht, dass das eigentliche Elternteil von <code>81a708d</code> unser Platzhalter-Commit (<code>622e88e</code>) war, nicht <code>9c68fdce</code>, wie es hier steht.</p> </div> <div class="paragraph"> <p>Interessant ist, dass diese Daten in unseren Referenzen gespeichert sind:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git for-each-ref e146b5f14e79d4935160c0e83fb9ebe526b8da0d commit refs/heads/master c6e1e95051d41771a649f3145423f8809d1a74d4 commit refs/remotes/history/master e146b5f14e79d4935160c0e83fb9ebe526b8da0d commit refs/remotes/origin/HEAD e146b5f14e79d4935160c0e83fb9ebe526b8da0d commit refs/remotes/origin/master c6e1e95051d41771a649f3145423f8809d1a74d4 commit refs/replace/81a708dd0e167a3f691541c7a6463343bc457040</code></pre> </div> </div> <div class="paragraph"> <p>Das bedeutet, dass es einfach ist, unseren Ersatz mit anderen zu teilen, weil wir diesen auf unseren Server pushen können und andere Anwender ihn leicht herunterladen können. Das ist in dem Szenario zur Verlaufsoptimierung, das wir hier durchgespielt haben, nicht so hilfreich (da jeder sowieso beide Historien herunterladen würde. Warum also beide trennen?). Es kann aber unter anderen Umständen sinnvoll sein.</p> </div> <div id="nav"><a href="/book/de/v2/Git-Tools-Bundling">prev</a> | <a href="/book/de/v2/Git-Tools-Anmeldeinformationen-speichern">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>