CINXE.COM
Git - Projenin Gelişiminde Rol Almak
<!DOCTYPE html> <html lang="tr"> <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 - Projenin Gelişiminde Rol Almak</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-Contributing-to-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%99y%c9%99-T%c3%b6hf%c9%99-verm%c9%99k">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-%d0%98%d0%bd%d1%82%d0%b5%d1%80%d0%b0%d0%ba%d1%82%d0%b8%d0%b2%d0%bd%d0%be-%d0%b8%d0%bd%d0%b4%d0%b5%d0%ba%d1%81%d0%b8%d1%80%d0%b0%d0%bd%d0%b5">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Verteiltes-Git-An-einem-Projekt-mitwirken">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Git-en-entornos-distribuidos-Contribuyendo-a-un-Proyecto">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Git-distribu%c3%a9-Contribution-%c3%a0-un-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%b8%e3%81%ae%e8%b2%a2%e7%8c%ae">日本語</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%ec%97%90-%ea%b8%b0%ec%97%ac%ed%95%98%ea%b8%b0">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Gedistribueerd-Git-Bijdragen-aan-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%a3%d1%87%d0%b0%d1%81%d1%82%d0%b8%d0%b5-%d0%b2-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b5">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Porazdeljeni-Git-Prispevek-k-projektu">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Distributed-Git-Contributing-to-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%92%d0%bd%d0%b5%d1%81%d0%b5%d0%bd%d0%bd%d1%8f-%d0%b7%d0%bc%d1%96%d0%bd-%d0%b4%d0%be-%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-%e5%90%91%e4%b8%80%e4%b8%aa%e9%a1%b9%e7%9b%ae%e8%b4%a1%e7%8c%ae">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Distribuovan%c3%bd-Git-P%c5%99isp%c3%adv%c3%a1n%c3%ad-do-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%b4%d0%be%d0%bd%d0%b5%d1%81-%d0%ba%d0%be%d0%bd-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Rozproszony-Git-Wgrywanie-zmian-do-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%9a%d0%b0%d0%ba%d0%be-%d1%81%d0%b5-%d0%b4%d0%b0%d1%98%d0%b5-%d0%b4%d0%be%d0%bf%d1%80%d0%b8%d0%bd%d0%be%d1%81-%d0%bf%d1%80%d0%be%d1%98%d0%b5%d0%ba%d1%82%d1%83">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Distributed-Git-Contributing-to-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-%e5%b0%8d%e5%b0%88%e6%a1%88%e9%80%b2%e8%a1%8c%e8%b2%a2%e7%8d%bb">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Distributed-Git-Contributing-to-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%85%d8%b4%d8%a7%d8%b1%da%a9%d8%aa-%d8%af%d8%b1-%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-Contributing-to-a-Project">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Distributed-Git-Contributing-to-a-Project">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Distributed-Git-Contributing-to-a-Project">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Distributed-Git-Contribuindo-com-um-Projeto">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Git-Distribu%c3%addo-Contributing-to-a-Project">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Distribuerade-Git-Medverka-i-ett-projekt">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-Projenin-Geli%c5%9fiminde-Rol-Almak">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-tr">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/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-S%c3%bcr%c3%bcm-Denetimi">Başlangıç</a></h2> <ol> <li> 1.1 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-S%c3%bcr%c3%bcm-Denetimi">Sürüm Denetimi</a> </li> <li> 1.2 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Git%e2%80%99in-K%c4%b1sa-Tarih%c3%a7esi">Git’in Kısa Tarihçesi</a> </li> <li> 1.3 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Git-Nedir%3F">Git Nedir?</a> </li> <li> 1.4 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Komut-Sat%c4%b1r%c4%b1">Komut Satırı</a> </li> <li> 1.5 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Git%e2%80%99i-Y%c3%bcklemek">Git’i Yüklemek</a> </li> <li> 1.6 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Git%e2%80%99i-%c4%b0lk-Defa-Kurmak">Git’i İlk Defa Kurmak</a> </li> <li> 1.7 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-Yard%c4%b1m-Almak">Yardım Almak</a> </li> <li> 1.8 <a href="/book/tr/v2/Ba%c5%9flang%c4%b1%c3%a7-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/tr/v2/Git-Temelleri-Bir-Git-Reposu-Olu%c5%9fturma/Kopyalama">Git Temelleri</a></h2> <ol> <li> 2.1 <a href="/book/tr/v2/Git-Temelleri-Bir-Git-Reposu-Olu%c5%9fturma/Kopyalama">Bir Git Reposu Oluşturma/Kopyalama</a> </li> <li> 2.2 <a href="/book/tr/v2/Git-Temelleri-De%c4%9fi%c5%9fikliklerin-Repoya-Kaydedilmesi">Değişikliklerin Repoya Kaydedilmesi</a> </li> <li> 2.3 <a href="/book/tr/v2/Git-Temelleri-Katk%c4%b1-Ge%c3%a7mi%c5%9fini-G%c3%b6r%c3%bcnt%c3%bcleme">Katkı Geçmişini Görüntüleme</a> </li> <li> 2.4 <a href="/book/tr/v2/Git-Temelleri-De%c4%9fi%c5%9fiklikleri-Geri-Alma">Değişiklikleri Geri Alma</a> </li> <li> 2.5 <a href="/book/tr/v2/Git-Temelleri-Uzak-Repo-ile-%c3%87al%c4%b1%c5%9fmak">Uzak Repo ile Çalışmak</a> </li> <li> 2.6 <a href="/book/tr/v2/Git-Temelleri-Etiketleme">Etiketleme</a> </li> <li> 2.7 <a href="/book/tr/v2/Git-Temelleri-Komut-K%c4%b1sayolu-Alias-Ayarlama">Komut Kısayolu (Alias) Ayarlama</a> </li> <li> 2.8 <a href="/book/tr/v2/Git-Temelleri-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/tr/v2/Git-Dallar%c4%b1-Dallar">Git Dalları</a></h2> <ol> <li> 3.1 <a href="/book/tr/v2/Git-Dallar%c4%b1-Dallar">Dallar</a> </li> <li> 3.2 <a href="/book/tr/v2/Git-Dallar%c4%b1-K%c4%b1saca-Dalland%c4%b1rma-ve-Birle%c5%9ftirme-Temelleri">Kısaca Dallandırma ve Birleştirme Temelleri</a> </li> <li> 3.3 <a href="/book/tr/v2/Git-Dallar%c4%b1-Dal-Y%c3%b6netimi">Dal Yönetimi</a> </li> <li> 3.4 <a href="/book/tr/v2/Git-Dallar%c4%b1-%c4%b0%c5%9f-Ak%c4%b1%c5%9f%c4%b1-Dalland%c4%b1rmas%c4%b1">İş Akışı Dallandırması</a> </li> <li> 3.5 <a href="/book/tr/v2/Git-Dallar%c4%b1-Uzak-Dallar">Uzak Dallar</a> </li> <li> 3.6 <a href="/book/tr/v2/Git-Dallar%c4%b1-Yeniden-Temelleme-rebase">Yeniden Temelleme (rebase)</a> </li> <li> 3.7 <a href="/book/tr/v2/Git-Dallar%c4%b1-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-%c4%b0leti%c5%9fim-Kurallar%c4%b1-Protocols">Bir Sunucuda Git Kurma</a></h2> <ol> <li> 4.1 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-%c4%b0leti%c5%9fim-Kurallar%c4%b1-Protocols">İletişim Kuralları (Protocols)</a> </li> <li> 4.2 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-Bir-Sunucuda-Git-Kurma">Bir Sunucuda Git Kurma</a> </li> <li> 4.3 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-SSH-Ortak-Anahtar%c4%b1n%c4%b1z%c4%b1-Olu%c5%9fturma">SSH Ortak Anahtarınızı Oluşturma</a> </li> <li> 4.4 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-Sunucu-Kurma">Sunucu Kurma</a> </li> <li> 4.5 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-Git-Cini-Daemon">Git Cini (Daemon)</a> </li> <li> 4.6 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-Ak%c4%b1ll%c4%b1-HTTP">Akıllı HTTP</a> </li> <li> 4.7 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-%c3%9c%c3%a7%c3%bcnc%c3%bc-Taraf-Bar%c4%b1nd%c4%b1rma-Hosting-Se%c3%a7enekleri">Üçüncü Taraf Barındırma (Hosting) Seçenekleri</a> </li> <li> 4.10 <a href="/book/tr/v2/Bir-Sunucuda-Git-Kurma-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-Da%c4%9f%c4%b1t%c4%b1k-%c4%b0%c5%9f-Ak%c4%b1%c5%9flar%c4%b1">Dağıtık Git</a></h2> <ol> <li> 5.1 <a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-Da%c4%9f%c4%b1t%c4%b1k-%c4%b0%c5%9f-Ak%c4%b1%c5%9flar%c4%b1">Dağıtık İş Akışları</a> </li> <li> 5.2 <a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-Projenin-Geli%c5%9fiminde-Rol-Almak" class="active">Projenin Gelişiminde Rol Almak</a> </li> <li> 5.3 <a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-Bir-Projeyi-Y%c3%bcr%c3%bctme">Bir Projeyi Yürütme</a> </li> <li> 5.4 <a href="/book/tr/v2/Da%c4%9f%c4%b1t%c4%b1k-Git-%c3%96zet">Özet</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/tr/v2/GitHub-Bir-Projeye-Katk%c4%b1da-Bulunmak">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/tr/v2/GitHub-Bir-Projeye-Katk%c4%b1da-Bulunmak">Bir Projeye Katkıda Bulunmak</a> </li> <li> 6.2 <a href="/book/tr/v2/GitHub-Proje-Bak%c4%b1m%c4%b1">Proje Bakımı</a> </li> <li> 6.3 <a href="/book/tr/v2/GitHub-Kurumsal-Y%c3%b6netim">Kurumsal Yönetim</a> </li> <li> 6.4 <a href="/book/tr/v2/GitHub-GitHub%e2%80%99%c4%b1-otomatikle%c5%9ftirme">GitHub’ı otomatikleştirme</a> </li> <li> 6.5 <a href="/book/tr/v2/GitHub-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-D%c3%bczeltme-Se%c3%a7imi">Git Araçları</a></h2> <ol> <li> 7.1 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-D%c3%bczeltme-Se%c3%a7imi">Düzeltme Seçimi</a> </li> <li> 7.2 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Etkile%c5%9fimli-%c4%b0zlemleme-Staging">Etkileşimli İzlemleme (Staging)</a> </li> <li> 7.3 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Saklama-ve-Silme">Saklama ve Silme</a> </li> <li> 7.4 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-%c3%87al%c4%b1%c5%9fman%c4%b1z%c4%b1-%c4%b0mzalama">Çalışmanızı İmzalama</a> </li> <li> 7.5 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Arama">Arama</a> </li> <li> 7.6 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Ge%c3%a7mi%c5%9fi-Yeniden-Yazma">Geçmişi Yeniden Yazma</a> </li> <li> 7.7 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Reset-Komutunun-Gizemleri">Reset Komutunun Gizemleri</a> </li> <li> 7.8 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-%c4%b0leri-Seviye-Birle%c5%9ftirme">İleri Seviye Birleştirme</a> </li> <li> 7.9 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Git%e2%80%99le-Hata-Ay%c4%b1klama">Git’le Hata Ayıklama</a> </li> <li> 7.11 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Alt-Mod%c3%bcller">Alt Modüller</a> </li> <li> 7.12 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Demetleme-Bundling">Demetleme (Bundling)</a> </li> <li> 7.13 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Git-Nesnesini-De%c4%9fi%c5%9ftirme">Git Nesnesini Değiştirme</a> </li> <li> 7.14 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-Kimlik-Bilgisi-Depolama">Kimlik Bilgisi Depolama</a> </li> <li> 7.15 <a href="/book/tr/v2/Git-Ara%c3%a7lar%c4%b1-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Git-Yap%c4%b1land%c4%b1rmas%c4%b1">Git’i Özelleştirmek</a></h2> <ol> <li> 8.1 <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Git-Yap%c4%b1land%c4%b1rmas%c4%b1">Git Yapılandırması</a> </li> <li> 8.2 <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Git-Nitelikleri">Git Nitelikleri</a> </li> <li> 8.3 <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Git-Kancalar%c4%b1-Hooks">Git Kancaları (Hooks)</a> </li> <li> 8.4 <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Bir-%c3%96rnek:-Mecburi-Git-Politikas%c4%b1">Bir Örnek: Mecburi Git Politikası</a> </li> <li> 8.5 <a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/tr/v2/Git-ve-Di%c4%9fer-Sistemler-%c4%b0stemci-Olarak-Git">Git ve Diğer Sistemler</a></h2> <ol> <li> 9.1 <a href="/book/tr/v2/Git-ve-Di%c4%9fer-Sistemler-%c4%b0stemci-Olarak-Git">İstemci Olarak Git</a> </li> <li> 9.2 <a href="/book/tr/v2/Git-ve-Di%c4%9fer-Sistemler-Git%e2%80%99e-Ge%c3%a7i%c5%9f">Git’e Geçiş</a> </li> <li> 9.3 <a href="/book/tr/v2/Git-ve-Di%c4%9fer-Sistemler-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Tesisat-ve-D%c3%b6%c5%9feme-Plumbing-ve-Porcelain">Dahili Git Ögeleri</a></h2> <ol> <li> 10.1 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Tesisat-ve-D%c3%b6%c5%9feme-Plumbing-ve-Porcelain">Tesisat ve Döşeme (Plumbing ve Porcelain)</a> </li> <li> 10.2 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Git-Nesneleri">Git Nesneleri</a> </li> <li> 10.3 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Git-Referanslar%c4%b1">Git Referansları</a> </li> <li> 10.4 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Packfiles">Packfiles</a> </li> <li> 10.5 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Refspec">Refspec</a> </li> <li> 10.6 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Transfer-Protokolleri">Transfer Protokolleri</a> </li> <li> 10.7 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Bak%c4%b1m-ve-Veri-Kurtarma">Bakım ve Veri Kurtarma</a> </li> <li> 10.8 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Ortam-De%c4%9fi%c5%9fkenleri">Ortam Değişkenleri</a> </li> <li> 10.9 <a href="/book/tr/v2/Dahili-Git-%c3%96geleri-%c3%96zet">Özet</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-G%c3%b6rsel-Aray%c3%bczler">Ek bölüm A: Diğer Ortamlarda Git</a></h2> <ol> <li> A1.1 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-G%c3%b6rsel-Aray%c3%bczler">Görsel Arayüzler</a> </li> <li> A1.2 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Visual-Studio-ile-Git">Visual Studio ile Git</a> </li> <li> A1.3 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Visual-Studio-Code-ile-Git">Visual Studio Code ile Git</a> </li> <li> A1.4 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Eclipse-ile-Git">Eclipse ile Git</a> </li> <li> A1.5 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Sublime-Text-ile-Git">Sublime Text ile Git</a> </li> <li> A1.6 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Bash-ile-Git">Bash ile Git</a> </li> <li> A1.7 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-Zsh-ile-Git">Zsh ile Git</a> </li> <li> A1.8 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-PowerShell-ile-Git">PowerShell ile Git</a> </li> <li> A1.9 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-A:-Di%c4%9fer-Ortamlarda-Git-%c3%96zet">Özet</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-Git-Komut-Sat%c4%b1r%c4%b1">Ek bölüm B: Git’i Uygulamalarınıza Gömmek</a></h2> <ol> <li> A2.1 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-Git-Komut-Sat%c4%b1r%c4%b1">Git Komut Satırı</a> </li> <li> A2.2 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-JGit">JGit</a> </li> <li> A2.4 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-go-git">go-git</a> </li> <li> A2.5 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-B:-Git%e2%80%99i-Uygulamalar%c4%b1n%c4%b1za-G%c3%b6mmek-Dulwich">Dulwich</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Kurulum-ve-Yap%c4%b1land%c4%b1rma-Komutlar%c4%b1">Ek bölüm C: Git Komutları</a></h2> <ol> <li> A3.1 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Kurulum-ve-Yap%c4%b1land%c4%b1rma-Komutlar%c4%b1">Kurulum ve Yapılandırma Komutları</a> </li> <li> A3.2 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Proje-Olu%c5%9fturma-Komutlar%c4%b1">Proje Oluşturma Komutları</a> </li> <li> A3.3 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-K%c4%b1saca-Poz-Snapshot-Alma">Kısaca Poz (Snapshot) Alma</a> </li> <li> A3.4 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Dalland%c4%b1rma-ve-Birle%c5%9ftirme-Komutlar%c4%b1">Dallandırma ve Birleştirme Komutları</a> </li> <li> A3.5 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Projeleri-Payla%c5%9fma-ve-G%c3%bcncelleme-Komutlar%c4%b1">Projeleri Paylaşma ve Güncelleme Komutları</a> </li> <li> A3.6 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-%c4%b0nceleme-ve-Kar%c5%9f%c4%b1la%c5%9ft%c4%b1rma-Komutlar%c4%b1">İnceleme ve Karşılaştırma Komutları</a> </li> <li> A3.7 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Hata-Ay%c4%b1klama-Debugging-Komutlar%c4%b1">Hata Ayıklama (Debugging) Komutları</a> </li> <li> A3.8 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Yamalama-Patching">Yamalama (Patching)</a> </li> <li> A3.9 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-E-Posta-Komutlar%c4%b1">E-Posta Komutları</a> </li> <li> A3.10 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Harici-Sistemler">Harici Sistemler</a> </li> <li> A3.11 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Y%c3%b6netim">Yönetim</a> </li> <li> A3.12 <a href="/book/tr/v2/Ek-b%c3%b6l%c3%bcm-C:-Git-Komutlar%c4%b1-Tesisat-Plumbing-Komutlar%c4%b1">Tesisat (Plumbing) Komutları</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.2 Dağıtık Git - Projenin Gelişiminde Rol Almak</h1> <div> <h2 id="_contributing_project">Projenin Gelişiminde Rol Almak</h2> <div class="paragraph"> <p> Proje gelişiminde alınabilecek rolleri tanımlamanın temel zorluğu, bunu yapmanın birçok farklı yolunun olmasıdır. Git çok esnek olduğundan, insanlar bir proje üzerinde birçok farklı şekilde birlikte çalışabilirler ve her proje birbirinden farklı olduğu için, size projenin gelişiminde nasıl rol almanız gerektiğini dikte etmek yanlış olur. Aktif katkıcı sayısı, seçilen iş akışı, sizin işlenen katkılara erişiminiz ve muhtemel dış katkı yöntemi gibi bazı değişkenler bu süreci etkiler.</p> </div> <div class="paragraph"> <p>İlk değişken aktif katkıcı sayısıdır: bu projeye kaç aktif katkıcı, ne sıklıkta, kod katkısında bulunuyor? Çoğu zaman, günde birkaç katkı işleyen, iki veya üç geliştirici olabilir hatta bazı durağan projeler için daha azdır. Daha büyük şirketler veya projeler için, binlerce geliştirici olabilir ve her gün yüzlerce veya binlerce katkı işlenebilir. Katkıda bulunan geliştirici sayısı arttıkça, kodunuzun temiz şekilde uygulanması veya kolayca birleştirilebilmesi konusunda daha fazla sorunla karşılaşırsınız. Gönderdiğiniz değişiklikler, siz çalışırken veya değişiklikleriniz onaylanmayı ve uygulanmayı beklerken, birleştirilen çalışmalar nedeniyle artık uyumsuz hale gelebilir veya ciddi şekilde bozulabilir.</p> </div> <div class="paragraph"> <p>Sonraki değişken: projenin kullandığı iş akışıdır. Her geliştiricinin ana kod satırına eşit yazma erişimine sahip olduğu iş akışı, merkezi mi yoksa dağıtık mıdır? Projede, tüm yamaları kontrol eden bir bakım veya birleştirme yöneticisi var mı? Tüm yamalar gözden geçirilip ve onaylanıyor mu? Bu süreçte yer alıyor musunuz? Diktatör-yaver sistemi var mı ve çalışmanızı önce onlara sunmanız mı gerekiyor?</p> </div> <div class="paragraph"> <p>Tüm bu sorular, bir projeye nasıl etkili bir şekilde katkıda bulunacağınızı ve sizin için tercih edilen veya uygulanabilir olan iş akışlarının neler olduğunu etkileyebilir. Bu soruların bazı yönlerini, basitten daha karmaşığa doğru bir dizi kullanım durumuyla ele alacağız. Bu örneklerden yola çıkarak, ihtiyacınız olan belirli iş akışlarını oluşturabileceğinizi umuyoruz.</p> </div> <div class="sect3"> <h3 id="_commit_guidelines">Katkı Rehberi</h3> <div class="paragraph"> <p>Özel kullanım durumlarını incelemeye başlamadan önce, katkı mesajları hakkında kısa bir not verelim. Katkı oluşturmak için iyi bir kılavuza sahip olmak ve ona uygun davranmak, Git ile çalışmayı ve başkalarıyla işbirliği yapmayı çok daha kolay hale getirir. Git projesi, yama göndermek amacıyla nasıl iyi bir katkı oluşturacağınız hakkında kullanışlı ipuçları sunan kullanışlı bir belgeye sahiptir. Onu Git kaynak kodunda <code>Documentation/SubmittingPatches</code> dosyasında bulabilirsiniz.</p> </div> <div class="paragraph"> <p> Öncelikle, gönderilerinizde boşluk (whitespace) hataları olmamalıdır. Git, bunu kontrol etmek için kolay bir yol sağlar: Git’in olası boşluk hataların tanımlayıp size listelemesi için, katkılamadan önce <code>git diff --check</code> komutunu çalıştırın.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/git-diff-check.png" alt="`git diff --check` çıktısı."> </div> <div class="title">Görsel 57. <code>git diff --check</code> çıktısı.</div> </div> <div class="paragraph"> <p>Eğer bunu katkılamadan önce çalıştırırsanız, diğer geliştiricileri rahatsız edebilecek boşluk sorunlarını katkılamak üzere olduğunuzu görebilirsiniz.</p> </div> <div class="paragraph"> <p>Sonraki adım, her bir katkıyı mantıksal olarak ayrı bir değişim seti olarak ayarlamaktır. Mümkünse, değişikliklerinizi sindirilebilir hale getirmeye çalışın: bütün hafta sonu beş farklı sorun üzerinde kod yazıp, Pazartesi günü hepsini tek bir devasa katkı olarak göndermeyin. Hafta sonu boyunca hiç katkı işlemeseniz bile, pazartesi günü çalışmanızı her konuya (iş paketine) -faydalı bir katkı mesajı da içeren- en az bir katkı olacak şekilde ayırın. Değişikliklerden bazıları aynı dosyayı değiştiriyorsa, dosyaları kısmen aşamalandırmak için <code>git add --patch</code> kullanmaya çalışın (<a href="/book/tr/v2/ch00/_interactive_staging">Etkileşimli İzlemleme (Staging)</a> bölümünde detaylı olarak ele alınmıştır). Tüm değişiklikler bir şekilde eklendikten sonra, ister tek katkıda işleyin ister beş, dalın ucu üzerinde yer alan nihai proje pozu aynıdır. Bu yüzden değişikliklerinizi inceleyen diğer geliştiricilerin işlerini kolaylaştırmaya çalışın.</p> </div> <div class="paragraph"> <p>Bu yaklaşım, daha sonra bir değişiklik setini çıkarmak veya geri almak istediğinizde de işleriniz büyük ölçüde kolaylaştırır. <a href="/book/tr/v2/ch00/_rewriting_history">Geçmişi Yeniden Yazma</a> bölümünde geçmişi değiştirme ve dosyaları etkileşimli olarak aşamalamayla ilgili birçok faydalı ipucu bulabilirsiniz. Bu araçları kullanarak, çalışmanızı başka birine göndermeden önce, temiz ve anlaşılabilir bir katkı geçmişi oluşturmaya yardımcı olun.</p> </div> <div class="paragraph"> <p>Akılda tutulması gereken son şey ise katkı mesajıdır. Kaliteli bir katkı mesajı oluşturma alışkanlığı, Git’i kullanmayı ve işbirliği yapmayı çok daha kolay hale getirir. Genel bir kural olarak mesajlarınız: 50 karakteri geçmeyecek şekilde, değişiklik setini özetleyen tek bir satırla başlamalı ve bir satır boşluk bıraktıktan sonra daha ayrıntılı bir açıklama içermelidir. Ayrıntılı açıklamada: değişikliğinizi neden yaptığınızı, ve uygulamanızın önceki davranışla nasıl farklılıklar içerdiğini açıklamanız gerekir. Bu takip edebileceğiniz sağlam bir yönergedir. Katkı mesajınızı emir kipiyle yazın: "Hata düzeltildi" veya "Düzeltilmiş Hata" yerine "Hata düzelt" gibi. Tim Pope tarafından yazılan <a href="https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html">şablonu</a> inceleyebilirsiniz:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-text" data-lang="text">Büyük harfle başlayan, kısa (50 karakterden az) özet Gerekirse, daha detaylı açıklayıcı metin. Yaklaşık 72 civarı karakterle anlatın. Bazı bağlamlarda, ilk satır aynı bir e-postadaki konu kısmı ve geri kalan kısım da mesaj gövdesi gibi kabul edilir. Özet ile detay arasındaki boş satır (açıklamayı tamamen atlamazsanız) kritik önemdedir. Eğer ikisini birleştirirseniz "rebase" gibi araçlar karışıklık yaşayabilir. Katkı mesajınızı emir kipiyle yazın: "Hata düzeltildi" veya "Hatayı önlüyor" yerine "Hataları düzelt" gibi ifadeler kullanın. Bu kural, `git merge` ve `git revert` gibi komutlarla oluşturulan katkı mesajlarıyla eşleşir. Daha ileri açıklamalar boş satırlardan sonra gelir. - Madde işaretleri (-, *, vb) uygundur - Genellikle madde işareti olarak tire (-) veya yıldız (*) kullanılır, ardından tek bir boşluk bırakılır ve maddeler arasında boş satırlar bulunur. (Bu kısımda anlatılan kurallar ortak görüşe göre değişebilir.) - Aynı maddede ikinci satıra geçerken bir girinti kullanılır.</code></pre> </div> </div> <div class="paragraph"> <p>Eğer tüm katkı mesajlarınız bu modele uygunsa, işbirliği yaptığınız geliştiriciler ve sizin için her şey çok daha kolay olacaktır. Git projesinin düzgün biçimlendirilmiş katkı mesajları bulunmaktadır (ne kadar güzel biçimlendirilmiş bir proje-katkı geçmişine sahip olduğunuzu görmek için <code>git log --no-merges</code> komutunu çalıştırabilirsiniz).</p> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Not</div> </td> <td class="content"> <div class="title">Dediğimizi yap, yaptığımızı değil!</div> <div class="paragraph"> <p>Bu kitaptaki birçok örnekte olduğu gibi, sırf kısa kesmek adına, böyle güzel biçimlendirilmiş katkı mesajları yazmamış olabiliriz. Uzun ve güzel mesajlar yazmak yerine, hemen <code>git commit</code> komutuna <code>-m</code> bayrağını ekleyip kullandık.</p> </div> <div class="paragraph"> <p>Yani: dediğimi yapın, yaptığımı yapmayın!</p> </div> </td> </tr> </table> </div> </div> <div class="sect3"> <h3 id="_private_team">Küçük Özel Ekipler</h3> <div class="paragraph"> <p> Muhtemelen karşılaşacağınız en basit kurulum, sadece birkaç geliştiriciyle yapacağınız özel bir projedir. Bu bağlamda "özel", kapalı kaynaklı anlamına gelir, yani dış dünyadan erişilemez. Siz ve diğer geliştiricilerin hepsi repoya itme erişimine sahipsiniz.</p> </div> <div class="paragraph"> <p>Bu geliştirme ortamında, Subversion veya başka bir merkezi sistem kullandığınızdaki gibi bir iş akışı takip edebilirsiniz. Çevrimdışı katkı işleme ve çok daha basit dallandırma ve birleştirme gibi avantajlara sahip olursunuz, ancak iş akışı yine de çok benzerdir. Temel fark, birleştirmelerin sunucu üzerinde ve katkı anında olması yerine, istemci tarafında gerçekleşmesidir. İki geliştiricinin paylaşılan bir repoda birlikte çalışmaya başladığı durumun nasıl görüneceğine bakalım. İlk geliştirici, John, repoyu kopyalar, bir değişiklik yapar ve yerel olarak katkı işler. (Örnekleri kısaltmak için, protokol mesajları <code>...</code> şeklinde yazılmıştır.)</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console"># John's Machine $ git clone john@githost:simplegit.git Cloning into 'simplegit'... ... $ cd simplegit/ $ vim lib/simplegit.rb $ git commit -am 'remove invalid default value' [master 738ee87] remove invalid default value 1 files changed, 1 insertions(+), 1 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>İkinci geliştirici, Jessica, aynı şeyi yapar: repoyu koypalar ve bir değişiklik katkılar:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console"># Jessica's Machine $ git clone jessica@githost:simplegit.git Cloning into 'simplegit'... ... $ cd simplegit/ $ vim TODO $ git commit -am 'add reset task' [master fbff5bc] add reset task 1 files changed, 1 insertions(+), 0 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>Şimdi Jessica çalışmasını sorunsuz bir şekilde sunucuya gönderiyor:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console"># Jessica's Machine $ git push origin master ... To jessica@githost:simplegit.git 1edee6b..fbff5bc master -> master</code></pre> </div> </div> <div class="paragraph"> <p>Yukarıdaki çıktının son satırı, itme işlemi ardından yararlı bir dönüş mesajı gösterir. Temel format, <code><oldref>..<newref> fromref -> toref</code> şeklindedir, burada <code>oldref</code> eski referansı, <code>newref</code> yeni referansı, <code>fromref</code> gönderilen yerel referansın adını ve <code>toref</code> güncellenen uzak referansın adını ifade eder. İleride de benzer çıktılar göreceğiniz için, bu mevzuda temel kavrayışınızın olması, repoların çeşitli durumlarını anlamanıza yardımcı olacaktır. <a href="https://git-scm.com/docs/git-push">git-itme</a> linkinde daha fazla ayrıntı bulunmaktadır.</p> </div> <div class="paragraph"> <p>Örneğimize devam edersek, bir süre sonra John bazı değişiklikler yapar, bunları yerel reposuna kaydeder ve aynı sunucuya göndermeye çalışır:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console"># John's Machine $ git push origin master To john@githost:simplegit.git ! [rejected] master -> master (non-fast forward) error: failed to push some refs to 'john@githost:simplegit.git'</code></pre> </div> </div> <div class="paragraph"> <p>Bu durumda, John’un gönderimi, Jessica’nın <em>kendi</em> değişikliklerini önceden göndermesinden dolayı başarısız olur. Eğer Subversion kullanıyorsanız bu özellikle önemlidir, çünkü iki geliştiricinin aynı dosyayı düzenlemediğini fark edeceksiniz. Subversion’da farklı dosyalar düzenlenirse sunucu otomatik olarak böyle bir birleştirme yapar, ancak Git’te <em>öncelikle</em> geliştiricilerin yerel olarak birleştirme yapmaları gerekir. Yani, John’un önce Jessica’nın yukarı akış (upstream) değişikliklerini alıp bunları yerel reposuna birleştirmesi gerekmektedir.</p> </div> <div class="paragraph"> <p>İlk adım olarak, John Jessica’nın çalışmasını alır (<code>fetch</code> sadece Jessica’nın yukarı akış çalışmasını alır, henüz John’un çalışmasına birleştirmez):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git fetch origin ... From john@githost:simplegit + 049d078...fbff5bc master -> origin/master</code></pre> </div> </div> <div class="paragraph"> <p>Bu noktada, John’un yerel reposu şuna benzer:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/small-team-1.png" alt="John’un ayrık geçmişi."> </div> <div class="title">Görsel 58. John’un ayrık geçmişi.</div> </div> <div class="paragraph"> <p>Şimdi John, çektiği Jessica’nın çalışmasını kendi yerel çalışmasına birleştirebilir:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git merge origin/master Merge made by the 'recursive' strategy. TODO | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>Eğer bu yerel birleştirme sorunsuz bir şekilde gerçekleşirse, John’ın güncellenmiş geçmişi artık şöyle görünecektir:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/small-team-2.png" alt="`origin/master’a birleştirme sonrası John’un reposu."> </div> <div class="title">Görsel 59. <code>origin/master</code>'a birleştirme sonrası John’un reposu.</div> </div> <div class="paragraph"> <p>Bu noktada, Jessica’nın çalışmalarının kendisininkini etkilemediğinden emin olmak için, John bu yeni kodu test etmek isteyebilir ve her şeyin yolundaysa, sonunda birleştirilmiş yeni çalışmasını sunucuya itebilir:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git push origin master ... To john@githost:simplegit.git fbff5bc..72bbc59 master -> master</code></pre> </div> </div> <div class="paragraph"> <p>Sonuçta, John’ın katkı geçmişi şöyle görünecektir:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/small-team-3.png" alt="`origin` sunucusuna ittikten sonra John’un katkı geçmişi."> </div> <div class="title">Görsel 60. <code>origin</code> sunucusuna ittikten sonra John’un katkı geçmişi.</div> </div> <div class="paragraph"> <p>Bu arada, Jessica <code>issue54</code> adında yeni bir tematik dal oluşturdu ve bu dala üç katkı işledi. Henüz John’un değişikliklerini çekmediği için, katkı geçmişi şöyle görünüyor:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/small-team-4.png" alt="Jessica’nın tematik dalı."> </div> <div class="title">Görsel 61. Jessica’nın tematik dalı.</div> </div> <div class="paragraph"> <p>Jessica birden John’ın sunucuya yeni bir değişiklik ittiğini öğrenir ve ona bir göz atmak ister: böylece henüz sahip olmadığı tüm yeni içerikleri sunucudan alabilecektir:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console"># Jessica's Machine $ git fetch origin ... From jessica@githost:simplegit fbff5bc..72bbc59 master -> origin/master</code></pre> </div> </div> <div class="paragraph"> <p>Bu komutla, John’ın en son yüklediği çalışmayı indirir. Jessica’nın geçmişi şimdi şöyle görünmektedir:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/small-team-5.png" alt="John’un değişikliklerini yakaladıktan sonra Jessica’nın geçmişi."> </div> <div class="title">Görsel 62. John’un değişikliklerini yakaladıktan sonra Jessica’nın geçmişi.</div> </div> <div class="paragraph"> <p>Jessica tematik dalının hazır olduğunu düşünüyor, ancak itme yapabilmek için, John’dan aldığı hangi bölümü kendi çalışmasına birleştirmesi gerektiğini öğrenmek istiyor. Bunu öğrenmek için <code>git log</code> komutunu çalıştırır:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log --no-merges issue54..origin/master commit 738ee872852dfaa9d6634e0dea7a324040193016 Author: John Smith <jsmith@example.com> Date: Fri May 29 16:01:27 2009 -0700 remove invalid default value</code></pre> </div> </div> <div class="paragraph"> <p><code>issue54..origin/master</code> sözdizimi, Git’e sadece ikinci dalda (<code>origin/master</code>) bulunan ve ilk dalda (<code>issue54</code>) bulunmayan katkıları göstermesini isteyen bir günlük (log kaydı) süzgecidir. Bu sözdizimini <a href="/book/tr/v2/ch00/_commit_ranges">Katkı Aralığı</a> bölümünde detaylı olarak ele alacağız.</p> </div> <div class="paragraph"> <p>Yukarıdaki çıktıdan, John’un işlediği ama Jessica’nın yerel çalışmasına birleştirmediği tek bir katkı olduğunu görebiliriz. Eğer Jessica <code>origin/master</code>'a birleştirirse, bu onun yerel çalışmasını değiştirecek olan tek katkı olacaktır.</p> </div> <div class="paragraph"> <p>Jessica artık tematik çalışmasını ana dalına birleştirip, John’un çalışmasını (<code>origin/master</code>) da ana dalına birleştirdikten sonra tekrar sunucuya gönderebilir.</p> </div> <div class="paragraph"> <p>Jessica <code>issue54</code> tematik dalındaki tüm çalışmalarını katkıladıktan sonra, bütün bu çalışmaları birleştirmek için ana dalına (master) geçiş yapar:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout master Switched to branch 'master' Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.</code></pre> </div> </div> <div class="paragraph"> <p>Jessica önce <code>origin/master</code> veya <code>issue54</code> 'ü birleştirebilir: ikisi de kökdalda olduğu için sıra önemli değildir. Hangi sırayı seçerse seçsin, son poz aynı olmalıdır (sadece tarih farklı olacaktır). Jessica, önce <code>issue54</code> dalını birleştirmeyi tercih eder:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git merge issue54 Updating fbff5bc..4af4298 Fast forward README | 1 + lib/simplegit.rb | 6 +++++- 2 files changed, 6 insertions(+), 1 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>Herhangi bir sorun yoktur ve gördüğünüz gibi, bu normal bir "ileri sarma" birleştirmesidir. Jessica şimdi John’ın önceden alınmış ve <code>origin/master</code> dalında beklemekte olan çalışmasını birleştirme sürecini tamamlar:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git merge origin/master Auto-merging lib/simplegit.rb Merge made by the 'recursive' strategy. lib/simplegit.rb | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>Her şey temiz bir şekilde birleştirildi ve Jessica’nın geçmişi şimdi şöyle görünüyor:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/small-team-6.png" alt="John’un değişikliklerini birleştirdikten sonra Jessica’nın geçmişi."> </div> <div class="title">Görsel 63. John’un değişikliklerini birleştirdikten sonra Jessica’nın geçmişi.</div> </div> <div class="paragraph"> <p>Artık <code>origin/master</code> Jessica’nın <code>master</code> dalından erişilebilir durumda olduğuna göre Jessica değişikliklerini itebilir durumda olmalı (tabi John bu arada daha fazla değişiklik yapıp itmemişse):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git push origin master ... To jessica@githost:simplegit.git 72bbc59..8059c15 master -> master</code></pre> </div> </div> <div class="paragraph"> <p>Her geliştirici birkaç kez katkı işlemiş ve birbirlerinin çalışmasını başarılı bir şekilde birleştirmiştir.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/small-team-7.png" alt="Tüm değişiklikleri sunucuya geri iten Jessica’nın geçmişi."> </div> <div class="title">Görsel 64. Tüm değişiklikleri sunucuya geri iten Jessica’nın geçmişi.</div> </div> <div class="paragraph"> <p>Bu, en basit iş akışlarından biridir. Bir süre çalışırsınız (genellikle bir tematik dalda) ve calışmanız birleştirilmeye hazır olduğunda bunu <code>master</code> dalınıza birleştirirsiniz. Bu çalışmayı paylaşmak isterseniz, yeni bir değişiklik varsa <code>master</code> dalınızı <code>origin/master</code> üzerinden çekip (fetch) birleştirirsiniz (merge) ve son olarak sunucudaki <code>master</code> dala itersiniz. Bu işlem genellikle şöyle olur:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/small-team-flow.png" alt="Basit bir çok geliştiricili Git iş akışı için genel olaylar dizisi."> </div> <div class="title">Görsel 65. Basit bir çok geliştiricili Git iş akışı için genel olaylar dizisi.</div> </div> </div> <div class="sect3"> <h3 id="_özel_yönetilen_ekipler">Özel Yönetilen Ekipler</h3> <div class="paragraph"> <p> Sıradaki senaryoda, daha büyük bir özel grupta projede yer alanların rollerini inceleyeceğiz. Küçük ekiplerden her birinin, büyük bir projenin sadece bir kısmı (mesela bir uygulamanın tek bir özelliği) üzerinde işbirliği yaptığı ve sonra bu ekip bazlı çalışmaların üçüncü bir tarafça birleştirildiği ortamlarda nasıl çalışacağınızı öğreneceksiniz.</p> </div> <div class="paragraph"> <p>Diyelim ki John ve Jessica bir özellik (bunu <code>featureA</code> olarak adlandıralım) üzerinde birlikte çalışırken, Jessica aynı zamanda Josie adındaki üçüncü bir geliştirici ile birlikte, ikinci bir özellik (bu da <code>featureB</code> olsun) üzerinde de çalışıyor. Bu senaryoda şirket, birim ekiplerce geliştirilen çalışmaların sadece belirli bazı mühendisler tarafından birleştirilebildiği bir birleşim-yöneticisi ağ akışı kullanıyor ve ana reponun <code>master</code> dalı sadece bu mühendisler tarafından güncellenebiliyor. Burada, tüm çalışmalar ekip temelli dallarda yapılır ve daha sonra birleştiriciler tarafından bir araya getirilebilir.</p> </div> <div class="paragraph"> <p>Hadi her iki özellik üzerinde ve iki farklı geliştiriciyle eşzamanlı çalışırken Jessica’nın iş akışını takip edelim. Varsayalım ki reposunu zaten kopyalamış ve ilk olarak <code>featureA</code> üzerinde çalışmaya karar vermiş olsun. Özelliğe yeni bir dal oluşturur ve burada bazı çalışmalar yapar:</p> </div> <div class="paragraph"> <p>Önce <code>featureA</code> için yeni bir dal oluşturur ve orada bazı çalışmalar yapar:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console"># Jessica's Machine $ git checkout -b featureA Switched to a new branch 'featureA' $ vim lib/simplegit.rb $ git commit -am 'add limit to log function' [featureA 3300904] add limit to log function 1 files changed, 1 insertions(+), 1 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>Bu noktada, çalışmalarını John ile paylaşması gerektiği için <code>featureA</code> dalındaki katkıların sunucuya iter. Jessica’nın <code>master</code> dalına itme erişimi olmadığından (yalnızca birleştiricilerin yetkisi vardı), John ile işbirliği yapabilmek için çalışmalarını başka bir dala itmesi gerekiyor:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git push -u origin featureA ... To jessica@githost:simplegit.git * [new branch] featureA -> featureA</code></pre> </div> </div> <div class="paragraph"> <p>Jessica John’a: çalışmalarını <code>featureA</code> adında bir dalda ittiğini ve isterse bakabileceğini söylemek için bir e-posta gönderir. Jessica John’dan geri bildirim beklerken, Josie ile <code>featureB</code> üzerinde çalışmasına başlamaya karar verir. Başlamak için, sunucunun <code>master</code> dalından temelleyerek tematik bir dal açar:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console"># Jessica's Machine $ git fetch origin $ git checkout -b featureB origin/master Switched to a new branch 'featureB'</code></pre> </div> </div> <div class="paragraph"> <p>Ardından <code>featureB</code> dalında birkaç katkı işler:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ vim lib/simplegit.rb $ git commit -am 'made the ls-tree function recursive' [featureB e5b0fdc] made the ls-tree function recursive 1 files changed, 1 insertions(+), 1 deletions(-) $ vim lib/simplegit.rb $ git commit -am 'add ls-files' [featureB 8512791] add ls-files 1 files changed, 5 insertions(+), 0 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>Jessica’nın reposu artık şöyle görünüyor:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/managed-team-1.png" alt="Jessica’nın ilk katkı geçmişi."> </div> <div class="title">Görsel 66. Jessica’nın ilk katkı geçmişi.</div> </div> <div class="paragraph"> <p>Jessica çalışmasını itmeye hazırdır, ancak Josie’den, içinde öncel <code>featureB</code> çalışmalarını barındıran <code>featureBee</code> adında bir dalın, daha önceden sunucuya itilmiş olduğunu bildiren e-posta alır. Jessica’nın kendi çalışmasını sunucuya göndermeden önce bu değişiklikleri kendi mevcut çalışmasıyla birleştirmesi gerekmektedir. Jessica önce Josie’nin değişikliklerini <code>git fetch</code> komutu kullanarak getirir:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git fetch origin ... From jessica@githost:simplegit * [new branch] featureBee -> origin/featureBee</code></pre> </div> </div> <div class="paragraph"> <p>Jessica’nın halen <code>featureB</code> dalında olduğunu varsayarsak, Josie’nin çalışmasını bu dal ile <code>git merge</code> kullanarak hemen birleştirebilir:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git merge origin/featureBee Auto-merging lib/simplegit.rb Merge made by the 'recursive' strategy. lib/simplegit.rb | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>Jessica şimdi bu birleştirilmiş "featureB" çalışmasını hepsini sunucuya geri itmeyi düşünüyor, ancak kendi <code>featureB</code> dalını doğrudan itmek istemiyor. Zaten Josie’nin bir kökdal olarak başlattığı <code>featureBee</code> mevcut olduğundan, Jessica <em>oraya</em> itmek istiyor. Ve bunu şöyle yapıyor:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git push -u origin featureB:featureBee ... To jessica@githost:simplegit.git fba9af8..cd685d1 featureB -> featureBee</code></pre> </div> </div> <div class="paragraph"> <p>Bu, bir <em>refspec</em> olarak adlandırılır. Git refspec’lerin detaylı bir incelemesi ve onunla daha başka neler yapılacağını görmek için <a href="/book/tr/v2/ch00/_refspec">Refspec</a> bağlantısına bakabilirsiniz. Ayrıca <code>-u</code> bayrağına da dikkat edin: bu --set-upstream` ifadesinin kısaltmasıdır ve dalları daha kolay itme ve çekme işlemleri için yapılandırır.</p> </div> <div class="paragraph"> <p>Jessica ansızın John’dan, beraber çalıştıkları <code>featureA</code> dalında, bazı değişiklikler yaptığını belirten bir e-posta alır ve Jessica’dan bunlara bakmasını ister. Jessica tekrardan John’un en son çalışmasını da içeren sunucudan <em>tüm</em> yeni içeriği getirmek için basit bir <code>git fetch</code> komutu çalıştırır:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git fetch origin ... From jessica@githost:simplegit 3300904..aad881d featureA -> origin/featureA</code></pre> </div> </div> <div class="paragraph"> <p>Jessica, yeni alınan <code>featureA</code> dalının içeriğini kendi yerel kopyasıyla karşılaştırarak, John’un yeni çalışmasının günlüğünü görüntüleyebilir:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log featureA..origin/featureA commit aad881d154acdaeb2b6b18ea0e827ed8a6d671e6 Author: John Smith <jsmith@example.com> Date: Fri May 29 19:57:33 2009 -0700 changed log output to 30 from 25</code></pre> </div> </div> <div class="paragraph"> <p>Jessica gördüğü işi beğenir ve John’un yeni çalışmasını yerel <code>featureA</code> dalına birleştirmek ister:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout featureA Switched to branch 'featureA' $ git merge origin/featureA Updating 3300904..aad881d Fast forward lib/simplegit.rb | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>Son olarak, Jessica muhtemelen tüm bu birleştirilen içeriğe birkaç küçük değişiklik eklemek isteyecektir. Bu yüzden, gerekli değişiklikleri yapar, bunları yerel <code>featureA</code> dalına katkılar ve sonucu sunucuya geri iter.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git commit -am 'small tweak' [featureA 774b3ed] small tweak 1 files changed, 1 insertions(+), 1 deletions(-) $ git push ... To jessica@githost:simplegit.git 3300904..774b3ed featureA -> featureA</code></pre> </div> </div> <div class="paragraph"> <p>Jessica’nın katkı geçmişi şöyle görünmektedir:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/managed-team-2.png" alt="feature dalına katkıladıktan sonra Jessica’nın geçmişi."> </div> <div class="title">Görsel 67. feature dalına katkıladıktan sonra Jessica’nın geçmişi.</div> </div> <div class="paragraph"> <p>Jessica, Josie ve John, birleşim yöneticilerine, <code>featureA</code> ve <code>featureBee</code> adlı dalların ana gövdeye birleştirilmeye hazır olduğunu bildirirler. Bu dallar ana gövdeye birleştirildikten sonra yapılacak bir çekme işlemi, yeni birleştirme katkısın indirecek ve geçmiş şu şekilde görünecektir:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/managed-team-3.png" alt="Her iki tematik dalı birleştirdikten sonra Jessica’nın geçmişi."> </div> <div class="title">Görsel 68. Her iki tematik dalı birleştirdikten sonra Jessica’nın geçmişi.</div> </div> <div class="paragraph"> <p>Birçok ekibin Git’e geçme sebebi, paralel işleyen farklı dallar üzerindeki eşzamanlı çalışmaları sürecin sonunda rahatça birleştirme yeteneğidir. Bir takımın daha küçük alt gruplarının, tüm ekibi dâhil etmek veya engellemek zorunda kalmadan uzak dallar aracılığıyla işbirliği yapabilme yeteneği, Git’in büyük bir avantajıdır. Burada gördüğünüz iş akışı bunu göstermektedir:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/managed-team-flow.png" alt="Yönetilen ekip iş akışının temel sıralaması."> </div> <div class="title">Görsel 69. Yönetilen ekip iş akışının temel sıralaması.</div> </div> </div> <div class="sect3"> <h3 id="_public_project">Çatallanmış Açık Projeler</h3> <div class="paragraph"> <p> Açık (herkese açık kaynak kodlu) projelere katkı sağlamak biraz farklıdır. Projedeki dalları doğrudan güncelleme izniniz olmadığı için, çalışmanızı yürütücülere (maintainer) başka bir şekilde ulaştırmalısınız. Bu ilk örnek, çatal oluşturma imkanı sunan Git barındırma siteleri üzerinden katkı sağlama sürecini açıklar. GitHub, BitBucket, repo.or.cz ve benzeri birçok barındırma sitesi bunu destekler ve birçok proje yürütücüsü bu tarz bir katkı bekler. Sonraki bölüm, katkı sağlanan yamaların e-posta aracılığıyla kabul edildiği projeleri ele alır.</p> </div> <div class="paragraph"> <p>İlk olarak ana repoyu kopyalamanız gerekmektedir. Ardından katkıda bulunmayı planladığınız yama veya yama dizisi için bir tematik dal oluşturacak ve çalışmanızı burada yapacaksınız. Temel olarak bu sıralama şöyle görünür:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git clone <url> $ cd project $ git checkout -b featureA ... work ... $ git commit ... work ... $ git commit</code></pre> </div> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Not</div> </td> <td class="content"> <div class="paragraph"> <p>İşinizi tek katkı işleyecek şekilde sıkıştırmak veya yamayı inceleyecek bakım görevlisinin işini kolaylaştırmak amacıyla işi katkılar halinde yeniden düzenlemek için <code>rebase -i</code> komutunu kullanmak isteyebilirsiniz. Etkileşimli temelleme (interactive rebasing) hakkında daha fazla bilgi için <a href="/book/tr/v2/ch00/_rewriting_history">Geçmişi Yeniden Yazma</a> bölümüne bakabilirsiniz.</p> </div> </td> </tr> </table> </div> <div class="paragraph"> <p>Daldaki çalışmanız bittiğinde ve bunu yürütücülere katkı olarak göndermeye hazır olduğunuzda, orijinal proje sayfasına gidin ve "Fork" düğmesine tıklayarak, kendi yazılabilir çatalınızı oluşturun. Ardından, bu repo URL’sini yerel reponuzun yeni bir uzak reposu olarak eklemelisiniz. Hadi ona <code>myfork</code> adını verelim:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git remote add myfork <url></code></pre> </div> </div> <div class="paragraph"> <p>Sonra, yeni çalışmanızı bu repoya göndermeniz gerekir. Çalıştığınız tematik dalınızı çatallamış olduğunuz depoya göndermek, onu master dalınıza birleştirip ardından da itmekten daha kolaydır. Bunun nedeni, çalışmanızın kabul edilmemesi veya ayıklanması (cherry-pick) durumunda ana dalınızı geri sarmanız gerekmemesidir (Git <code>cherry-pick</code> işlemi <a href="/book/tr/v2/ch00/_rebase_cherry_pick">Temelleme ve Ayıklama (Cherry-Picking) İş Akışları</a> bölümünde daha ayrıntılı olarak ele alınmıştır). Eğer yürütücüler çalışmanızı birleştirir, yeniden temeller veya ayıklarsa, çalışmanızı onların reposundan çekerek alabilirsiniz.</p> </div> <div class="paragraph"> <p>Her durumda, çalışmanızı şu şekilde itebilirsiniz:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git push -u myfork featureA</code></pre> </div> </div> <div class="paragraph"> <p> Çalışmanız reponun size ait çatalına itildikten sonra, orjinal projenin yürütücülerini çalışmanızı birleştirmelerini istediğinize dair bilgilendirmelisiniz. Bu genellikle bir <em>çekme isteği</em> (pull request) olarak adlandırılır ve genellikle web sitesi üzerinden oluşturulur (GitHub’ın kendi "Çekme İsteği" mekanizması vardır, bu konuyu <a href="/book/tr/v2/ch00/ch06-github">GitHub</a> bölümünde ele alacağız) ya da <code>git request-pull</code> komutunu çalıştırıp ardından üretilen çıktıyı proje yürütücüsüno manuel olarak e-posta yoluyla gönderebilirsiniz.</p> </div> <div class="paragraph"> <p><code>git request-pull</code> komutu, tematik dalınızı çekmek istediğiniz temel dalı ve çekilmesini istediğiniz Git deposunun URL’sini alır ve çekilecek tüm değişikliklerin bir özetini üretir. Örneğin, Jessica’nın John’a bir çekme isteği göndermek istediğini ve yeni gönderdiği tema dalında iki değişiklik yaptığını varsayalım, bu durumda şunu çalıştırabilir:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git request-pull origin/master myfork The following changes since commit 1edee6b1d61823a2de3b09c160d7080b8d1b3a40: Jessica Smith (1): added a new function are available in the git repository at: git://githost/simplegit.git featureA Jessica Smith (2): add limit to log function change log output to 30 from 25 lib/simplegit.rb | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-)</code></pre> </div> </div> <div class="paragraph"> <p>Katkıların özetini gösteren, çalışmanın nereden dallandığını ve yeni çalışmanın nereden çekileceğini belirten bu çıktı, yürütücüye gönderilebilir.</p> </div> <div class="paragraph"> <p>Yürütücü olmadığınız bir projede, genellikle <code>origin/master</code> ı izleyen <code>master</code> gibi bir dalın bulunması ve çalışmanızı, reddedilmesi durumunda kolayca silebileceğiniz, tematik dallar üzerinde yapmanız daha kolay olur. İş paketlerinin tematik dallara — kök daldan izole şekilde — kısıtlanması, çalıştığınız süre zarfında ana repo ucunun ilerlemiş olması ve sizin katkılarınızın artık temiz bir şekilde uygulanamaması durumunda da işinizi yeniden düzenlemenizi kolaylaştırır. Örneğin, projeye ikinci bir iş başlığı göndermek istiyorsanız, zaten yukarı itilmiş olan tematik dalda çalışmaya devam etmeyin; ana repo <code>master</code> dalından tekrar başlayın:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout -b featureB origin/master ... work ... $ git commit $ git push myfork featureB $ git request-pull origin/master myfork ... email generated request pull to maintainer ... $ git fetch origin</code></pre> </div> </div> <div class="paragraph"> <p>Artık her bir başlığımız, yama kuyruğunda (patch queue) olduğu gibi: yeniden yazabileceğiniz, temelleyebileceğiniz ve başka konu başlıklarından bağımsız ve birbirini etkilemeden değiştirebileceğiniz bir iş ambarı içinde bulunuyor. Şunun gibi:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/public-small-1.png" alt="`featureB` çalışmasının öncel katkı geçmişi."> </div> <div class="title">Görsel 70. <code>featureB</code> çalışmasının öncel katkı geçmişi.</div> </div> <div class="paragraph"> <p>Diyelim ki, yürütücü birçok başka yamayı çekmiş ve sizin ilk dalınızı çekmeyi de denemiş, ancak artık temiz bir şekilde birleşmiyor. Bu durumda, bu dalı <code>origin/master</code>'ın üzerine temellemeyi deneyebilir ve yürütücü için çatışmaları çözüp, ardından değişikliklerinizi yeniden gönderebilirsiniz.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout featureA $ git rebase origin/master $ git push -f myfork featureA</code></pre> </div> </div> <div class="paragraph"> <p>Bu, şimdi geçmişinizi <a href="/book/tr/v2/ch00/psp_b"><code>featureA</code> çalışmasından sonra katkı geçmişi.</a> gibi yeniden yazar.</p> </div> <div id="psp_b" class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/public-small-2.png" alt="`featureA` çalışmasından sonra katkı geçmişi."> </div> <div class="title">Görsel 71. <code>featureA</code> çalışmasından sonra katkı geçmişi.</div> </div> <div class="paragraph"> <p>Dalı yeniden temellendirdiniz; bu yüzden sunucudaki <code>featureA</code> dalını, kendi soyundan gelmeyen bir katkıyla değiştirebilmek için itme komutunuza <code>-f</code> bayrağı eklemelisiniz. Başka bir alternatif ise, bu yeni çalışmayı sunucuda farklı (mesela <code>featureAv2</code> olarak adlandırılmış) bir dala itmektir.</p> </div> <div class="paragraph"> <p>Bir başka olası senaryoya bir göz atalım: yürütücü ikinci dalınızdaki çalışmayı inceledi ve yaklaşımınızı beğendi, ancak uygulamadi bir detayı değiştirmenizi istiyor. Bu fırsatı, çalışmanın projenin mevcut <code>master</code> dalına dayandırılmasını sağlamak için de kullanacaksınız. Mevcut <code>origin/master</code> dalına dayanan yeni bir dal başlatırsınız; burada <code>featureB</code> değişikliklerini birleştirir, çatışmaları çözer, uygulama değişikliğini yapar ve ardından bunu yeni bir dal olarak itersiniz:</p> </div> <div class="paragraph"> <p></p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout -b featureBv2 origin/master $ git merge --squash featureB ... change implementation ... $ git commit $ git push myfork featureBv2</code></pre> </div> </div> <div class="paragraph"> <p><code>--squash</code> seçeneği birleştirilen dal üzerindeki tüm çalışmayı alır ve bunu bir birleştirme katkısı oluşturmadan - ama gerçek bir birleştirme gerçekleştiğinde oluşan bir repo durumu üretecek şekilde - bir değişiklik kümesine sıkıştırır. Bunun anlamı, gelecekteki birleştirme katkınızın yalnızca bir önceli olmasıdır. Ayrıca, diğer dalın tüm değişikliklerini tanıtmanıza ve ardından yeni bir katkı işlemine geçmeden önce daha fazla değişiklik yapmanıza izin verir Ek olarak, varsayılan birleştirme işlemi durumunda, birleştirme katkısını geciktirmek için <code>--no-commit</code> seçeneğini kullanabilirsiniz.</p> </div> <div class="paragraph"> <p>Bu noktada, istenen değişiklikleri yaptığınızı ve bu değişikliklere <code>featureBv2</code> dalından ulaşabileceklerini proje yürütücüsüne bildirebilirsiniz.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/tr/v2/images/public-small-3.png" alt="`featureBv2` çalışmasının ardından katkı geçmişi."> </div> <div class="title">Görsel 72. <code>featureBv2</code> çalışmasının ardından katkı geçmişi.</div> </div> </div> <div class="sect3"> <h3 id="_project_over_email">E-posta Üzerinden Açık Projeler</h3> <div class="paragraph"> <p> Çok sayıda proje, yamaları kabul etmek için belirlenmiş yönergeler kullanır. Bunlar birbirinden farklılık göstereceği için, her proje için bu yönergeleri kontrol etmeniz gerekecektir. Yamaları geliştirici posta listesi üzerinden kabul eden birkaç eski ve büyük proje olduğundan, şimdi bir örnekle bunu ele alacağız.</p> </div> <div class="paragraph"> <p>Bu iş akışı, bir önceki kullanım durumuna benzer; üzerinde çalıştığınız her yama serisi için tematik dallar oluşturursunuz. Fark, onları projeye nasıl gönderdiğinizdedir. Projeyi çatallayıp kendi yazılabilir sürümünüze itmek yerine, her bir katkı serisinin e-posta sürümlerini oluşturur ve geliştirici posta listesine e-posta olarak gönderirsiniz:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout -b topicA ... work ... $ git commit ... work ... $ git commit</code></pre> </div> </div> <div class="paragraph"> <p> Şimdi posta listesine göndermek istediğiniz iki katkınız var. Geliştirici listesine e-posta olarak gönderebileceğiniz mbox biçimli dosyalar oluşturmak için <code>git format-patch</code> komutu kullanırsınız. Bu komut her katkıyı; ilk satırı e-postanın başlık kısmına ve geri kalan mesaj ve yama da e-postanın gövde kısmına denk düşen bir e-posta’ya dönüştürür. Bu yöntemin güzel yanı: <code>format-patch</code> ile oluşturulan bir e-postadan yama uygulayarak, tüm katkı bilgilerinin düzgün bir şekilde korunmasıdır.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git format-patch -M origin/master 0001-add-limit-to-log-function.patch 0002-changed-log-output-to-30-from-25.patch</code></pre> </div> </div> <div class="paragraph"> <p><code>format-patch</code> komutu oluşturduğu yama dosyalarının isimlerini yazdırır. <code>-M</code> bayrağı Git’e yeniden adlandırmaları aramasını söyler. Dosyalar en sonda şöyle görünür:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ cat 0001-add-limit-to-log-function.patch From 330090432754092d704da8e76ca5c05c198e71a8 Mon Sep 17 00:00:00 2001 From: Jessica Smith <jessica@example.com> 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 --- lib/simplegit.rb | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/lib/simplegit.rb b/lib/simplegit.rb index 76f47bc..f9815f1 100644 --- a/lib/simplegit.rb +++ b/lib/simplegit.rb @@ -14,7 +14,7 @@ class SimpleGit end def log(treeish = 'master') - command("git log #{treeish}") + command("git log -n 20 #{treeish}") end def ls_tree(treeish = 'master') -- 2.1.0</code></pre> </div> </div> <div class="paragraph"> <p>Ayrıca, katkı mesajında görünmesini istemediğiniz e-posta listesi için daha fazla bilgi ekleyerek bu yama dosyalarını düzenleyebilirsiniz. Eğer <code>---</code> satırı ve yama başlangıcı (<code>diff --git</code> satırı) arasına metin eklerseniz, geliştiriciler bunu okuyabilir; ancak bu içerik yamalama işlemi tarafından yok sayılır.</p> </div> <div class="paragraph"> <p>Bir posta listesine e-posta göndermek için, ya dosyayı e-posta içeriğinize kopyala-yapıştır yoluyla ekler ya da komut satırı aracılığıyla gönderebilirsiniz. Metni yapıştırmak - özellikle yeni satır ve diğer boşlukları uygun şekilde korumayan "akıllı" istemcilerde - biçimlendirme sorunlarına neden olabilir. Neyse ki Git’in sağladığı, doğru biçimlendirilmiş yamaları IMAP aracılığıyla göndermenize yardımcı olacak bir araç, size kolaylık sağlayabilir. En iyi bildiğimiz e-posta aracısı olan Gmail üzerinden bir yamanın nasıl gönderileceğini size göstereceğiz. Git kaynak kodunda yer alan <code>Documentation/SubmittingPatches</code> dosyasının sonunda, farklı e-posta programları için yazılmış detaylı yönergeleri okuyabilirsiniz.</p> </div> <div class="paragraph"> <p> İlk olarak, <code>~/.gitconfig</code> dosyanızdaki imap bölümünü yapılandırmanız gerekir. Her bir değeri ayrı ayrı <code>git config</code> komutlarıyla ayarlayabilir veya bunları manuel olarak ekleyebilirsiniz; ancak sonunda yapılandırma dosyanız şuna benzer bir şekilde olmalıdır:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ini" data-lang="ini">[imap] folder = "[Gmail]/Drafts" host = imaps://imap.gmail.com user = user@gmail.com pass = YX]8g76G_2^sFbd port = 993 sslverify = false</code></pre> </div> </div> <div class="paragraph"> <p>IMAP sunucunuz SSL kullanmıyorsa, muhtemelen son iki satıra ihtiyacınız olmayacak ve host değeri <code>imap://</code> yerine <code>imaps://</code> olacaktır. Bunu ayarladıktan sonra, <code>git imap-send</code> komutunu kullanarak belirtilen IMAP sunucusunun Taslaklar klasörüne yama serisini yerleştirebilirsiniz:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ cat *.patch |git imap-send Resolving imap.gmail.com... ok Connecting to [74.125.142.109]:993... ok Logging in... sending 2 messages 100% (2/2) done</code></pre> </div> </div> <div class="paragraph"> <p>Bu aşamada, Taslaklar klasörüne giderek, "Alıcı" alanını gönderdiğiniz yama serisinin e-posta listesine göre ayarlayabilir ve gerekirse proje yürütücüsünü veya ilgili kişiyi "CC" olarak ekleyebilirsiniz. Artık e-postanızı göndermeye hazırsınız.</p> </div> <div class="paragraph"> <p>Ayrıca yamaları bir SMTP sunucusu aracılığıyla da gönderebilirsiniz. Aynı yukarıda olduğu gibi, her değeri ayrı ayrı <code>git config</code> komutlarıyla ayarlayabilir veya <code>~/.gitconfig</code> dosyanızdaki "sendemail" bölümüne manuel olarak ekleyebilirsiniz:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-ini" data-lang="ini">[sendemail] smtpencryption = tls smtpserver = smtp.gmail.com smtpuser = user@gmail.com smtpserverport = 587</code></pre> </div> </div> <div class="paragraph"> <p>Bunu yaptıktan sonra, yamalarınızı göndermek için <code>git send-email</code> komutunu kullanabilirsiniz:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git send-email *.patch 0001-added-limit-to-log-function.patch 0002-changed-log-output-to-30-from-25.patch Who should the emails appear to be from? [Jessica Smith <jessica@example.com>] Emails will be sent from: Jessica Smith <jessica@example.com> Who should the emails be sent to? jessica@example.com Message-ID to be used as In-Reply-To for the first email? y</code></pre> </div> </div> <div class="paragraph"> <p>Sonra, Git gönderdiğiniz her bir yaman için şöyle bir günlük bilgisi çıkarır:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-text" data-lang="text">(mbox) Adding cc: Jessica Smith <jessica@example.com> from \line 'From: Jessica Smith <jessica@example.com>' OK. Log says: Sendmail: /usr/sbin/sendmail -i jessica@example.com From: Jessica Smith <jessica@example.com> To: jessica@example.com Subject: [PATCH 1/2] added limit to log function Date: Sat, 30 May 2009 13:29:15 -0700 Message-Id: <1243715356-61726-1-git-send-email-jessica@example.com> X-Mailer: git-send-email 1.6.2.rc1.20.g8c5b.dirty In-Reply-To: <y> References: <y> Result: OK</code></pre> </div> </div> </div> <div class="sect3"> <h3 id="_özet_5">Özet</h3> <div class="paragraph"> <p>Bu bölüm, karşılaşabileceğiniz birkaç farklı Git projesi türüyle başa çıkmanın yaygın iş akışlarını anlattı ve bu süreci yönetmenize yardımcı olacak birkaç yeni aracı tanıttı. Şimdi, işin diğer yüzüyle nasıl çalışılacağını göreceksiniz: Bir Git projesini yürütmek. Bir hayırsever diktatör veya birleştirme yöneticisi olmayı öğreneceksiniz.</p> </div> </div> <div id="nav"><a href="/book/tr/v2/Dağıtık-Git-Dağıtık-İş-Akışları">prev</a> | <a href="/book/tr/v2/Dağıtık-Git-Bir-Projeyi-Yürütme">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>