CINXE.COM

Git - Vzdrževanje projekta

<!DOCTYPE html> <html lang="sl"> <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 - Vzdrževanje projekta</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/Distributed-Git-Maintaining-a-Project">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Paylanm%c4%b1%c5%9f-Git-Layih%c9%99nin-Saxlan%c4%b1lmas%c4%b1">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg/v2/Git-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d0%b8-Stashing-%d0%b8-Cleaning">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Verteiltes-Git-Ein-Projekt-verwalten">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Git-en-entornos-distribuidos-Manteniendo-un-proyecto">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Git-distribu%c3%a9-Maintenance-d%e2%80%99un-projet">Français</a>,</td></tr> <tr><td><a href="/book/gr">Ελληνικά</a>,</td></tr> <tr><td><a href="/book/ja/v2/Git-%e3%81%a7%e3%81%ae%e5%88%86%e6%95%a3%e4%bd%9c%e6%a5%ad-%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%ae%e9%81%8b%e5%96%b6">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/%eb%b6%84%ec%82%b0-%ed%99%98%ea%b2%bd%ec%97%90%ec%84%9c%ec%9d%98-Git-%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8-%ea%b4%80%eb%a6%ac%ed%95%98%ea%b8%b0">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Gedistribueerd-Git-Het-beheren-van-een-project">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/%d0%a0%d0%b0%d1%81%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d1%91%d0%bd%d0%bd%d1%8b%d0%b9-Git-%d0%a1%d0%be%d0%bf%d1%80%d0%be%d0%b2%d0%be%d0%b6%d0%b4%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Porazdeljeni-Git-Vzdr%c5%beevanje-projekta">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Distributed-Git-Maintaining-a-Project">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/%d0%a0%d0%be%d0%b7%d0%bf%d0%be%d0%b4%d1%96%d0%bb%d0%b5%d0%bd%d0%b8%d0%b9-Git-%d0%a1%d1%83%d0%bf%d1%80%d0%be%d0%b2%d0%be%d0%b4%d0%b6%d1%83%d0%b2%d0%b0%d0%bd%d0%bd%d1%8f-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d1%83">Українська</a>,</td></tr> <tr><td><a href="/book/zh/v2/%e5%88%86%e5%b8%83%e5%bc%8f-Git-%e7%bb%b4%e6%8a%a4%e9%a1%b9%e7%9b%ae">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Distribuovan%c3%bd-Git-Spr%c3%a1va-projektu">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/%d0%94%d0%b8%d1%81%d1%82%d1%80%d0%b8%d0%b1%d1%83%d0%b8%d1%80%d0%b0%d0%bd-Git-%d0%9f%d1%80%d0%b8%d0%b2%d0%b0%d1%82%d0%b5%d0%bd-%d0%bc%d0%b0%d0%bb-%d1%82%d0%b8%d0%bc">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Rozproszony-Git-Utrzymywanie-projektu">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%94%d0%b8%d1%81%d1%82%d1%80%d0%b8%d0%b1%d1%83%d0%b8%d1%80%d0%b0%d0%bd%d0%b8-%d0%93%d0%b8%d1%82-%d0%9e%d0%b4%d1%80%d0%b6%d0%b0%d0%b2%d0%b0%d1%9a%d0%b5-%d0%bf%d1%80%d0%be%d1%98%d0%b5%d0%ba%d1%82%d0%b0">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Distributed-Git-Maintaining-a-Project">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/%e5%88%86%e6%95%a3%e5%bc%8f%e7%9a%84-Git-%e7%b6%ad%e8%ad%b7%e4%b8%80%e5%80%8b%e5%b0%88%e6%a1%88">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Distributed-Git-Maintaining-a-Project">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/%da%af%db%8c%d8%aa-%d8%aa%d9%88%d8%b2%db%8c%d8%b9%e2%80%8c%d8%b4%d8%af%d9%87-%d9%86%da%af%d9%87%d8%af%d8%a7%d8%b1%db%8c-%db%8c%da%a9-%d9%be%d8%b1%d9%88%da%98%d9%87" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Distributed-Git-Maintaining-a-Project">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Distributed-Git-Maintaining-a-Project">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Distributed-Git-Maintaining-a-Project">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Distributed-Git-Maintaining-a-Project">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Git-Distribu%c3%addo-Maintaining-a-Project">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Distribuerade-Git-Underh%c3%a5lla-ett-projekt">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-Bir-Projeyi-Y%c3%bcr%c3%bctme">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-sl">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/sl/v2/Za%c4%8detek-O-nadzoru-razli%c4%8dic">Začetek</a></h2> <ol> <li> 1.1 <a href="/book/sl/v2/Za%c4%8detek-O-nadzoru-razli%c4%8dic">O nadzoru različic</a> </li> <li> 1.2 <a href="/book/sl/v2/Za%c4%8detek-Kratka-zgodovina-Gita">Kratka zgodovina Gita</a> </li> <li> 1.3 <a href="/book/sl/v2/Za%c4%8detek-Kaj-je-Git%3F">Kaj je Git?</a> </li> <li> 1.4 <a href="/book/sl/v2/Za%c4%8detek-Ukazna-vrstica">Ukazna vrstica</a> </li> <li> 1.5 <a href="/book/sl/v2/Za%c4%8detek-Namestitev-Gita">Namestitev Gita</a> </li> <li> 1.6 <a href="/book/sl/v2/Za%c4%8detek-Prva-nastavitev-Gita">Prva nastavitev Gita</a> </li> <li> 1.7 <a href="/book/sl/v2/Za%c4%8detek-Pridobivanje-pomo%c4%8di">Pridobivanje pomoči</a> </li> <li> 1.8 <a href="/book/sl/v2/Za%c4%8detek-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/sl/v2/Osnove-Git-Pridobivanje-repozitorija-Git">Osnove Git</a></h2> <ol> <li> 2.1 <a href="/book/sl/v2/Osnove-Git-Pridobivanje-repozitorija-Git">Pridobivanje repozitorija Git</a> </li> <li> 2.2 <a href="/book/sl/v2/Osnove-Git-Snemanje-sprememb-v-repozitorij">Snemanje sprememb v repozitorij</a> </li> <li> 2.3 <a href="/book/sl/v2/Osnove-Git-Pregled-zgodovine-potrditev">Pregled zgodovine potrditev</a> </li> <li> 2.4 <a href="/book/sl/v2/Osnove-Git-Razveljavljanje-stvari">Razveljavljanje stvari</a> </li> <li> 2.5 <a href="/book/sl/v2/Osnove-Git-Delo-z-daljavami">Delo z daljavami</a> </li> <li> 2.6 <a href="/book/sl/v2/Osnove-Git-Ozna%c4%8devanje">Označevanje</a> </li> <li> 2.7 <a href="/book/sl/v2/Osnove-Git-Aliasi-Git">Aliasi Git</a> </li> <li> 2.8 <a href="/book/sl/v2/Osnove-Git-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/sl/v2/Veje-Git-Veje-na-kratko">Veje Git</a></h2> <ol> <li> 3.1 <a href="/book/sl/v2/Veje-Git-Veje-na-kratko">Veje na kratko</a> </li> <li> 3.2 <a href="/book/sl/v2/Veje-Git-Osnove-vej-in-zdru%c5%beevanja">Osnove vej in združevanja</a> </li> <li> 3.3 <a href="/book/sl/v2/Veje-Git-Upravljanje-vej">Upravljanje vej</a> </li> <li> 3.4 <a href="/book/sl/v2/Veje-Git-Poteki-dela-z-vejami">Poteki dela z vejami</a> </li> <li> 3.5 <a href="/book/sl/v2/Veje-Git-Oddaljene-veje">Oddaljene veje</a> </li> <li> 3.6 <a href="/book/sl/v2/Veje-Git-Ponovno-baziranje">Ponovno baziranje</a> </li> <li> 3.7 <a href="/book/sl/v2/Veje-Git-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/sl/v2/Git-na-stre%c5%beniku-Protokoli">Git na strežniku</a></h2> <ol> <li> 4.1 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Protokoli">Protokoli</a> </li> <li> 4.2 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Pridobitev-Gita-na-stre%c5%beniku">Pridobitev Gita na strežniku</a> </li> <li> 4.3 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Generiranje-va%c5%a1ih-javnih-klju%c4%8dev-SSH">Generiranje vaših javnih ključev SSH</a> </li> <li> 4.4 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Nastavitev-stre%c5%benika">Nastavitev strežnika</a> </li> <li> 4.5 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Prikriti-proces-Git">Prikriti proces Git</a> </li> <li> 4.6 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Pametni-HTTP">Pametni HTTP</a> </li> <li> 4.7 <a href="/book/sl/v2/Git-na-stre%c5%beniku-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/sl/v2/Git-na-stre%c5%beniku-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Mo%c5%benosti-gostovanja-pri-tretjih-ponudnikih">Možnosti gostovanja pri tretjih ponudnikih</a> </li> <li> 4.10 <a href="/book/sl/v2/Git-na-stre%c5%beniku-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/sl/v2/Porazdeljeni-Git-Porazdeljeni-poteki-dela">Porazdeljeni Git</a></h2> <ol> <li> 5.1 <a href="/book/sl/v2/Porazdeljeni-Git-Porazdeljeni-poteki-dela">Porazdeljeni poteki dela</a> </li> <li> 5.2 <a href="/book/sl/v2/Porazdeljeni-Git-Prispevek-k-projektu">Prispevek k projektu</a> </li> <li> 5.3 <a href="/book/sl/v2/Porazdeljeni-Git-Vzdr%c5%beevanje-projekta" class="active">Vzdrževanje projekta</a> </li> <li> 5.4 <a href="/book/sl/v2/Porazdeljeni-Git-Povzetek">Povzetek</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/sl/v2/GitHub-Namestitev-in-konfiguracija-ra%c4%8duna">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/sl/v2/GitHub-Namestitev-in-konfiguracija-ra%c4%8duna">Namestitev in konfiguracija računa</a> </li> <li> 6.2 <a href="/book/sl/v2/GitHub-Prispevek-k-projektu">Prispevek k projektu</a> </li> <li> 6.3 <a href="/book/sl/v2/GitHub-Vzdr%c5%beevanje-projekta">Vzdrževanje projekta</a> </li> <li> 6.4 <a href="/book/sl/v2/GitHub-Upravljanje-organizacije">Upravljanje organizacije</a> </li> <li> 6.5 <a href="/book/sl/v2/GitHub-Skriptni-GitHub">Skriptni GitHub</a> </li> <li> 6.6 <a href="/book/sl/v2/GitHub-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/sl/v2/Orodja-Git-Izbira-revizije">Orodja Git</a></h2> <ol> <li> 7.1 <a href="/book/sl/v2/Orodja-Git-Izbira-revizije">Izbira revizije</a> </li> <li> 7.2 <a href="/book/sl/v2/Orodja-Git-Interaktivno-pripravljanje">Interaktivno pripravljanje</a> </li> <li> 7.3 <a href="/book/sl/v2/Orodja-Git-Shranjevanje-na-varno-angl-stashing-in-%c4%8di%c5%a1%c4%8denje">Shranjevanje na varno (angl. stashing) in čiščenje</a> </li> <li> 7.4 <a href="/book/sl/v2/Orodja-Git-Podpisovanje-va%c5%a1ega-dela">Podpisovanje vašega dela</a> </li> <li> 7.5 <a href="/book/sl/v2/Orodja-Git-Iskanje">Iskanje</a> </li> <li> 7.6 <a href="/book/sl/v2/Orodja-Git-Prepisovanje-zgodovine">Prepisovanje zgodovine</a> </li> <li> 7.7 <a href="/book/sl/v2/Orodja-Git-Demistifikacija-ponastavitve">Demistifikacija ponastavitve</a> </li> <li> 7.8 <a href="/book/sl/v2/Orodja-Git-Napredno-zdru%c5%beevanje">Napredno združevanje</a> </li> <li> 7.9 <a href="/book/sl/v2/Orodja-Git-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/sl/v2/Orodja-Git-Razhro%c5%a1%c4%8devanje-z-Gitom">Razhroščevanje z Gitom</a> </li> <li> 7.11 <a href="/book/sl/v2/Orodja-Git-Podmoduli">Podmoduli</a> </li> <li> 7.12 <a href="/book/sl/v2/Orodja-Git-Povezovanje-v-pakete">Povezovanje v pakete</a> </li> <li> 7.13 <a href="/book/sl/v2/Orodja-Git-Zamenjava">Zamenjava</a> </li> <li> 7.14 <a href="/book/sl/v2/Orodja-Git-Shramba-poverilnic">Shramba poverilnic</a> </li> <li> 7.15 <a href="/book/sl/v2/Orodja-Git-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/sl/v2/Prilagoditev-Gita-Konfiguracija-Git">Prilagoditev Gita</a></h2> <ol> <li> 8.1 <a href="/book/sl/v2/Prilagoditev-Gita-Konfiguracija-Git">Konfiguracija Git</a> </li> <li> 8.2 <a href="/book/sl/v2/Prilagoditev-Gita-Atributi-Git">Atributi Git</a> </li> <li> 8.3 <a href="/book/sl/v2/Prilagoditev-Gita-Kljuke-Git">Kljuke Git</a> </li> <li> 8.4 <a href="/book/sl/v2/Prilagoditev-Gita-Primer-pravilnika,-ki-ga-uveljavlja-Git">Primer pravilnika, ki ga uveljavlja Git</a> </li> <li> 8.5 <a href="/book/sl/v2/Prilagoditev-Gita-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/sl/v2/Git-in-ostali-sistemi-Git-kot-odjemalec">Git in ostali sistemi</a></h2> <ol> <li> 9.1 <a href="/book/sl/v2/Git-in-ostali-sistemi-Git-kot-odjemalec">Git kot odjemalec</a> </li> <li> 9.2 <a href="/book/sl/v2/Git-in-ostali-sistemi-Migracija-na-Git">Migracija na Git</a> </li> <li> 9.3 <a href="/book/sl/v2/Git-in-ostali-sistemi-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/sl/v2/Notranjost-Gita-Napeljava-in-keramika">Notranjost Gita</a></h2> <ol> <li> 10.1 <a href="/book/sl/v2/Notranjost-Gita-Napeljava-in-keramika">Napeljava in keramika</a> </li> <li> 10.2 <a href="/book/sl/v2/Notranjost-Gita-Objekti-Git">Objekti Git</a> </li> <li> 10.3 <a href="/book/sl/v2/Notranjost-Gita-Reference-Git">Reference Git</a> </li> <li> 10.4 <a href="/book/sl/v2/Notranjost-Gita-Packfiles-datoteke-zmanj%c5%a1anih-podatkov">Packfiles (datoteke zmanjšanih podatkov)</a> </li> <li> 10.5 <a href="/book/sl/v2/Notranjost-Gita-Refspec">Refspec</a> </li> <li> 10.6 <a href="/book/sl/v2/Notranjost-Gita-Protokoli-prenosa">Protokoli prenosa</a> </li> <li> 10.7 <a href="/book/sl/v2/Notranjost-Gita-Vzdr%c5%beevanje-in-obnovitev-podatkov">Vzdrževanje in obnovitev podatkov</a> </li> <li> 10.8 <a href="/book/sl/v2/Notranjost-Gita-Spremenljivke-okolja">Spremenljivke okolja</a> </li> <li> 10.9 <a href="/book/sl/v2/Notranjost-Gita-Povzetek">Povzetek</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Grafi%c4%8dni-vmesniki">Dodatek A: Git v drugih okoljih</a></h2> <ol> <li> A1.1 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Grafi%c4%8dni-vmesniki">Grafični vmesniki</a> </li> <li> A1.2 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Visual-Studio">Git v Visual Studio</a> </li> <li> A1.3 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Visual-Studio-Code">Git v Visual Studio Code</a> </li> <li> A1.4 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-IntelliJ-/-PyCharm-/-WebStorm-/-PhpStorm-/-RubyMine">Git v IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine</a> </li> <li> A1.5 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Sublime-Text">Git v Sublime Text</a> </li> <li> A1.6 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Bashu">Git v Bashu</a> </li> <li> A1.7 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Zsh">Git v Zsh</a> </li> <li> A1.8 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Git-v-Powershellu">Git v Powershellu</a> </li> <li> A1.9 <a href="/book/sl/v2/Dodatek-A:-Git-v-drugih-okoljih-Povzetek">Povzetek</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-Git-v-ukazni-vrstici">Dodatek B: Vdelava Gita v vašo aplikacijo</a></h2> <ol> <li> A2.1 <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-Git-v-ukazni-vrstici">Git v ukazni vrstici</a> </li> <li> A2.2 <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-JGit">JGit</a> </li> <li> A2.4 <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-go-git">go-git</a> </li> <li> A2.5 <a href="/book/sl/v2/Dodatek-B:-Vdelava-Gita-v-va%c5%a1o-aplikacijo-Dulwich">Dulwich</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Nastavitev-in-konfiguracija">Dodatek C: Ukazi Git</a></h2> <ol> <li> A3.1 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Nastavitev-in-konfiguracija">Nastavitev in konfiguracija</a> </li> <li> A3.2 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Pridobivanje-in-ustvarjanje-projektov">Pridobivanje in ustvarjanje projektov</a> </li> <li> A3.3 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Osnove-posnetkov">Osnove posnetkov</a> </li> <li> A3.4 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Veje-in-zdru%c5%beevanje">Veje in združevanje</a> </li> <li> A3.5 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Deljenje-in-posodabljanje-projektov">Deljenje in posodabljanje projektov</a> </li> <li> A3.6 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Pregled-in-primerjava">Pregled in primerjava</a> </li> <li> A3.7 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Razhro%c5%a1%c4%8devanje">Razhroščevanje</a> </li> <li> A3.8 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Popravljanje">Popravljanje</a> </li> <li> A3.9 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-E-po%c5%a1ta">E-pošta</a> </li> <li> A3.10 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Zunanji-sistemi">Zunanji sistemi</a> </li> <li> A3.11 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Administracija">Administracija</a> </li> <li> A3.12 <a href="/book/sl/v2/Dodatek-C:-Ukazi-Git-Orodja-za-sisteme-napeljave">Orodja za sisteme napeljave</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>5.3 Porazdeljeni Git - Vzdrževanje projekta</h1> <div> <h2 id="_vzdrževanje_projekta">Vzdrževanje projekta</h2> <div class="paragraph"> <p> Poleg tega, da veste, kako učinkovito prispevati projektu, boste verjetno morali vedeti tudi, kako ga vzdrževati. To lahko sestoji iz sprejemanja in uporabe popravkov generiranih preko <code>format-patch</code>, ki so vam poslani preko e-pošte, ali integracije sprememb v oddaljenih vejah za repozitorije, ki ste jih dodali kot daljave v svoj projekt. Bodisi če vzdržujete kanonični repozitorij ali želite pomagati s potrditvijo ali odobritvijo popravkov, morate vedeti, kako sprejeti delo na način, ki je najbolj jasen za druge, ki prispevajo, in trajnosten na dolgi rok.</p> </div> <div class="sect3"> <h3 id="_delo_na_tematskih_vejah">Delo na tematskih vejah</h3> <div class="paragraph"> <p> Ko razmišljate o integraciji novega dela, je v splošnem dobra ideja poskusiti na <em>tematski veji</em> — začasni veji, posebej narejeni za preskušanje tega novega dela. Na ta način je enostavno prilagoditi programski popravek individualno, ali pa ga pustiti, če ne deluje, dokler nimate časa se vrniti nazaj k njemu. Če ustvarite enostavno ime veje na osnovi teme dela, ki ga boste poskusili, kot je <code>ruby_client</code> ali nekaj podobno opisljivega, si lahko enostavno zapomnite, če jo morate opustiti za nekaj časa in se kasneje vrniti. Vzdrževalec projekta Git tudi stremi k poimenovanju teh vej v imenskem prostoru — kot je <code>sc/ruby_client</code>, kjer je <code>sc</code> kratica za osebo, ki je prispevala delo. Kot se boste spomnili, lahko ustvarite vejo na osnovi vaše veje <code>master</code> takole:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git branch sc/ruby_client master</code></pre> </div> </div> <div class="paragraph"> <p>Ali če želite takoj nanjo tudi preklopiti, lahko uporabite možnost <code>checkout -b</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout -b sc/ruby_client master</code></pre> </div> </div> <div class="paragraph"> <p>Sedaj ste pripravljeni dodati prispevano delo, ki ste ga prejeli, v to tematsko vejo in določiti, ali jo želite združiti v svoje dolgotrajne veje.</p> </div> </div> <div class="sect3"> <h3 id="_patches_from_email">Uporaba popravkov iz e-pošte</h3> <div class="paragraph"> <p> Če prejmete programski popravek, ki ga morate integrirati v svoj projekt, preko e-pošte, morate uporabiti popravek na svoji tematski veji, da ga ocenite. Na voljo sta dva načina za uporabo e-poštnega popravka: z <code>git apply</code> ali z <code>git am</code>.</p> </div> <div class="sect4"> <h4 id="_uporaba_popravka_z_apply">Uporaba popravka z <code>apply</code> </h4> <div class="paragraph"> <p> Če prejmete programski popravek od nekoga, ki ga je generiral z <code>git diff</code> ali kakšno variacijo ukaza Unix <code>diff</code> (kar ni priporočljivo; glejte naslednji razdelek), ga lahko uporabite z ukazom <code>git apply</code>. Predpostavljamo, da ste shranili programski popravek v <code>/tmp/patch-ruby-client.patch</code>, lahko uporabite popravek na naslednji način:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git apply /tmp/patch-ruby-client.patch</code></pre> </div> </div> <div class="paragraph"> <p>To spremeni datoteke v vašem delovnem direktoriju. Je skoraj identično pogonu ukaza <code>patch -p1</code>, da uporabite programski popravek, vendar je bolj paranoično in sprejema manj nejasna ujemanja kot popravek. Upravlja tudi dodajanja datotek, brisanja in preimenovanja, če so opisana v obliki <code>git diff</code>, kar <code>patch</code> ne naredi. Na koncu <code>git apply</code> je model »uporabi vse ali prekliči vse«, kjer je uporabljeno vse ali nič, z razliko, kjer <code>patch</code> lahko delno uporablja datoteke popravkov, kar pusti vaš delovni direktorij v čudnem stanju. <code>git apply</code> je splošno veliko bolj konzervativen kot <code>patch</code>. Ne bo ustvaril potrditve za vas — po tem, ko ga poženete, morate ročno dati v področje priprave in potrditi uvedene spremembe.</p> </div> <div class="paragraph"> <p><code>git apply</code> lahko uporabite tudi, da vidite, če se programski popravek lahko gladko uporabi, preden ga poskusite dejansko uporabiti — poženete lahko <code>git apply --check</code> s popravkom:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git apply --check 0001-see-if-this-helps-the-gem.patch error: patch failed: ticgit.gemspec:1 error: ticgit.gemspec: patch does not apply</code></pre> </div> </div> <div class="paragraph"> <p>Če ni nobenega izpisa, potem bi se moral programski popravek uporabiti gladko. Ta ukaz se tudi konča z neničelnim statusom, če preverjanje ni uspešno, tako da ga lahko uporabite v skriptih, če želite.</p> </div> </div> <div class="sect4"> <h4 id="_git_am">Uporaba popravka z <code>am</code> </h4> <div class="paragraph"> <p> Če je uporabnik, ki prispeva, uporabnik Git in je bilo dovolj dobro uporabiti ukaz <code>format-patch</code> za generiranje njegovega popravka, potem je vaše delo enostavnejše, saj programski popravek vsebuje informacije avtorja in sporočilo potrditve za vas. Če lahko, spodbudite svoje sodelavce, da uporabljajo <code>format-patch</code> namesto <code>diff</code> za generiranje popravkov za vas. <code>git apply</code> bi morali uporabiti samo pri opuščenih popravkih in podobnih stvareh.</p> </div> <div class="paragraph"> <p>Da uporabite programski popravek generiran s <code>format-patch</code>, uporabite <code>git am</code> (ukaz se imenuje <code>am</code>, ker pomeni »uporabi (angl. <em>apply</em>) serijo popravkov iz mailboxa«). Tehnično je <code>git am</code> zgrajen, da prebere datoteko mbox, ki je enostaven tekstovni format za shranjevanje enega ali več e-poštnih sporočil v eni tekstovni datoteki. Videti je nekako takole:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-email" data-lang="email">From 330090432754092d704da8e76ca5c05c198e71a8 Mon Sep 17 00:00:00 2001 From: Jessica Smith &lt;jessica@example.com&gt; Date: Sun, 6 Apr 2008 10:17:23 -0700 Subject: [PATCH 1/2] Add limit to log function Limit log functionality to the first 20</code></pre> </div> </div> <div class="paragraph"> <p>To je začetek izhodnega zapisa ukaza <code>git format-patch</code>, ki ste ga videli v prejšnjem odseku; predstavlja tudi veljaven e-poštni format mbox. Če vam nekdo pravilno pošlje programski popravek z uporabo ukaza <code>git send-email</code> in ga prenesete v obliki mbox, lahko <code>git am</code> usmerite v datoteko mbox in začne uporabljati vse popravke, ki jih vidi. Če uporabljate odjemalca pošte, ki lahko več e-poštnih sporočil shranjuje v obliki mbox, lahko celotno serijo popravkov shranite v datoteko in nato uporabite <code>git am</code>, da jih uporabite enega za drugim.</p> </div> <div class="paragraph"> <p>Če pa je nekdo naložil datoteko s popravkom, ki je bila ustvarjena prek ukaza <code>git format-patch</code> v sistem za beleženje težav ali kaj podobnega, lahko datoteko shranite lokalno in jo nato prenesete v <code>git am</code>, da jo uporabite:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git am 0001-limit-log-function.patch Applying: Add limit to log function</code></pre> </div> </div> <div class="paragraph"> <p>Vidite lahko, da se je programski popravek uporabil brez težav in samodejno ustvaril novo potrditev za vas. Informacije o avtorju so vzete iz glav <code>From</code> in <code>Date</code> v e-pošti, sporočilo potrditve pa je vzeto iz <code>Subject</code> in telesa (pred popravkom) e-pošte. Če je bil na primer ta programski popravek uporabljen iz zgornjega primera mbox, bi bila ustvarjena potrditev nekaj podobnega temu:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console?prompt=$" data-lang="console?prompt=$">$ git log --pretty=fuller -1 commit 6c5e70b984a60b3cecd395edd5b48a7575bf58e0 Author: Jessica Smith &lt;jessica@example.com&gt; AuthorDate: Sun Apr 6 10:17:23 2008 -0700 Commit: Scott Chacon &lt;schacon@gmail.com&gt; CommitDate: Thu Apr 9 09:19:06 2009 -0700 Add limit to log function Limit log functionality to the first 20</code></pre> </div> </div> <div class="paragraph"> <p>Informacije <code>Commit</code> kažejo osebo, ki je uporabila programski popravek, in čas uporabe. Informacije <code>Author</code> pa kažejo na osebo, ki je prvotno ustvarila programski popravek in kdaj je bil prvotno ustvarjen.</p> </div> <div class="paragraph"> <p>Vendar lahko se zgodi, da se programski popravek ne bo uporabil brez težav. Morda se je vaša glavna veja preveč oddaljila od veje, iz katere je bil programski popravek zgrajen, ali pa je popravek odvisen od drugega popravka, ki ga še niste uporabili. V tem primeru bo proces <code>git am</code> spodletel in vas vprašal, kaj želite storiti:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git am 0001-see-if-this-helps-the-gem.patch Applying: See if this helps the gem error: patch failed: ticgit.gemspec:1 error: ticgit.gemspec: patch does not apply Patch failed at 0001. When you have resolved this problem run "git am --resolved". If you would prefer to skip this patch, instead run "git am --skip". To restore the original branch and stop patching run "git am --abort".</code></pre> </div> </div> <div class="paragraph"> <p>Ta ukaz vstavi označevalce konfliktov v datoteke, s katerimi ima težave, podobno kot pri operaciji združevanja ali ponovnem baziranju, ki ima konflikte. To težavo lahko rešite na podoben način — uredite datoteko, da rešite konflikt, shranite novo datoteko in nato zaženite <code>git am --resolved</code>, da nadaljujete na naslednji programski popravek:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ (fix the file) $ git add ticgit.gemspec $ git am --resolved Applying: See if this helps the gem</code></pre> </div> </div> <div class="paragraph"> <p>Če želite, da Git poskusi bolj inteligentno rešiti konflikt, mu lahko podate možnost <code>-3</code>, kjer Git poskuša izvesti tristransko združevanje. Ta možnost ni privzeto vklopljena, ker ne deluje, če potrditve, ki jih navaja programski popravek, ni v vašem repozitoriju. Če imate to potrditev — če je bil programski popravek ustvarjen na podlagi javne potrditve — je možnost <code>-3</code> na splošno veliko bolj inteligentna pri uporabi konfliktnega popravka:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git am -3 0001-see-if-this-helps-the-gem.patch Applying: See if this helps the gem error: patch failed: ticgit.gemspec:1 error: ticgit.gemspec: patch does not apply Using index info to reconstruct a base tree... Falling back to patching base and 3-way merge... No changes -- Patch already applied.</code></pre> </div> </div> <div class="paragraph"> <p>V tem primeru bi bil programski popravek brez možnosti <code>-3</code> obravnavan kot konflikt. Ker je bila uporabljena možnost <code>-3</code>, se je programski popravek uporabil brez težav.</p> </div> <div class="paragraph"> <p>Če uporabljate več popravkov iz mboxa, lahko ukaz <code>am</code> zaženete tudi v interaktivnem načinu, ki se ustavi pri vsakem popravku, ki ga najde, in vpraša, ali ga želite uporabiti:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git am -3 -i mbox Commit Body is: -------------------------- See if this helps the gem -------------------------- Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all</code></pre> </div> </div> <div class="paragraph"> <p>To je koristno, če imate shranjenih več popravkov, saj si lahko programski popravek najprej ogledate, če se ne spomnite, kaj predstavlja, ali pa ga ne uporabite, če ste ga že uporabili.</p> </div> <div class="paragraph"> <p>Ko so vsi popravki za vašo temo uporabljeni in potrjeni v vaši razvojni veji, lahko izberete, ali jih želite integrirati v dolgotrajno vejo in na kakšen način.</p> </div> </div> </div> <div class="sect3"> <h3 id="_checking_out_remotes">Izvlečenje oddaljenih vej</h3> <div class="paragraph"> <p> Če je vaš prispevek prišel od uporabnika Git, ki je nastavil svoj lastni repozitorij, vanj potisnil več sprememb in vam nato poslal naslov URL repozitorija in ime oddaljene veje, v kateri so spremembe, jih lahko dodate kot oddaljeno vejo in nato lokalno združite.</p> </div> <div class="paragraph"> <p>Na primer, če vam Jessica pošlje e-poštno sporočilo, v katerem pravi, da ima odlično novo funkcijo v veji <code>ruby-client</code> svojega repozitorija, jo lahko preizkusite tako, da dodate oddaljeno vejo in lokalno izvlečete to vejo:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git remote add jessica https://github.com/jessica/myproject.git $ git fetch jessica $ git checkout -b rubyclient jessica/ruby-client</code></pre> </div> </div> <div class="paragraph"> <p>Če vam pozneje ponovno pošlje e-pošto z drugo vejo, ki vsebuje drugo odlično funkcionalnost, jo lahko neposredno prenesete s <code>fetch</code> in <code>checkout</code> saj imate že nastavljen oddaljeni vir.</p> </div> <div class="paragraph"> <p>To je najbolj uporabno, če redno sodelujete s to osebo. Če nekdo prispeva le občasno kakšen programski popravek, je sprejemanje prek e-pošte manj časovno potratno, kot zahtevati, da vsakdo zažene svoj lastni strežnik in nenehno dodaja in odstranjuje daljave, da bi dobili nekaj sprememb. Verjetno tudi ne želite imeti na stotine daljav, vsake za vsako osebo, ki prispeva le eno ali dve spremembi. Vendar pa lahko skripti in gostujoče storitve to olajšajo — odvisno je predvsem od tega, kako razvijate in kako razvijajo vaši sodelavci.</p> </div> <div class="paragraph"> <p>Druga prednost tega pristopa je, da dobite tudi zgodovino opravljenih potrditev. Čeprav imate lahko legitimne težave z združevanjem, veste, kje v vaši zgodovini je njihovo delo, saj je pravilno tristopenjsko združevanje privzeto, namesto da bi morali zagotoviti <code>-3</code> in upati, da je oblika spremembe ustvarjena iz javne potrditve, do katere imate dostop.</p> </div> <div class="paragraph"> <p>Če ne sodelujete redno z osebo, vendar še vedno želite povleči od njih na ta način, lahko naslov URL oddaljenega repozitorija navedete v ukazu <code>git pull</code>. To naredi enkratno vlečenje in ne shrani URL-ja kot referenčnega oddaljenega vira:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console?prompt=$" data-lang="console?prompt=$">$ git pull https://github.com/onetimeguy/project From https://github.com/onetimeguy/project * branch HEAD -&gt; FETCH_HEAD Merge made by the 'recursive' strategy.</code></pre> </div> </div> </div> <div class="sect3"> <h3 id="_what_is_introduced">Določanje, kaj se uvaja</h3> <div class="paragraph"> <p> Zdaj imate tematsko vejo, ki vsebuje prispevano delo. V tem trenutku lahko določite, kaj bi radi naredili z njim. Ta odsek ponovno pregleda nekaj ukazov, da lahko vidite, kako jih lahko uporabite za pregled tega, kaj boste uvedli, če ga združite v glavno vejo.</p> </div> <div class="paragraph"> <p>Pogosto je koristno, da pregledate vse potrditve, ki so v tej veji, vendar niso v vaši veji <code>master</code>. Potrditve v veji <code>master</code> lahko izključite tako, da pred imenom veje dodate možnost <code>--not</code>. To stori isto kot oblika <code>master..contrib</code>, ki smo jo uporabili prej. Na primer, če vam sodelavec pošlje dve potrditvi in ustvarite vejo z imenom <code>contrib</code> ter nanjo uporabite te potrditve, lahko zaženete:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console?prompt=$" data-lang="console?prompt=$">$ git log contrib --not master commit 5b6235bd297351589efc4d73316f0a68d484f118 Author: Scott Chacon &lt;schacon@gmail.com&gt; Date: Fri Oct 24 09:53:59 2008 -0700 See if this helps the gem commit 7482e0d16d04bea79d0dba8988cc78df655f16a0 Author: Scott Chacon &lt;schacon@gmail.com&gt; Date: Mon Oct 22 19:38:36 2008 -0700 Update gemspec to hopefully work better</code></pre> </div> </div> <div class="paragraph"> <p>Da vidite, kaj spremembe vsake potrditve prinesejo, ne pozabite, da lahko podate ukazu <code>git log</code> možnost <code>-o</code> in pripel bo razliko predstavljeno v vsaki potrditvi.</p> </div> <div class="paragraph"> <p>Da bi videli celotno razliko, ki bi se zgodila, če bi to tematsko vejo združili z drugo vejo, boste morda morali uporabiti čuden trik, da dobite pravilne rezultate. Morda bi pomislili, da bi zagnali to:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git diff master</code></pre> </div> </div> <div class="paragraph"> <p>Ta ukaz vam da razliko, vendar je lahko zavajajoča. Če se je vaša veja <code>master</code> premaknila naprej od trenutka, ko ste iz nje ustvarili tematsko vejo, boste dobili na videz nenavadne rezultate. To se zgodi, ker Git neposredno primerja posnetke zadnje potrditve na tematski veji, na kateri ste, in posnetka zadnje potrditve na veji <code>master</code>. Na primer, če ste na veji <code>master</code> dodali vrstico v datoteko, bo neposredna primerjava posnetkov videti, kot da bo tematska veja odstranila to vrstico.</p> </div> <div class="paragraph"> <p>Če je <code>master</code> neposredni prednik vaše tematske veje, to ni problem; toda če sta se zgodovini razhajali, se bo razlika zdela, kot da dodajate vse nove stvari na svoji tematski veji in odstranjujete vse, kar je edinstveno za vejo <code>master</code>.</p> </div> <div class="paragraph"> <p>Kar želite videti, so spremembe, dodane v tematski veji — delo, ki ga boste uvedli, če boste združili to vejo z <code>master</code>. To dosežete tako, da Git primerja zadnjo potrditev na vaši tematski veji z zadnjim skupnim prednikom, ki ga ima z vejo <code>master</code>.</p> </div> <div class="paragraph"> <p>Tehnično gledano, to lahko storite tako, da izrecno določite skupnega prednika in nato zaženete svojo razliko na njem:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git merge-base contrib master 36c7dba2c95e6bbb78dfa822519ecfec6e1ca649 $ git diff 36c7db</code></pre> </div> </div> <div class="paragraph"> <p>ali bolj jedrnato:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git diff $(git merge-base contrib master)</code></pre> </div> </div> <div class="paragraph"> <p>Vendar nobena od teh ni posebej priročna, zato Git ponuja še eno bližnjico za isto stvar: sintakso s tremi pikami. V kontekstu ukaza <code>git diff</code> lahko dodate tri pike po drugi veji, da naredite <code>diff</code> med zadnjo potrditvijo na veji, na kateri ste, in njenim skupnim prednikom z drugo vejo:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git diff master...contrib</code></pre> </div> </div> <div class="paragraph"> <p>Ta ukaz prikaže samo delo, ki ga je vaša trenutna tematska veja vnesla od skupnega prednika z vejo <code>master</code>. To je zelo uporabna sintaksa, ki si jo velja zapomniti.</p> </div> </div> <div class="sect3"> <h3 id="_integriranje_prispevanega_dela">Integriranje prispevanega dela</h3> <div class="paragraph"> <p> Ko je vse delo v vaši tematski veji pripravljeno za integracijo v glavno vejo, se postavi vprašanje, kako to storiti. Poleg tega, kateri splošni potek dela želite uporabiti za vzdrževanje svojega projekta? Imate več možnosti, zato bomo obravnavali nekatere od njih.</p> </div> <div class="sect4"> <h4 id="_poteki_dela_združevanj">Poteki dela združevanj</h4> <div class="paragraph"> <p> Eden izmed osnovnih potekov dela je, da preprosto združite vse delo neposredno v vašo vejo <code>master</code>. V tem scenariju imate vejo <code>master</code>, ki vsebuje v bistvu stabilno kodo. Ko imate delo v tematski veji, za katerega menite, da ste ga dokončali, ali delo, ki ga je prispeval nekdo drug in ste ga preverili, ga združite v vašo vejo <code>master</code>, izbrišete tematsko vejo, ki ste jo ravno združili, ter ponovite.</p> </div> <div class="paragraph"> <p>Na primer, če imamo repozitorij z delom v dveh vejah imenovanih <code>ruby_client</code> in <code>php_client</code>, ki je videti kot na sliki <a href="/book/sl/v2/ch00/merwf_a">Zgodovina z več tematskimi vejami</a>, in združimo <code>ruby_client</code>, nato pa še <code>php_client</code>, bo vaša zgodovina videti kot na sliki <a href="/book/sl/v2/ch00/merwf_b">Po združitvi tematske veje</a>.</p> </div> <div id="merwf_a" class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/merging-workflows-1.png" alt="Zgodovina z več tematskimi vejami"> </div> <div class="title">Slika 72. Zgodovina z več tematskimi vejami</div> </div> <div id="merwf_b" class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/merging-workflows-2.png" alt="Po združitvi tematske veje"> </div> <div class="title">Slika 73. Po združitvi tematske veje</div> </div> <div class="paragraph"> <p>To je verjetno najpreprostejši potek dela, vendar lahko pri delu z večjimi ali bolj stabilnimi projekti, kjer morate biti zelo previdni pri tem, kaj uvajate, povzroči težave.</p> </div> <div class="paragraph"> <p>Če imate pomembnejši projekt, bi morda želeli uporabiti dvofazni postopek združevanja. V tem scenariju imate dve dolgotrajni veji, <code>master</code> in <code>develop</code>, pri katerih določite, da se <code>master</code> posodobi le, ko je izdana zelo stabilna različica in se vsa nova koda integrira v vejo <code>develop</code>. Občasno obe veji potisnete v javni repozitorij. Vsakič, ko želite združiti novo tematsko vejo (slika <a href="/book/sl/v2/ch00/merwf_c">Pred združitvijo tematske veje</a>), jo združite v vejo <code>develop</code> (slika <a href="/book/sl/v2/ch00/merwf_d">Po združitvi tematske veje</a>); nato, ko označite izdajo, <code>master</code> hitro posodobite do stabilne točke, kjer je trenutna veja <code>develop</code> (slika <a href="/book/sl/v2/ch00/merwf_e">Po objavi projekta</a>).</p> </div> <div id="merwf_c" class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/merging-workflows-3.png" alt="Pred združitvijo tematske veje"> </div> <div class="title">Slika 74. Pred združitvijo tematske veje</div> </div> <div id="merwf_d" class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/merging-workflows-4.png" alt="Po združitvi tematske veje"> </div> <div class="title">Slika 75. Po združitvi tematske veje</div> </div> <div id="merwf_e" class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/merging-workflows-5.png" alt="Po objavi projekta"> </div> <div class="title">Slika 76. Po objavi projekta</div> </div> <div class="paragraph"> <p>Na ta način lahko ljudje, ki si klonirajo vaš repozitorij projekta, izvlečejo <code>master</code> za gradnjo najnovejše stabilne različice in jo enostavno ohranjajo posodobljeno, ali pa preverijo <code>develop</code>, ki vsebuje najnaprednejšo vsebino. To zasnovo lahko razširite tudi tako, da imate vejo <code>integrate</code>, v kateri se združi vse delo. Nato, ko je koda na tej veji stabilna in uspešno preide teste, jo združite v vejo <code>develop</code>, in ko se ta predstavi kot stabilna za več časa, posodobite vejo <code>master</code>.</p> </div> </div> <div class="sect4"> <h4 id="_poteki_dela_večjih_združevanj">Poteki dela večjih združevanj</h4> <div class="paragraph"> <p> Projekt Git ima štiri dolgotrajne veje: <code>master</code>, <code>next</code> in <code>seen</code> (prej <code>pu</code> — predlagane posodobitve — angl. <em>proposed updates</em>) za novo delo in <code>maint</code> za vzdrževanje posodobitev. Ko prispe novo delo s strani sodelavcev, se zbere v tematskih vejah v repozitoriju vzdrževalca na način, podoben temu, kar smo opisali (glejte sliko <a href="/book/sl/v2/ch00/merwf_f">Upravljanje kompleksne serije vzporednih prispevanih tematskih vej</a>). V tej fazi se ocenijo tematske veje, da se ugotovi, ali so varne in pripravljene za uporabo, ali potrebujejo še več dela. Če so varne, se vgradijo v <code>next</code> in ta veja se objavi, tako da lahko vsi preizkusijo teme, integrirane skupaj.</p> </div> <div id="merwf_f" class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/large-merges-1.png" alt="Upravljanje kompleksne serije vzporednih prispevanih tematskih vej"> </div> <div class="title">Slika 77. Upravljanje kompleksne serije vzporednih prispevanih tematskih vej</div> </div> <div class="paragraph"> <p>Če teme še potrebujejo delo, so namesto tega združene v vejo <code>seen</code>. Ko se ugotovi, da so v celoti stabilne, se teme ponovno združi v vejo <code>master</code>. Veji <code>next</code> in <code>seen</code> sta nato znova zgrajeni iz <code>master</code>. To pomeni, da se <code>master</code> skoraj vedno premika naprej, <code>next</code> se občasno ponovno bazira in <code>seen</code> se ponovno bazira še pogosteje:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/large-merges-2.png" alt="Združevanje prispevanih tematskih vej v dolgotrajne integracijske veje"> </div> <div class="title">Slika 78. Združevanje prispevanih tematskih vej v dolgotrajne integracijske veje</div> </div> <div class="paragraph"> <p>Ko je tematska veja končno združena v <code>master</code>, se izbriše iz repozitorija. Projekt Git ima tudi vejo <code>maint</code>, ki je razvejana od zadnje različice, da zagotavlja popravke za nazaj, če je potrebna vzdrževalna izdaja. Tako imate pri kloniranju repozitorija Git štiri veje, ki jih lahko preizkusite, da ovrednotite projekt v različnih razvojnih fazah, odvisno od tega, kako drzni želite biti, ali kako želite prispevati; in vzdrževalec ima strukturiran potek dela, ki mu pomaga preverjati nove prispevke. Potek dela projekta Git je specializiran. Za boljše razumevanje si lahko ogledate <a href="https://github.com/git/git/blob/master/Documentation/howto/maintain-git.txt" target="_blank" rel="noopener">Gitov vodnik za vzdrževanje</a>.</p> </div> </div> <div class="sect4"> <h4 id="_rebase_cherry_pick">Poteki dela ponovnega baziranja in izbire najboljšega</h4> <div class="paragraph"> <p> Drugi vzdrževalci raje ponovno bazirajo ali izberejo najboljše prispevano delo na vrh njihove veje <code>master</code>, namesto da bi ga združili, da ohranijo predvsem linearno zgodovino. Ko imate delo v tematski veji in ste ugotovili, da ga želite integrirati, se premaknete na to vejo in zaženete ukaz za ponovno baziranje (angl. <em>rebase</em>), da ponovno sestavite spremembe na vrhu trenutne veje <code>master</code> (ali <code>develop</code> in tako naprej). Če to deluje dobro, lahko hitro previjete naprej vašo vejo <code>master</code> in imeli boste linearno zgodovino projekta.</p> </div> <div class="paragraph"> <p> Drugi način za premikanje vpeljanega dela iz ene veje v drugo je t. i. izbiranje najboljšega (angl. <em>cherry picking</em>). Izbiranje najboljšega v Gitu je podobno ponovnem baziranju za eno samo potrditev. Vzame programski popravek, ki je bil uveden v eni potrditvi, in ga poskuša ponovno uporabiti na veji, na kateri trenutno ste. To je uporabno, če imate na veji več potrditev in želite integrirati le eno od njih, ali če imate samo eno potrditev na veji in bi jo raje izbrali kot najboljšo namesto ponovnega baziranja. Na primer, recimo, da imate projekt, ki je videti tako:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/rebasing-1.png" alt="Primer zgodovine pred izbiro najboljšega"> </div> <div class="title">Slika 79. Primer zgodovine pred izbiro najboljšega</div> </div> <div class="paragraph"> <p>Če želite povleči potrditev <code>e43a6</code> v vašo vejo <code>master</code>, lahko poženete:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cherry-pick e43a6 Finished one cherry-pick. [master]: created a0a41a9: "More friendly message when locking the index fails." 3 files changed, 17 insertions(+), 3 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>To povleče iste spremembe, ki so bile predstavljene v <code>e43a6</code>, vendar dobite novo vrednost SHA-1 potrditve, ker je uporabljeni datum drugačen. Sedaj je vaša zgodovina videti takole:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/sl/v2/images/rebasing-2.png" alt="Zgodovina po izbiri najboljše potrditve iz tematske veje"> </div> <div class="title">Slika 80. Zgodovina po izbiri najboljše potrditve iz tematske veje</div> </div> <div class="paragraph"> <p>Sedaj lahko odstranite svojo tematsko vejo in opustite potrditve, ki jih niste želeli povleči.</p> </div> </div> <div class="sect4"> <h4 id="_rerere">Rerere</h4> <div class="paragraph"> <p> Če delate veliko združevanja in ponovnega baziranja, ali vzdržujete dolgotrajno tematsko vejo, ima Git lastnost, ki se imenuje »rerere«, ki je lahko koristna.</p> </div> <div class="paragraph"> <p>Rerere pomeni »reuse recorded resolution« (ponovno uporabi posneto rešitev) — je način bližnjice ročnega reševanja konflikta. Ko je rerere omogočen, bo Git obdržal skupek slik pred in po iz uspešnih združitev in če opazi, da gre za konflikt, ki je videti točno tak kot eden, ki ste ga že popravili, bo enostavno samo uporabil programski popravek od zadnjič, ne da vas pri tem z njim moti.</p> </div> <div class="paragraph"> <p>Ta lastnost prihaja v dveh delih: konfiguracijska nastavitev in ukaz. Konfiguracijska nastavitev je <code>rerere.enabled</code> in je dovolj priročna, da jo dodate v svoje globalne nastavitve:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git config --global rerere.enabled true</code></pre> </div> </div> <div class="paragraph"> <p>Sedaj, vsakič, ko izvedete združevanje, ki rešuje konflikte, se bo rešitev zabeležila v predpomnilnik, če jo boste potrebovali v prihodnosti.</p> </div> <div class="paragraph"> <p>Če je treba, lahko z ukazom <code>git rerere</code> interaktivno upravljate s predpomnilnikom rerere. Ko se uporabi samostojno, Git preveri svojo bazo rešitev in poskuša najti ujemanje z morebitnimi trenutnimi konflikti ob združevanju in jih reši (če je <code>rerere.enabled</code> nastavljeno na <code>true</code>, se to izvede samodejno). Obstajajo tudi podukazi, s katerimi lahko vidite, kaj bo zabeleženo, izbrišete določeno rešitev iz predpomnilnika ali počistite celoten predpomnilnik. Rerere bomo podrobneje obravnavali v <a href="/book/sl/v2/ch00/ref_rerere">Rerere</a>.</p> </div> </div> </div> <div class="sect3"> <h3 id="_tagging_releases">Označevanje vaših izdaj</h3> <div class="paragraph"> <p> Ko se odločite za izdajo, boste verjetno želeli dodeliti oznako, da boste lahko to izdajo ustvarili kadarkoli v prihodnosti. Novo oznako lahko ustvarite, kot je opisano v poglavju <a href="/book/sl/v2/ch00/ch02-git-basics-chapter">Osnove Git</a>. Če se odločite podpisati oznako kot vzdrževalec, je lahko postopek označevanja videti nekako takole:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console?prompt=$" data-lang="console?prompt=$">$ git tag -s v1.5 -m 'my signed 1.5 tag' You need a passphrase to unlock the secret key for user: "Scott Chacon &lt;schacon@gmail.com&gt;" 1024-bit DSA key, ID F721C45A, created 2009-02-09</code></pre> </div> </div> <div class="paragraph"> <p>Če podpišete svoje oznake, se lahko pojavijo težave pri distribuciji javnega ključa PGP, ki se uporablja za podpisovanje vaših oznak. Vzdrževalec projekta Git je to težavo rešil tako, da je svoj javni ključ vključil kot blob v repozitoriju in nato dodal oznako, ki neposredno kaže na ta vsebino. Kateri ključ želite, lahko ugotovite tako, da zaženete ukaz <code>gpg --list-keys</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console?prompt=$" data-lang="console?prompt=$">$ gpg --list-keys /Users/schacon/.gnupg/pubring.gpg --------------------------------- pub 1024D/F721C45A 2009-02-09 [expires: 2010-02-09] uid Scott Chacon &lt;schacon@gmail.com&gt; sub 2048g/45D02282 2009-02-09 [expires: 2010-02-09]</code></pre> </div> </div> <div class="paragraph"> <p>Nato lahko ključ neposredno uvozite v Gitovo bazo tako, da ga izvozite in pretakate skozi <code>git hash-object</code>, ki napiše nov blob s temi vsebinami v Git in vrne SHA-1 bloba:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ gpg -a --export F721C45A | git hash-object -w --stdin 659ef797d181633c87ec71ac3f9ba29fe5775b92</code></pre> </div> </div> <div class="paragraph"> <p>Zdaj, ko imate vsebino ključa v Gitu, lahko ustvarite oznako, ki nanjo neposredno kaže, tako da navedete novo vrednost SHA-1, ki vam jo je dal ukaz <code>hash-object</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git tag -a maintainer-pgp-pub 659ef797d181633c87ec71ac3f9ba29fe5775b92</code></pre> </div> </div> <div class="paragraph"> <p>Če zaženete <code>git push --tags</code>, se bo oznaka <code>maintainer-pgp-pub</code> delila z vsemi. Če želi kdo preveriti oznako, lahko vaš ključ PGP neposredno uvozi tako, da povleče blob neposredno iz baze podatkov in ga uvozi v GPG:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git show maintainer-pgp-pub | gpg --import</code></pre> </div> </div> <div class="paragraph"> <p>S tem ključem lahko preverijo tudi vse vaše podpisane oznake. Poleg tega lahko z navodili v sporočilu oznake zagon <code>git show &lt;tag&gt;</code> uporabnikom ponudi bolj specifična navodila za preverjanje oznake.</p> </div> </div> <div class="sect3"> <h3 id="_build_number">Ustvarjanje številke gradnje</h3> <div class="paragraph"> <p> Ker Git nima za vsako potrditev monotono naraščajočih številk, kot so <code>v123</code> ali enakovredne, lahko za ime, ki je berljivo za ljudi in ki pripada potrditvi, uporabite <code>git describe</code> na tej potrditvi. V odzivu Git generira niz, ki sestoji iz imena najnovejše označene potrditve, ki se pojavi pred to potrditvijo, sledi število potrditev od te označene potrditve, nato pa delna vrednost SHA-1 potrditve, ki se opisuje (predpona <code>g</code> pomeni Git):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git describe master v1.6.2-rc1-20-g8c5b85c</code></pre> </div> </div> <div class="paragraph"> <p>Na ta način lahko izvozite posnetek ali ga sestavite in mu dodelite ime, ki ga ljudje razumejo. Dejansko, če Git zgradite iz izvorne kode, ki jo prenesete iz repozitorija Git, vam <code>git --version</code> da nekaj, kar je videti tako. Če opišete potrditev, ki ste jo neposredno označili, vam preprosto prikaže ime oznake.</p> </div> <div class="paragraph"> <p>Privzeto ukaz <code>git describe</code> zahteva anotirane oznake (oznake, ustvarjene z zastavico <code>-a</code> ali <code>-s</code>); če želite izkoristiti tudi enostavne (ne-anotirane) oznake, dodajte ukazu možnost <code>--tags</code>. Ta niz lahko uporabite tudi kot cilj ukaza <code>git checkout</code> ali <code>git show</code>, vendar je odvisen od okrajšane vrednosti SHA-1 na koncu, zato morda ne bo za vedno veljaven. Na primer, jedro Linuxa se je nedavno preusmerilo iz 8 na 10 znakov, da bi zagotovilo enoličnost objekta SHA-1, zato so bili starejši izpisi imen <code>git describe</code> neveljavni.</p> </div> </div> <div class="sect3"> <h3 id="_preparing_release">Priprava izdaje</h3> <div class="paragraph"> <p> Sedaj želite objaviti gradnjo. Ena od stvari, ki jo boste želeli narediti, je ustvariti arhiv najnovejše slike vaše kode za tiste uboge duše, ki ne uporabljajo Gita. Ukaz za to je <code>git archive</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git archive master --prefix='project/' | gzip &gt; `git describe master`.tar.gz $ ls *.tar.gz v1.6.2-rc1-20-g8c5b85c.tar.gz</code></pre> </div> </div> <div class="paragraph"> <p>Če nekdo odpre tisti stisnjeni arhiv tar (angl. <em>tarball</em>), dobi najnovejši posnetek vašega projekta pod direktorijem <code>project</code>. Na podoben način pa lahko ustvarite tudi arhiv zip, vendar tako, da daste <code>--format=zip</code> kot možnost ukazu <code>git archive</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git archive master --prefix='project/' --format=zip &gt; `git describe master`.zip</code></pre> </div> </div> <div class="paragraph"> <p>Zdaj imate lep stisnjen arhiv tar in arhiv zip vaše projektne izdaje, ki ju lahko naložite na svojo spletno stran, ali pošljete ljudem po e-pošti.</p> </div> </div> <div class="sect3"> <h3 id="_the_shortlog">Kratek dnevnik (angl. <em>shortlog</em>)</h3> <div class="paragraph"> <p> Čas je, da pošljete elektronsko pošto svojemu seznamu prejemnikov, ki želijo vedeti, kaj se dogaja v vašem projektu. Lep način hitrega pridobivanja vrste sprememb, ki so bile dodane v vaš projekt od zadnje objave ali e-pošte, je uporaba ukaza <code>git shortlog</code>. Povzame vse potrditve v določenem obsegu; na primer, naslednje vam da povzetek vseh potrditev od zadnje objave, če je bila vaša zadnja objava poimenovana <code>v1.0.1</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console?prompt=$" data-lang="console?prompt=$">$ git shortlog --no-merges master --not v1.0.1 Chris Wanstrath (6): Add support for annotated tags to Grit::Tag Add packed-refs annotated tag support. Add Grit::Commit#to_patch Update version and History.txt Remove stray `puts` Make ls_tree ignore nils Tom Preston-Werner (4): fix dates in history dynamic version method Version bump to 1.0.2 Regenerated gemspec for version 1.0.2</code></pre> </div> </div> <div class="paragraph"> <p>Dobite čisti povzetek vseh potrditev od <code>v1.0.1</code>, združen po avtorju, ki ga lahko pošljete po elektronski pošti na svoj seznam prejemnikov.</p> </div> </div> <div id="nav"><a href="/book/sl/v2/Porazdeljeni-Git-Prispevek-k-projektu">prev</a> | <a href="/book/sl/v2/Porazdeljeni-Git-Povzetek">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