CINXE.COM

Git - Grenflytt

<!DOCTYPE html> <html lang="sv"> <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 - Grenflytt</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-Branching-Rebasing">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git%e2%80%99d%c9%99-Branch-Rebasing">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg/v2/%d0%9a%d0%bb%d0%be%d0%bd%d0%be%d0%b2%d0%b5-%d0%b2-Git-%d0%a3%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bd%d0%b0-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-Branching-Rebasing">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Ramificaciones-en-Git-Reorganizar-el-Trabajo-Realizado">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Les-branches-avec-Git-Rebaser-Rebasing">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%83%96%e3%83%a9%e3%83%b3%e3%83%81%e6%a9%9f%e8%83%bd-%e3%83%aa%e3%83%99%e3%83%bc%e3%82%b9">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git-%eb%b8%8c%eb%9e%9c%ec%b9%98-Rebase-%ed%95%98%ea%b8%b0">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Branchen-in-Git-Rebasen">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/%d0%92%d0%b5%d1%82%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b2-Git-%d0%9f%d0%b5%d1%80%d0%b5%d0%b1%d0%b0%d0%b7%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Veje-Git-Ponovno-baziranje">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Pag-branch-ng-Git-Pag-rebase">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/%d0%93%d0%b0%d0%bb%d1%83%d0%b6%d0%b5%d0%bd%d0%bd%d1%8f-%d0%b2-git-%d0%9f%d0%b5%d1%80%d0%b5%d0%b1%d0%b0%d0%b7%d0%be%d0%b2%d1%83%d0%b2%d0%b0%d0%bd%d0%bd%d1%8f">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e5%88%86%e6%94%af-%e5%8f%98%e5%9f%ba">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/V%c4%9btve-v-syst%c3%a9mu-Git-P%c5%99eskl%c3%a1d%c3%a1n%c3%ad">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/%d0%93%d1%80%d0%b0%d0%bd%d0%b5%d1%9a%d0%b5-%d0%b2%d0%be-Git-%d0%a0%d0%b5%d0%b1%d0%b0%d0%b7%d0%b0">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Ga%c5%82%c4%99zie-Gita-Zmiana-bazy">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%93%d1%80%d0%b0%d0%bd%d0%b0%d1%9a%d0%b5-%d1%83-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d1%83-%d0%93%d0%b8%d1%82-%d0%a0%d0%b5%d0%b1%d0%b0%d0%b7%d0%b8%d1%80%d0%b0%d1%9a%d0%b5">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-%d0%b4%d0%b0-%d1%82%d0%b0%d1%80%d0%bc%d0%be%d2%9b%d0%bb%d0%b0%d0%bd%d0%b8%d1%88-%d2%9a%d0%b0%d0%b9%d1%82%d0%b0-%d0%b0%d1%81%d0%be%d1%81%d0%bb%d0%b0%d0%bd%d0%b8%d1%88">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/%e4%bd%bf%e7%94%a8-Git-%e5%88%86%e6%94%af-%e8%a1%8d%e5%90%88">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-Branching-Rebasing">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/%d8%b4%d8%a7%d8%ae%d9%87%e2%80%8c%d8%b3%d8%a7%d8%b2%db%8c-%d8%af%d8%b1-%da%af%db%8c%d8%aa-%d8%b1%db%8c%d8%a8%db%8c%d8%b3%e2%80%8c%da%a9%d8%b1%d8%af%d9%86" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-Branching-Rebasing">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-Branching-Rebasing">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-Branching-Rebasing">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Branches-no-Git-Rebase">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Ramifica%c3%a7%c3%a3o-do-Git-Rebasing">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-f%c3%b6rgreningar-Grenflytt">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Git-Dallar%c4%b1-Yeniden-Temelleme-rebase">Türkçe</a>.</td></tr> </table> </p> <hr class="sidebar"/> <p> The source of this book is <a href="https://github.com/progit2-sv/progit2">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/sv/v2/Kom-ig%c3%a5ng-Om-versionshantering">Kom igång</a></h2> <ol> <li> 1.1 <a href="/book/sv/v2/Kom-ig%c3%a5ng-Om-versionshantering">Om versionshantering</a> </li> <li> 1.2 <a href="/book/sv/v2/Kom-ig%c3%a5ng-En-kort-historik-av-Git">En kort historik av Git</a> </li> <li> 1.3 <a href="/book/sv/v2/Kom-ig%c3%a5ng-Vad-%c3%a4r-Git%3F">Vad är Git?</a> </li> <li> 1.4 <a href="/book/sv/v2/Kom-ig%c3%a5ng-Kommandoraden">Kommandoraden</a> </li> <li> 1.5 <a href="/book/sv/v2/Kom-ig%c3%a5ng-Installera-Git">Installera Git</a> </li> <li> 1.6 <a href="/book/sv/v2/Kom-ig%c3%a5ng-Anv%c3%a4nda-Git-f%c3%b6r-f%c3%b6rsta-g%c3%a5ngen">Använda Git för första gången</a> </li> <li> 1.7 <a href="/book/sv/v2/Kom-ig%c3%a5ng-F%c3%a5-hj%c3%a4lp">Få hjälp</a> </li> <li> 1.8 <a href="/book/sv/v2/Kom-ig%c3%a5ng-Sammanfattning">Sammanfattning</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/sv/v2/Grunder-i-Git-Skaffa-ett-Git-f%c3%b6rvar">Grunder i Git</a></h2> <ol> <li> 2.1 <a href="/book/sv/v2/Grunder-i-Git-Skaffa-ett-Git-f%c3%b6rvar">Skaffa ett Git-förvar</a> </li> <li> 2.2 <a href="/book/sv/v2/Grunder-i-Git-Spara-%c3%a4ndringar-till-f%c3%b6rvaret">Spara ändringar till förvaret</a> </li> <li> 2.3 <a href="/book/sv/v2/Grunder-i-Git-Visa-historiken">Visa historiken</a> </li> <li> 2.4 <a href="/book/sv/v2/Grunder-i-Git-%c3%85ngra-saker">Ångra saker</a> </li> <li> 2.5 <a href="/book/sv/v2/Grunder-i-Git-Jobba-med-fj%c3%a4rrf%c3%b6rvar">Jobba med fjärrförvar</a> </li> <li> 2.6 <a href="/book/sv/v2/Grunder-i-Git-Taggning">Taggning</a> </li> <li> 2.7 <a href="/book/sv/v2/Grunder-i-Git-Git-alias">Git alias</a> </li> <li> 2.8 <a href="/book/sv/v2/Grunder-i-Git-Sammanfattning">Sammanfattning</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/sv/v2/Git-f%c3%b6rgreningar-Grenar-i-ett-n%c3%b6tskal">Git förgreningar</a></h2> <ol> <li> 3.1 <a href="/book/sv/v2/Git-f%c3%b6rgreningar-Grenar-i-ett-n%c3%b6tskal">Grenar i ett nötskal</a> </li> <li> 3.2 <a href="/book/sv/v2/Git-f%c3%b6rgreningar-Grundl%c3%a4ggande-f%c3%b6rgrening-och-sammanslagning">Grundläggande förgrening och sammanslagning</a> </li> <li> 3.3 <a href="/book/sv/v2/Git-f%c3%b6rgreningar-Hantera-grenar">Hantera grenar</a> </li> <li> 3.4 <a href="/book/sv/v2/Git-f%c3%b6rgreningar-Arbetsfl%c3%b6de-med-grenar">Arbetsflöde med grenar</a> </li> <li> 3.5 <a href="/book/sv/v2/Git-f%c3%b6rgreningar-Fj%c3%a4rrgrenar">Fjärrgrenar</a> </li> <li> 3.6 <a href="/book/sv/v2/Git-f%c3%b6rgreningar-Grenflytt" class="active">Grenflytt</a> </li> <li> 3.7 <a href="/book/sv/v2/Git-f%c3%b6rgreningar-Sammanfattning">Sammanfattning</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/sv/v2/Git-p%c3%a5-servern-Protokollen">Git på servern</a></h2> <ol> <li> 4.1 <a href="/book/sv/v2/Git-p%c3%a5-servern-Protokollen">Protokollen</a> </li> <li> 4.2 <a href="/book/sv/v2/Git-p%c3%a5-servern-Skaffa-Git-p%c3%a5-en-server">Skaffa Git på en server</a> </li> <li> 4.3 <a href="/book/sv/v2/Git-p%c3%a5-servern-Generera-din-publika-SSH-nyckel">Generera din publika SSH-nyckel</a> </li> <li> 4.4 <a href="/book/sv/v2/Git-p%c3%a5-servern-Konvigurera-servern">Konvigurera servern</a> </li> <li> 4.5 <a href="/book/sv/v2/Git-p%c3%a5-servern-Git-Daemonen">Git Daemonen</a> </li> <li> 4.6 <a href="/book/sv/v2/Git-p%c3%a5-servern-Smart-HTTP">Smart HTTP</a> </li> <li> 4.7 <a href="/book/sv/v2/Git-p%c3%a5-servern-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/sv/v2/Git-p%c3%a5-servern-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/sv/v2/Git-p%c3%a5-servern-Alternativ-tillhandah%c3%a5llna-av-tredje-part">Alternativ tillhandahållna av tredje part</a> </li> <li> 4.10 <a href="/book/sv/v2/Git-p%c3%a5-servern-Sammanfattning">Sammanfattning</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/sv/v2/Distribuerade-Git-Distribuerade-arbetsfl%c3%b6den">Distribuerade Git</a></h2> <ol> <li> 5.1 <a href="/book/sv/v2/Distribuerade-Git-Distribuerade-arbetsfl%c3%b6den">Distribuerade arbetsflöden</a> </li> <li> 5.2 <a href="/book/sv/v2/Distribuerade-Git-Medverka-i-ett-projekt">Medverka i ett projekt</a> </li> <li> 5.3 <a href="/book/sv/v2/Distribuerade-Git-Underh%c3%a5lla-ett-projekt">Underhålla ett projekt</a> </li> <li> 5.4 <a href="/book/sv/v2/Distribuerade-Git-Sammanfattning">Sammanfattning</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/sv/v2/GitHub-Account-Setup-and-Configuration">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/sv/v2/GitHub-Account-Setup-and-Configuration">Account Setup and Configuration</a> </li> <li> 6.2 <a href="/book/sv/v2/GitHub-Contributing-to-a-Project">Contributing to a Project</a> </li> <li> 6.3 <a href="/book/sv/v2/GitHub-Maintaining-a-Project">Maintaining a Project</a> </li> <li> 6.4 <a href="/book/sv/v2/GitHub-Managing-an-organization">Managing an organization</a> </li> <li> 6.5 <a href="/book/sv/v2/GitHub-Scripting-GitHub">Scripting GitHub</a> </li> <li> 6.6 <a href="/book/sv/v2/GitHub-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/sv/v2/Git-Tools-Revision-Selection">Git Tools</a></h2> <ol> <li> 7.1 <a href="/book/sv/v2/Git-Tools-Revision-Selection">Revision Selection</a> </li> <li> 7.2 <a href="/book/sv/v2/Git-Tools-Interactive-Staging">Interactive Staging</a> </li> <li> 7.3 <a href="/book/sv/v2/Git-Tools-Stashing-and-Cleaning">Stashing and Cleaning</a> </li> <li> 7.4 <a href="/book/sv/v2/Git-Tools-Signing-Your-Work">Signing Your Work</a> </li> <li> 7.5 <a href="/book/sv/v2/Git-Tools-Searching">Searching</a> </li> <li> 7.6 <a href="/book/sv/v2/Git-Tools-Rewriting-History">Rewriting History</a> </li> <li> 7.7 <a href="/book/sv/v2/Git-Tools-Reset-Demystified">Reset Demystified</a> </li> <li> 7.8 <a href="/book/sv/v2/Git-Tools-Advanced-Merging">Advanced Merging</a> </li> <li> 7.9 <a href="/book/sv/v2/Git-Tools-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/sv/v2/Git-Tools-Debugging-with-Git">Debugging with Git</a> </li> <li> 7.11 <a href="/book/sv/v2/Git-Tools-Submodules">Submodules</a> </li> <li> 7.12 <a href="/book/sv/v2/Git-Tools-Bundling">Bundling</a> </li> <li> 7.13 <a href="/book/sv/v2/Git-Tools-Replace">Replace</a> </li> <li> 7.14 <a href="/book/sv/v2/Git-Tools-Credential-Storage">Credential Storage</a> </li> <li> 7.15 <a href="/book/sv/v2/Git-Tools-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/sv/v2/Customizing-Git-Git-Configuration">Customizing Git</a></h2> <ol> <li> 8.1 <a href="/book/sv/v2/Customizing-Git-Git-Configuration">Git Configuration</a> </li> <li> 8.2 <a href="/book/sv/v2/Customizing-Git-Git-Attributes">Git Attributes</a> </li> <li> 8.3 <a href="/book/sv/v2/Customizing-Git-Git-Hooks">Git Hooks</a> </li> <li> 8.4 <a href="/book/sv/v2/Customizing-Git-An-Example-Git-Enforced-Policy">An Example Git-Enforced Policy</a> </li> <li> 8.5 <a href="/book/sv/v2/Customizing-Git-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/sv/v2/Git-and-Other-Systems-Git-as-a-Client">Git and Other Systems</a></h2> <ol> <li> 9.1 <a href="/book/sv/v2/Git-and-Other-Systems-Git-as-a-Client">Git as a Client</a> </li> <li> 9.2 <a href="/book/sv/v2/Git-and-Other-Systems-Migrating-to-Git">Migrating to Git</a> </li> <li> 9.3 <a href="/book/sv/v2/Git-and-Other-Systems-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/sv/v2/Git-Internals-Plumbing-and-Porcelain">Git Internals</a></h2> <ol> <li> 10.1 <a href="/book/sv/v2/Git-Internals-Plumbing-and-Porcelain">Plumbing and Porcelain</a> </li> <li> 10.2 <a href="/book/sv/v2/Git-Internals-Git-Objects">Git Objects</a> </li> <li> 10.3 <a href="/book/sv/v2/Git-Internals-Git-References">Git References</a> </li> <li> 10.4 <a href="/book/sv/v2/Git-Internals-Packfiles">Packfiles</a> </li> <li> 10.5 <a href="/book/sv/v2/Git-Internals-The-Refspec">The Refspec</a> </li> <li> 10.6 <a href="/book/sv/v2/Git-Internals-Transfer-Protocols">Transfer Protocols</a> </li> <li> 10.7 <a href="/book/sv/v2/Git-Internals-Maintenance-and-Data-Recovery">Maintenance and Data Recovery</a> </li> <li> 10.8 <a href="/book/sv/v2/Git-Internals-Environment-Variables">Environment Variables</a> </li> <li> 10.9 <a href="/book/sv/v2/Git-Internals-Summary">Summary</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/sv/v2/Bilaga-A:-Git-in-Other-Environments-Graphical-Interfaces">Bilaga A: Git in Other Environments</a></h2> <ol> <li> A1.1 <a href="/book/sv/v2/Bilaga-A:-Git-in-Other-Environments-Graphical-Interfaces">Graphical Interfaces</a> </li> <li> A1.2 <a href="/book/sv/v2/Bilaga-A:-Git-in-Other-Environments-Git-in-Visual-Studio">Git in Visual Studio</a> </li> <li> A1.3 <a href="/book/sv/v2/Bilaga-A:-Git-in-Other-Environments-Git-in-Eclipse">Git in Eclipse</a> </li> <li> A1.4 <a href="/book/sv/v2/Bilaga-A:-Git-in-Other-Environments-Git-in-Bash">Git in Bash</a> </li> <li> A1.5 <a href="/book/sv/v2/Bilaga-A:-Git-in-Other-Environments-Git-in-Zsh">Git in Zsh</a> </li> <li> A1.6 <a href="/book/sv/v2/Bilaga-A:-Git-in-Other-Environments-Git-in-PowerShell">Git in PowerShell</a> </li> <li> A1.7 <a href="/book/sv/v2/Bilaga-A:-Git-in-Other-Environments-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/sv/v2/Bilaga-B:-Embedding-Git-in-your-Applications-Command-line-Git">Bilaga B: Embedding Git in your Applications</a></h2> <ol> <li> A2.1 <a href="/book/sv/v2/Bilaga-B:-Embedding-Git-in-your-Applications-Command-line-Git">Command-line Git</a> </li> <li> A2.2 <a href="/book/sv/v2/Bilaga-B:-Embedding-Git-in-your-Applications-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/sv/v2/Bilaga-B:-Embedding-Git-in-your-Applications-JGit">JGit</a> </li> <li> A2.4 <a href="/book/sv/v2/Bilaga-B:-Embedding-Git-in-your-Applications-go-git">go-git</a> </li> <li> A2.5 <a href="/book/sv/v2/Bilaga-B:-Embedding-Git-in-your-Applications-Dulwich">Dulwich</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Setup-and-Config">Bilaga C: Git Commands</a></h2> <ol> <li> A3.1 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Setup-and-Config">Setup and Config</a> </li> <li> A3.2 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Getting-and-Creating-Projects">Getting and Creating Projects</a> </li> <li> A3.3 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Basic-Snapshotting">Basic Snapshotting</a> </li> <li> A3.4 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Branching-and-Merging">Branching and Merging</a> </li> <li> A3.5 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Sharing-and-Updating-Projects">Sharing and Updating Projects</a> </li> <li> A3.6 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Inspection-and-Comparison">Inspection and Comparison</a> </li> <li> A3.7 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Debugging">Debugging</a> </li> <li> A3.8 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Patching">Patching</a> </li> <li> A3.9 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Email">Email</a> </li> <li> A3.10 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-External-Systems">External Systems</a> </li> <li> A3.11 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Administration">Administration</a> </li> <li> A3.12 <a href="/book/sv/v2/Bilaga-C:-Git-Commands-Plumbing-Commands">Plumbing Commands</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>3.6 Git förgreningar - Grenflytt</h1> <div> <h2 id="_rebasing">Grenflytt</h2> <div class="paragraph"> <p> I Git finns i huvusak två sätt att integrera ändringar från en gren in i en annan: sammanslagning (<code>merge</code>) eller grenflytt (<code>rebase</code>). I detta avsnitt kokker du får lära dig vad en grenflytt är, hur man gör det och varför det är ett ganska häpnadsväckande verktyg, samt i vilka fall du inte vill använda det.</p> </div> <div class="sect3"> <h3 id="_den_grundläggande_grenflytten">Den grundläggande grenflytten</h3> <div class="paragraph"> <p>Om du går tillbaks till ett tidigare exempel från <a href="/book/sv/v2/ch00/_basic_merging">Grundläggande sammanslagning</a>, kan du se att du divergerade ditt arbete och gjorde versioner på två olika grenar.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/basic-rebase-1.png" alt="Enkel divergent historik."> </div> <div class="title">Figur 35. Enkel divergent historik</div> </div> <div class="paragraph"> <p>Det änklaste sättet att integrera grenar är, som vi redan gått igenom, kommandot <code>merge</code>. Den genomför en trevägssammanslagning mellan de två senaste ögonblicksbilderna (<code>C3</code> och <code>C4</code>) och den senaste gemensamma versionen av de två grenarna (<code>C2</code>) och skapar en ny ögonblicksbild (och version).</p> </div> <div id="rebasing-merging-example" class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/basic-rebase-2.png" alt="Sammanslagning för att integrera divergerad versionshistorik."> </div> <div class="title">Figur 36. Sammanslagning för att integrera divergerad versionshistorik</div> </div> <div class="paragraph"> <p>Det finns emellertid ett annat sätt: Du kan ta ändringarna som introducerades i <code>C4</code> och tillämpa den på toppen av <code>C3</code>. I Git kallas detta för <em>grenflytt</em> (eng. <em>rebasing</em>). Med kommandot <code>rebase</code> kan du ta alla ändringar som sparats i en gren och spela upp dem på en annan gren.</p> </div> <div class="paragraph"> <p>I detta exemplet kommer du checka ut <code>experiment</code>-grenen och sedan flytta grenen till <code>master</code>-grenen som följer:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout experiment $ git rebase master First, rewinding head to replay your work on top of it... Applying: added staged command</code></pre> </div> </div> <div class="paragraph"> <p>Denna operation fungerar genom att hitta den senaste gemensamma versionen för de två grenarna (den du står på och den du skall flytta din gren till), ta reda på skillnaderna som introducerats i varje version av den gren du står på, spara dessa i temporära filer, peka om den aktuella grenen till toppen av den gren som du skall flytta din aktuella gren till, och sedan applicera ändringarna i turordning.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/basic-rebase-3.png" alt="Flytta ändringarna som introducerats i `C4` på toppen av `C3`."> </div> <div class="title">Figur 37. Flytta ändringarna som introducerats i <code>C4</code> på toppen av <code>C3</code> </div> </div> <div class="paragraph"> <p>Nu kan du gå tillbaka till <code>master</code>-grenen och göra en sammanslagning via snabbspolning.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout master $ git merge experiment</code></pre> </div> </div> <div class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/basic-rebase-4.png" alt="Snabbspolning av master-grenen."> </div> <div class="title">Figur 38. Snabbspolning av master-grenen</div> </div> <div class="paragraph"> <p>Ögonblicksbilden som <code>C4'</code> pekar på är exakt samma som den som <code>C5</code> pekade på i <a href="/book/sv/v2/ch00/rebasing-merging-example">the merge example</a>. Det finns ingen skillnad i slutprodukten av integrationen, men att flytta grenen gör att historiken blir renare. Om du undersöker historiken av en flyttad gren kommer den vara linjär: det verkar som att allt arbete har skett sekvensiellt, trots att det egentligen skedde parallellt.</p> </div> <div class="paragraph"> <p>Ofta vill du göra detta för att säkerställa att dina versioner kan läggas till rent på en fjärrgren — kanske i ett projekt som du försöker bidra till men som du inte underhåller. I detta fall gör du ditt arbete i en gren och sedan flyttar ditt arbet in i <code>origin/master</code> när du är redo att publicera dina ändringar till huvudprojektet. På detta vis behöver inte den som underhåller projektet göra något integrationsarbete — endast snabbspola eller lägga till ändringarna rent.</p> </div> <div class="paragraph"> <p>Notera att ögonblicksbilden som pekas på av den slutliga versionen, oavsett om det är den senaste av de flyttade versionerna för en grenflytt eller den slutliga versionen efter en sammanslagning är samma ögonblicksbild — det är bara historiken som skiljer. Grenflytt spelar upp ändringarna från en arbetshistorik på toppen av en annan i samma ordning de introducerades, medan sammanslagning tar ändpunkterna på varje gren och slår ihop dem.</p> </div> </div> <div class="sect3"> <h3 id="_mer_intressanta_grenflyttar">Mer intressanta grenflyttar</h3> <div class="paragraph"> <p>Du kan också spela upp din historik på något annat än den ursprungliga basgrenen. Ta en historik som <a href="/book/sv/v2/ch00/rbdiag_e">Historik med en gren från en annan gren</a>, till exempel. Du gjorde en gren (<code>server</code>) för att lägga till lite serverfunktionalitet till ditt projekt och skapade en ny version. Därefter gjorde du en gren från denna för att göra motsvarande ändringar hos klienten (<code>client</code>) och gjorde några nya versioner. Slutligen gick du tillvaks till din servergren och gjorde några fler versioner.</p> </div> <div id="rbdiag_e" class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/interesting-rebase-1.png" alt="Historik med en gren från en annan gren."> </div> <div class="title">Figur 39. Historik med en gren från en annan gren</div> </div> <div class="paragraph"> <p>Antag att du beslutar att du vill slå samman din klientfunktionalitet till ditt huvudspår för att frisläppa dem, men att du vill avvakta serverändringarna tills dessa är testade. Du kan ta klietändringarna som inte är på server (<code>C8</code> och <code>C9</code>) och spela upp dem på din <code>master</code> gren genom att använda flaggan <code>--onto</code> till <code>git rebase</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git rebase --onto master server client</code></pre> </div> </div> <div class="paragraph"> <p>Detta betyder i praktiken “Ta <code>client</code> grenen, ta reda på de patchar sedan den divergerade från <code>server</code> grenen, och spela upp dem på <code>klient</code> delen som om de vore baserade direkt från <code>master</code> grenen istället.” Det är lite komplext, men resultatet är rätt häftigt.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/interesting-rebase-2.png" alt="Flytta en gren från en annan gren."> </div> <div class="title">Figur 40. Flytta en gren från en annan gren</div> </div> <div class="paragraph"> <p>Nu kan du snabbspola din <code>master</code> gren (se <a href="/book/sv/v2/ch00/rbdiag_g">Snabbspola din master-gren till att inkludera klientgrenens ändringar</a>):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout master $ git merge client</code></pre> </div> </div> <div id="rbdiag_g" class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/interesting-rebase-3.png" alt="Snabbspola din master-gren till att inkludera klientgrenens ändringar."> </div> <div class="title">Figur 41. Snabbspola din master-gren till att inkludera klientgrenens ändringar</div> </div> <div class="paragraph"> <p>Säg att du beslutar att dra in din servergren också. Du kan spela upp servergrenen på <code>master</code> grenen utan att behöva checka ut den först genom att köra <code>git rebase &lt;basgren&gt; &lt;stickspår&gt;</code> — vilket checkar ut stickspåret (<code>server</code> i detta fall) för dig och spelar up den på basgrenen (<code>master</code>):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git rebase master server</code></pre> </div> </div> <div class="paragraph"> <p>Detta spelar upp ditt arbete i <code>server</code> ovan på ditt arbete i <code>master</code>, som synes i <a href="/book/sv/v2/ch00/rbdiag_h">Flytta din servergren til toppen av din mastergren</a>.</p> </div> <div id="rbdiag_h" class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/interesting-rebase-4.png" alt="Flytta din servergren til toppen av din mastergren."> </div> <div class="title">Figur 42. Flytta din servergren til toppen av din mastergren</div> </div> <div class="paragraph"> <p>Därefter kan du snabbspola din basgren (<code>master</code>):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout master $ git merge server</code></pre> </div> </div> <div class="paragraph"> <p>Du kan ta bort grenarna <code>client</code> och <code>server</code> eftersom allt arbete är integrerat, vilket ger dig en historik för denna process likt <a href="/book/sv/v2/ch00/rbdiag_i">Slutlig versionshistorik</a>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git branch -d client $ git branch -d server</code></pre> </div> </div> <div id="rbdiag_i" class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/interesting-rebase-5.png" alt="Slutlig versionshistorik."> </div> <div class="title">Figur 43. Slutlig versionshistorik</div> </div> </div> <div class="sect3"> <h3 id="_rebase_peril">Farorna med grenflyttar</h3> <div class="paragraph"> <p> Ahh, lyckan med grenflytt är inte helt utan nackdelar, vilka kan sammanfattas i en mening:</p> </div> <div class="paragraph"> <p><strong>Flytta inte versioner som existerar utanför ditt lokala repo som andra kan ha baserat sitt arbete på.</strong></p> </div> <div class="paragraph"> <p>Följer du det tipset så kommer allt gå bra. Om inte, kommer folk hata dig och du kommer att hånas av dina vänner och familj.</p> </div> <div class="paragraph"> <p>När du flyttar om saker överger du existerande versioner och skapar nya som är lika, men annorlunda. Om du publicerar versioner någonstans och andra hämtar dem och baserar arbete på dem och du sedan skriver om historiken med <code>git rebase</code> och publicerar dessa ändringarna igen, kommer dina medarbetare att behöva återintegrera sitt arbete och saker kommer bli krånligt när du försöker integrera deras ändringar i dina.</p> </div> <div class="paragraph"> <p>Låt oss ta ett exempel på hur det kan uppstå problem om du skriver om arbete som du gjort publikt. Antag att du klonar från en central server och sedan gör lite arbete på det. Din versionshistorik ser ut såhär:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/perils-of-rebasing-1.png" alt="Klona ett repo och gör lite jobb på det."> </div> <div class="title">Figur 44. Klona ett repo och gör lite jobb på det</div> </div> <div class="paragraph"> <p>Nu gör någon annan mer arbete som inkluderar en sammanslagning och publicerar det arbetet till den centrala servern. Du hämtar det och slår ihop fjärrgrenen in i ditt arbete vilket gör att din versionshistorik ser ut ungefär såhär:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/perils-of-rebasing-2.png" alt="Hämta fler versioner och slå ihop ändringarna i ditt arbete."> </div> <div class="title">Figur 45. Hämta fler versioner och slå ihop ändringarna i ditt arbete</div> </div> <div class="paragraph"> <p>Sedan bestämmer sig personen som publicerade ändringarna att gå tillbaks och skriva om sin historik istället; de gör <code>git push --force</code> för att skriva över den historik som finns på servern. Du hämtar sedan från den server, och får hem de nya versionerna.</p> </div> <div id="_pre_merge_rebase_work" class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/perils-of-rebasing-3.png" alt="Någon publicerar omskriven historik, och överger versioner på vilka du baserat arbete."> </div> <div class="title">Figur 46. Någon publicerar omskriven historik, och överger versioner på vilka du baserat arbete</div> </div> <div class="paragraph"> <p>Nu sitter ni båda i skiten. Om du gör <code>git pull</code> kommer du skapa en sammanslagningsversion som inkluderar båda versionstidslinjerna, och ditt repo kommer se ut såhär:</p> </div> <div id="_merge_rebase_work" class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/perils-of-rebasing-4.png" alt="Du integrerar samma arbete igen i en ny sammanslagningsversion."> </div> <div class="title">Figur 47. Du integrerar samma arbete igen i en ny sammanslagningsversion</div> </div> <div class="paragraph"> <p>Om du kör <code>git log</code> när din historik ser ut såhär kommer du se två versioner som har samma författare, datum och meddelande, vilket kommer vara förvirrande. Vidare, om du publicerar denna historik tillbaks till servern, kommer du återintroducera alla de tidigare omskrivna versionerna vilket kan förvirra andra också. Man kan vara ganska säker på att den andra utvecklaren inte vill att <code>C4</code> och <code>C6</code> skall vara i historiken; det är därför de skrev om historiken från början.</p> </div> </div> <div class="sect3"> <h3 id="_rebase_rebase">Flytta en gren när du flyttar en gren</h3> <div class="paragraph"> <p>Om du däremot finner att du <strong>är</strong> i en liknande sitiation, så har Git lite ytterligare magi som kan komma väl till pass. Om någon i ditt team trycker ut en ändring som skriver över arbete som du baserar arbete på, blir din utmaning att ta reda på vad som är ditt och vad de har skrivit om.</p> </div> <div class="paragraph"> <p>Det faller sig så att utöver till versionens SHA-1 checksimma, beräknar Git också en checksumma baserat på just den patch som introducerades med versionen. Denna kallas för “patch-id”.</p> </div> <div class="paragraph"> <p>Om du hämtar hem arbete som var omskrivet och gör en egen omskrivning på toppen av versionerna från din kollega, kan Git ofta lista ut vad som är unikt ditt och och applicera dina ändringar ovanpå den nya grenen.</p> </div> <div class="paragraph"> <p>Till exempel, i föregående scenario, om du istället för att slå ihop ändringarna vid <a href="/book/sv/v2/ch00/_pre_merge_rebase_work">Någon publicerar omskriven historik, och överger versioner på vilka du baserat arbete</a> och kör <code>git rebase teamone/master</code>, kommer Git att:</p> </div> <div class="ulist"> <ul> <li> <p>Ta reda på vilket arbete som är unikt för vår gren (C2, C3, C4, C6, C7)</p> </li> <li> <p>Ta reda på vilka som inte är sammanslagningsversioner (C2, C3, C4)</p> </li> <li> <p>Ta reda på vad som inte har skrivits om i målgrenen (bara C2 och C3, eftersom C4 är samma patch som C4')</p> </li> <li> <p>Applicera de ändringarna ovanpå <code>teamone/master</code></p> </li> </ul> </div> <div class="paragraph"> <p>Så istället för resultatet i <a href="/book/sv/v2/ch00/_merge_rebase_work">Du integrerar samma arbete igen i en ny sammanslagningsversion</a> kommer vi få ett slutligt resultat liknande <a href="/book/sv/v2/ch00/_rebase_rebase_work">Grenflytt till toppen av en tvingande publicering av omskriven historik</a>.</p> </div> <div id="_rebase_rebase_work" class="imageblock"> <div class="content"> <img src="/book/sv/v2/images/perils-of-rebasing-5.png" alt="Grenflytt till toppen av en tvingande publicering av omskriven historik."> </div> <div class="title">Figur 48. Grenflytt till toppen av en tvingande publicering av omskriven historik</div> </div> <div class="paragraph"> <p>Detta fungerar bara om C4 och C4' som din kollega gjort är näst intill samma patch. Annars kommer Git inte kunna avgöra att de är duplikat och kommer lägga till ytterligare en C4-lik patch (som förmodligen inte kommer gå att applicera rent, eftersom ändringarna bitvis redan är på plats).</p> </div> <div class="paragraph"> <p>Du kan också förenklad detta genom att köra <code>git pull --rebase</code> istället för en vanlig <code>git pull</code>. Eller så kan du göra det manuellt genom <code>git fetch</code> följt av <code>git rebase teamone/master</code> i detta fallet.</p> </div> <div class="paragraph"> <p>Använder du <code>git pull</code> och vill göra <code>--rebase</code> till normalfallet, kan du sätta konfigureringsparametern <code>pull.rebase</code> med något liknande <code>git config --global pull.rebase true</code>.</p> </div> <div class="paragraph"> <p>Om du nägonsin skriver om historik som bara finns lokalt på din dator kommer du vara helt säker. Om du skriver om historik som är publicerade, men som ingen annan baserat versioner på, kommer du också vara helt säker. Om du skriver om versionshistorik som redan har publicerats publikt, och som folk har baserat arbete på, kommer du hamna i frustrerande trubbel och hånas av dina teammedlemmar.</p> </div> <div class="paragraph"> <p>Om du eller en kollega anser det vara nödvändigt vid något tillfälle, se till att alla vet om att de skall köra <code>git pull --rebase</code> för att göra den efterföljande pinan något lättare.</p> </div> </div> <div class="sect3"> <h3 id="_omskrivning_vs_sammanslagning">Omskrivning vs. Sammanslagning</h3> <div class="paragraph"> <p> Nu när du sett hur omskrivning och sammanslagning fungerar, kanske du undrar vilken som är bäst. Innan vi kan svara på det, låt oss ta ett steg tillbaka och prata om vad historik betyder.</p> </div> <div class="paragraph"> <p>En infallsvinkel på det är att dit repos versionshistorik är en <strong>beskrivning över vad som faktiskt hände.</strong> Det är ett historiskt dokument, värdefull i sig själv, och skall inte manipuleras. Med denna vinkel är ändring av versionshistoriken närmast blasfemi; du <em>ljuger</em> om vad som faktisk skedde. Vad gör det om det är en stökig historik av sammanslagningsversioner? Det var så det hände, och repot skall bevara det för eftervärlden.</p> </div> <div class="paragraph"> <p>En motstående infallsvinkel är att versionshistoriken är <strong>berättelsen av hur ditt projekt skapades.</strong> Du publicerar inte första utkastet av en bok, och manualen för hur du underhåller din mjukvara förtjänar noggrann redigering. Detta är lägret som använder verktyg som omskrivning och filter-grenar för att berätta historien som bäst lämpar sig för framtida läsare.</p> </div> <div class="paragraph"> <p>Nu till frågan huruvida sammanslagning eller omskrivning är bättre: förhoppningsvis inser du att det inte är så enkelt. Git är ett kraftfullt verktyg och tillåter dig att göra många saker med din historik, men alla team och alla projekt är olika. Nu när du vet hur båda dessa verktyg fungerar, är det upp till dig att avgöra vilken metod som är bäst lämpad i din specifika situation.</p> </div> <div class="paragraph"> <p>I allmänhet, för att få det bästa från två världar, är att skriva om lokala ändringar du gjort men ännu inte delat innan du publicerar dem i syfte att rensa upp din historik, men att aldrig skriva om historik du publicerat nånstans.</p> </div> </div> <div id="nav"><a href="/book/sv/v2/Git-förgreningar-Fjärrgrenar">prev</a> | <a href="/book/sv/v2/Git-förgreningar-Sammanfattning">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>

Pages: 1 2 3 4 5 6 7 8 9 10