Gelişmiş Git Kılavuzu: Git Stash, Reset, Rebase ve Daha Fazlası

Yayınlanan: 2022-03-11

Her geliştiricinin sürüm kontrolünü iyi anlaması gerekir ve Git, yazılım geliştirmede sürüm kontrolü için fiili standart haline geldi.

Ancak geliştiriciler çoğu zaman yalnızca birkaç basit komut öğrenir ve Git geçmişinin gücünü ve Git'in sizi çok daha verimli kılmak için yapabileceği diğer şeyleri gözden kaçırır. Örneğin, git tag kullanarak Git ile sürümleri yönetmek çok kolaydır.

Git online'da (Github ile) ileri düzey bir kurs aldım ve Github ile birlikte yeni başlayanlar için Git sınıfını öğretmeye devam ettim. Favori Git özelliklerim hakkında çok fazla teknik makale olmadığını fark ettiğimde, bunu geliştirici arkadaşlarımla paylaşma şansına atladım. Bu gönderide, aşağıdaki gelişmiş Git işlevlerinden nasıl yararlanacağınızı öğreneceksiniz:

  • git stash , kodunuzun geçici, yerel olarak kaydedilmesini sağlar
  • bir taahhütte bulunmadan önce kodunuzu düzenlemenizi sağlayan git reset
  • git bisect , kötü taahhütleri avlamanıza izin veren bir işlev
  • taahhütlerinizi birleştirmenize izin veren git squash
  • değişikliklerin bir daldan diğerine uygulanmasına izin veren git rebase

Git Zula

Git stash, herhangi bir taahhütte bulunmadan kodunuzu kaydetmenizi sağlar. Bu nasıl faydalıdır? Aşağıdaki senaryoyu hayal edin:

Zaten üç temiz ve düzenli taahhütte bulundunuz, ancak oldukça dağınık olan bazı taahhüt edilmemiş kodunuz da var; önce hata ayıklama kodunuzu kaldırmadan taahhüt etmek istemeyeceksiniz. Sonra, bir nedenden dolayı, aniden başka bir göreve katılmanız ve şubeleri değiştirmeniz gerekiyor. Bu, genellikle main dalınızdaysanız ve özelliğiniz için yeni bir dal oluşturmayı unuttuysanız olabilir. Şu anda kodunuz şöyle görünüyor:

 $ git status On branch my-feature Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: css/common.scss no changes added to commit (use "git add" and/or "git commit -a")
 $ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; }

git stash çalıştırdığınızda, taahhüt edilmemiş kod, taahhüt edilmeden kaybolur. Saklamak, şubenize geçici bir yerel taahhüt kaydetmek gibidir. Bir zulayı uzak bir depoya göndermek mümkün değildir, bu nedenle bir zula sadece kendi kişisel kullanımınız içindir.

 $ git stash Saved working directory and index state WIP on my-feature: 49ee696 Change text color

Şubeniz artık son taahhüdünüzü yaptığınız zamanki gibi görünüyor. Artık, kodunuzu kaybetmeden veya karmaşık bir taahhütte bulunmadan şubeleri güvenle değiştirebilirsiniz. Şubenize geri döndüğünüzde ve git stash list komutunu çalıştırdığınızda, şuna benzeyen bir zula listesi göreceksiniz:

 $ git stash list stash@{0}: WIP on my-feature: 49ee696 Change text color

git stash apply . Ayrıca git stash apply stash@{1} ('1', son zuladan önceki saniyeyi ifade eder) çalıştırarak belirli bir zula uygulayabilirsiniz (birden fazla zulaladıysanız). İşte birden fazla taahhüdü saklamak ve farklı bir zula uygulamak için bir örnek:

 $ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; } $ git stash Saved working directory and index state WIP on my-feature: 49ee696 Change text color $ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..b63c664 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; } $ git stash Saved working directory and index state WIP on my-feature: 49ee696 Change text color
 $ git stash list stash@{0}: WIP on my-feature: 49ee696 Change text color stash@{1}: WIP on my-feature: 49ee696 Change text color stash@{2}: WIP on my-feature: 49ee696 Change text color $ git stash apply stash@{2} On branch my-feature Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: css/common.scss no changes added to commit (use "git add" and/or "git commit -a")

git stash apply stash@{2} , metnin rengini kırmızı olarak değiştirdiğimizde en eski saklanan kodu uyguladı.

 $ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: #333; + color: red; background-color: #f00; }

Zulayı geri yükledikten sonra işinizi taahhüt etmemeye karar verirseniz, git checkout . , kaydedilmemiş tüm kodları sıfırlar.

Git stash'in nasıl kullanılacağına başka bir örnek olarak: Diyelim ki bir tanesinde hata olan bazı yeni dosyalarınız var. Şüphelenilen hata dosyası dışındaki tüm dosyaları evrelemeden bırakın (kod saklanmak için hazırlanmalıdır), ardından bu dosyayı saklayabilir ve sorunu giderebilirsiniz. Saklanan dosya sorun değilse, saklamayı geri yükleyebilirsiniz.

 $ git status On branch my-feature Untracked files: (use "git add <file>..." to include in what will be committed) css/colors.scss nothing added to commit but untracked files present (use "git add" to track)
 $ git add css/colors.scss $ git stash Saved working directory and index state WIP on my-feature: 0d8deef delete colors $ git status On branch my-feature nothing to commit, working tree clean $ git stash apply stash@{0} On branch my-feature Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: css/colors.scss

Ayrıca, git stash branch kullanarak saklanan taahhütlerinizi yeni bir özellik şubesine veya hata ayıklama şubesine taşıyabilirsiniz:

 $ git status On branch my-feature Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: css/common.scss no changes added to commit (use "git add" and/or "git commit -a") $ git stash Saved working directory and index state WIP on my-feature: 66f3f3b Add colors file $ git stash branch debugging-branch M css/common.scss Switched to a new branch 'debugging-branch' Unstaged changes after reset: M css/common.scss On branch debugging-branch Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: css/common.scss Dropped refs/stash@{0} (d140624f60d8deef7bceb0d11fc80ed4fd47e0a1)

Bir zula uyguladığınızda, zulanın silinmediğini unutmayın. git drop kullanarak zulaları tek tek kaldırabilir veya git stash clear kullanarak tüm zulaları kaldırabilirsiniz:

 $ git stash list stash@{0}: WIP on my-feature: 66f3f3b Add colors file stash@{1}: WIP on my-feature: 0d8deef delete colors stash@{2}: WIP on my-feature: 49ee696 Change text color $ git stash drop stash@{2} Dropped stash@{2} (8ed6d2ce101aa2e28c8ccdc94cb12df8e5c468d6) $ git stash list stash@{0}: WIP on my-feature: 66f3f3b Add colors file stash@{1}: WIP on my-feature: 0d8deef delete colors $ git stash clear $ git stash list $

Git Sıfırla

Kendinizi yanlışlıkla bazı karmaşık kodlar yaptığınız bir durumda bulursanız, “yazılımdan” sıfırlama yapabilirsiniz. Bu, kodun henüz taahhüt edilmemiş gibi göründüğü anlamına gelir. Ardından, daha temiz bir taahhütte bulunmadan önce kodunuzu IDE'nizde düzenleyebilirsiniz. Bunu yapmak için git reset --soft HEAD~1 çalıştırabilirsiniz. Bu, en son taahhüdü sıfırlayacaktır. ~ örneğinden sonra sayıyı değiştirerek birden fazla işlemi geri sıfırlayabilirsiniz, örneğin git reset --soft HEAD~2 .

 $ git reset --soft HEAD~1 $ git status On branch debugging-branch Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: css/common.scss Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: css/common.scss
 $ git diff diff --git a/css/common.scss b/css/common.scss index 2090cc4..90fd457 100644 --- a/css/common.scss +++ b/css/common.scss @@ -13,6 +13,6 @@ body { font-family: "Proxima Nova", Arial, sans-serif; font-size: 13px; - color: $grey; + color: red; background-color: #f00; }

Git sıfırlama, özellikle yeni Git kullanıcılarına öğretirken biraz daha kafa karıştırıcıdır. Yazılımdan sıfırlama, gerçek bir hata için ayrılmalıdır, oysa kodu içeri ve dışarı değiştirmek için bir zula kullanılabilir.

Ayrıca donanımdan sıfırlama da yapabilirsiniz ( git reset --hard HEAD~1 ). Bu tür sıfırlama, esasen son taahhüdünüzü siler. Özellikle şubenizi zorlarsanız, taahhüdünüzü geri getirmenin bir yolu olmadığından, donanım sıfırlaması yaparken çok dikkatli olmalısınız.

Git Bisect

En sevdiğim Git aracı git bisect . Sadece birkaç kez ihtiyacım oldu ama ihtiyacım olduğunda paha biçilmezdi! Bunu öncelikle, bazı güçlü hata ayıklamalardan sonra bile kimsenin temel nedenini bulamadığı bir sorunun olduğu büyük kod tabanlarında kullandım.

git bisect , esasen verilen iki taahhüt arasında ikili bir arama yapar ve ardından size belirli bir işlemin ayrıntılarını sunar. Öncelikle Git'e, işlevselliğinizin çalıştığını bildiğiniz yerde iyi bir taahhüt ve kötü bir taahhüt vermeniz gerekir. Bir iyi ve bir kötü taahhüdünüz olduğu sürece, taahhütler arasında yıllar olabileceğini unutmayın (zamanda geriye gitseniz de, daha zor hale gelir!).

git bisect ile ilgili en eğlenceli şey, başladığınızda buggy taahhüdünü kimin yazdığını genellikle gerçekten bilmemenizdir. Hatanın nerede ortaya çıktığını bulmanın heyecanı, birkaç iş arkadaşımın bilgisayarımın etrafında toplanmasına neden oldu!

Başlamak için buggy şubesine göz atın ve iyi taahhütleri bulun. Taahhüt geçmişinizi gözden geçirmeniz ve taahhüt karmasını bulmanız, ardından o belirli taahhüdü kontrol etmeniz ve şubenizi test etmeniz gerekecek. Çalışmak için iyi ve kötü bir nokta bulduğunuzda, git bisect çalıştırabilirsiniz.

Bu senaryoda, yaptığımız bu web sitesinde metin kırmızıdır (bir UI tasarımcısı kullanabilse de) ancak nasıl ve ne zaman kırmızı yapıldığını bilmiyoruz. Bu çok basit bir örnektir, gerçek hayat senaryosunda muhtemelen çok daha az belirgin bir probleminiz olur, örneğin bir form gönderilmez/çalışmaz.

Bir git log çalıştırdığımızda, seçilecek taahhütlerin listesini görebiliriz.

 $ git log commit a3cfe7f935c8ad2a2c371147b4e6dcd1a3479a22 (HEAD -> main) Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:52:57 2021 +0100 Update .gitignore file for .DS_Store commit 246e90977790967f54e878a8553332f48fae6edc Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:51:23 2021 +0100 Change styling of page commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:50:48 2021 +0100 Change text color commit 032a41136b6653fb9f7d81aef573aed0dac3dfe9 Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:42:57 2021 +0100 Change text color commit 246e90977790967f54e878a8553332f48fae6edc Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:41:23 2021 +0100 delete colors commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:50:48 2021 +0100 Change text color commit ce861e4c6989a118aade031020fd936bd28d535b Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:07:36 2021 +0100 ...

Web sayfamı en son işleme karmasında açarsam, metin kırmızıdır, bu yüzden bir sorunum olduğunu biliyorum.

Git bisect, 1. adım: kırmızı metin içeren bir web sayfası.

Şimdi ikiye bölmeye başlıyoruz ve Git'e kötü bir taahhüdümüz olduğunu söylüyoruz.

 $ git bisect start $ git bisect bad 8d4615b9a963ef235c2a7eef9103d3b3544f4ee1

Şimdi, metnin kırmızı olmadığı yerde bir taahhüt bulmaya çalışmak için zamanda geriye gidiyoruz. Burada ilk taahhüdümü kontrol etmeye çalışıyorum…

 $ git checkout ce861e4c6989a118aade031020fd936bd28d535b Note: checking out 'ce861e4c6989a118aade031020fd936bd28d535b'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at ce861e4 Add CSS styles

…ve web sayfasını yenilemek…

Git bisect, 2. adım: siyah metin içeren bir web sayfası.

Metin artık kırmızı değil, bu yüzden bu iyi bir taahhüt! Taahhüt ne kadar yeni taahhüt edilirse, yani kötü taahhüt ne kadar yakınsa, o kadar iyidir:

 $ git checkout d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Previous HEAD position was ce861e4c6989a118aade031020fd936bd28d535b Add CSS styles HEAD is now at d647ac4 Change text color

Git şimdi size doğru olanı bulmadan önce kaç taahhüt araması gerektiğini söyleyecektir. Git'in geçeceği taahhütlerin sayısı, iyi ve kötü taahhüt arasında kaç taahhüt olduğuna bağlıdır (zaman ne kadar uzun olursa, Git'in daha fazla yinelemesi gerekir).

Şimdi, şubenizi tekrar test etmeniz ve sorununuzun ortadan kalkıp kalkmadığını görmeniz gerekecek. Modülleri düzenli olarak güncellerseniz, düğüm modüllerini ön uç deponuza yeniden yüklemeniz gerekebileceğinden, bazen bu biraz zahmetli olabilir. Veritabanı güncellemeleri varsa, bunları da güncellemeniz gerekebilir.

git bisect , iyi ve kötü taahhütlerinizin ortasında bir taahhüdü otomatik olarak kontrol eder. Burada kötü taahhüdü bulmak için bir adım tahmin ediyor.

 $ git bisect good 1cdbd113cad2f452290731e202d6a22a175af7f5 Bisecting: 1 revision left to test after this (roughly 1 step) [ce861e4c6989a118aade031020fd936bd28d535b] Add CSS styles $ git status HEAD detached at ce861e4 You are currently bisecting, started from branch '8d4615b'. (use "git bisect reset" to get back to the original branch)

Sayfayı yenileyin ve sorununuzun çözülüp çözülmediğine bakın. Sorun hala orada, bu yüzden Git'e bunun hala kötü bir taahhüt olduğunu söylüyoruz. Git, teslim aldığınız taahhüdü kullanacağından, bu sefer taahhüt karmasına başvurmaya gerek yok. Git tüm olası adımları geçene kadar bu işlemi tekrarlamamız gerekecek.

 $ git bisect bad Bisecting: 0 revisions left to test after this (roughly 0 steps) [cbf1b9a1be984a9f61b79ae5f23b19f66d533537] Add second paragraph to page

Sayfayı yenileyin ve sorunumuz tekrar ortadan kalktı, bu yüzden bu iyi bir taahhüt:

Git bisect, adım 3: bazı ek siyah metinlerle aynı web sayfası.

Bu aşamada Git ilk hatalı taahhüdü buldu:

 $ git bisect good ce861e4c6989a118aade031020fd936bd28d535b is the first bad commit commit ce861e4c6989a118aade031020fd936bd28d535b Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:52:57 2021 +0100 Add CSS styles :000000 100644 0000000000000000000000000000000000000000 092bfb9bdf74dd8cfd22e812151281ee9aa6f01a M css

Artık taahhüdün kendisini göstermek ve sorunu belirlemek için git show kullanabiliriz:

 $ git show ce861e4c6989a118aade031020fd936bd28d535b commit ce861e4c6989a118aade031020fd936bd28d535b Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:52:57 2021 +0100 Add CSS styles diff --git a/css/base.scss b/css/base.scss index e69de29..26abf0f 100644 --- a/css/base.scss +++ b/css/base.scss @@ -1,7 +1,7 @@ body { background-color: $white; margin: 0px; line-height: 20px; - color: $grey; + color: red; }

Bitirdiğinizde, şubenizi normal çalışma durumuna sıfırlamak için git bisect reset çalıştırabilirsiniz.

Taahhütler birbirine ne kadar yakın olursa, Git sorunu o kadar kolay bulabilir, ancak daha önce 10 adım atmasını sağladım ve yine de kötü taahhüdü kolayca buluyor. Çalışması garanti edilmiyor, ancak sorunu benim için çoğu zaman buldu. Tebrikler, artık bir kod arkeoloğusunuz!

Taahhütlerinizi Ezmek

Daha önce küresel bir kuruluş için açık kaynaklı bir projede tam zamanlı olarak çalıştım ve taahhütlerinizi ezmenin veya birleştirmenin ne kadar önemli olduğunu çabucak öğrendim. İşvereniniz gerektirmese bile, bunun mükemmel bir alışkanlık olduğunu düşünüyorum. Daha sonra oluşturduğunuz özellikleri gözden geçirmesi ve düzenlemesi gerekecek olan diğer geliştiriciler için özellikle önemlidir.

Neden taahhütlerini eziyorsun?

  • Deponuza katkıda bulunanların okuması daha kolaydır. Bunun gibi bir taahhüt listeniz olup olmadığını hayal edin:
    • Dönen kaydırıcıyı uygula
    • Döngüye stil ekleyin
    • Döngüye düğmeler ekleyin
    • Carousel ile IE'deki garip sorunu düzeltin
    • Karuselde kenar boşluklarını ayarlayın

    Bunları "Ana sayfaya atlıkarınca ekle" yazan tek bir taahhütte ezmek çok daha kolay.

  • Her çekme talebi yaptığınızda, taahhütlerinizi bir araya getirmeniz gerekiyorsa, taahhüt mesajlarınızı anlaşılır ve alakalı tutmanız için sizi teşvik eder. “WIP”, “giriş sayfası için hata düzeltme” veya “yazım hatasını düzelt” başlıklı bir taahhüt gördünüz mü? İlgili taahhüt adlarına sahip olmak önemlidir, örneğin “#444 giriş sayfası için Hata düzeltme - eksik $kapsam işlevi nedeniyle titremeyi düzeltin”.

Taahhütlerinizi ezmek istememenizin bir nedeni, çok ayrıntılı ve uzun bir özellik üzerinde çalışıyor olmanız ve daha sonra hatalarla karşılaşmanız durumunda kendinize günlük bir geçmiş tutmak istemeniz olabilir. O zaman özelliğinizin hatalarını ayıklamak daha kolaydır. Ancak, ana dalınızda özelliğinizi kontrol ederken ve hatasız olduğundan eminseniz, yine de ezmek mantıklıdır.

Bu senaryoda, beş taahhütte bulundum, ancak hepsi bir özellikle ilgili. Taahhüt mesajlarım ayrıca liyakatın ayrı olmasıyla çok yakından ilgilidir - tüm taahhütlerim bu yeni özellik için sayfayı şekillendirmekle ilgilidir:

 $ git log commit a8fbb81d984a11adc3f72ce27dd0c39ad24403b7 (HEAD -> main) Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 11:16:10 2021 +0100 Import colors commit e2b3ddd5e8b2cb1e61f88350d8571df51d43bee6 Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 11:15:32 2021 +0100 Add new color commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 10:50:48 2021 +0100 Change text color commit c005d9ceeefd4a8d4e553e825fa40aaafdac446e Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 09:59:57 2021 +0100 Add CSS styles commit 9e046b7df59cef07820cc90f694fabc666731bd2 Author: Ursula Clarke <[email protected]> Date: Tue Jan 11 09:56:28 2021 +0100 Add second paragraph to page commit 5aff973577d67393d914834e8af4c5d07248d628 Author: Ursula Clarke <[email protected]> Date: Mon Jan 10 16:04:22 2021 +0100 Add colors CSS file and edit background color

Ayrıca git merge --squash kullanabilirsiniz, ancak rebase kullanmanın daha net olduğunu düşünüyorum çünkü taahhütlerinizi seçtiğinizde taahhüt açıklamasını görmek daha kolaydır. Bir git merge --squash çalıştırırsanız, önce taahhütlerinizi donanımdan sıfırlamanız gerekir ( git reset --hard HEAD~1 ) ve bunu tam olarak kaç tane taahhütle yapmanız gerektiği konusunda kafanız karışması kolaydır. git rebase daha görsel buluyorum.

git rebase -i --root komutunu çalıştırarak başlayın ve komut satırındaki varsayılan metin düzenleyiciniz, taahhüt listenizle birlikte açılır:

 pick eb1eb3c Update homepage pick 5aff973 Add colors CSS file and edit background color pick 9e046b7 Add second paragraph to page pick c005d9c Add CSS styles pick d647ac4 Change text color pick e2b3ddd Add new color pick a8fbb81 Import colors # Rebase a8fbb81 onto b862ff2 (7 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Sadece son birkaç taahhüdünüzü ezmek isteyebilirsiniz, bu durumda git rebase -i HEAD~3 çalıştırabilir ve son üç taahhüdünüz size sunulabilir:

 pick eb1eb3c Update homepage pick 5aff973 Add colors CSS file and edit background color pick 9e046b7 Add second paragraph to page # Rebase b862ff2..9e046b7 onto b862ff2 (3 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Şimdi, tüm taahhütleri aşağıda gösterildiği gibi ilk taahhütte ezebiliriz.

 pick eb1eb3c Update homepage squash 5aff973 Add colors CSS file and edit background color squash 9e046b7 Add second paragraph to page # Rebase b862ff2..9e046b7 onto b862ff2 (3 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Dosyayı kaydettiğinizde Git, düzenleme mesajınızı açacaktır.

 # This is a combination of 3 commits. # This is the 1st commit message: Update homepage # This is the commit message #2: Add colors CSS file and edit background color # This is the commit message #3: Add second paragraph to page # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Wed Jan 13 18:31:28 2021 +0100 # # interactive rebase in progress; onto b862ff2 # Last commands done (3 commands done): # squash 5aff973 Add colors CSS file and edit background color # squash 9e046b7 Add second paragraph to page # No commands remaining. # You are currently rebasing branch 'main' on 'b862ff2'. # # Changes to be committed: # new file: .gitignore # new file: css/base.css # new file: css/base.scss # new file: css/colors.css # new file: css/colors.css.map # new file: css/colors.scss # new file: css/common.css # new file: css/common.scss # new file: index.html #

Rebase'i yaparken, daha kolay okunması için taahhüt açıklamasını da düzenleyebiliriz.

 Implement new design for homepage. Add .gitignore file for Sass folder. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. #

Bu dosyayı tekrar kaydedin ve işiniz bitti! Git günlüğüne bir kez daha baktığımızda, yalnızca bir temiz taahhüt olduğunu görebiliriz.

 [detached HEAD 574ec7e] Implement new design for homepage. Add .gitignore file for Sass folder. Date: Wed Jan 13 18:31:28 2021 +0100 10 files changed, 215 insertions(+) create mode 100644 .gitignore create mode 100644 css/base.css create mode 100644 css/base.scss create mode 100644 css/colors.css create mode 100644 css/colors.css.map create mode 100644 css/colors.scss create mode 100644 css/common.css create mode 100644 css/common.scss create mode 100644 index.html create mode 100644 verylargefile.txt Successfully rebased and updated refs/heads/main. $ git log commit 574ec7e5d7d7a96427e049cad9806cdef724aedd (HEAD -> main) Author: Ursula Clarke <[email protected]> Date: Wed Jan 13 18:31:28 2021 +0100 Implement new design for homepage. Add .gitignore file for Sass folder.

Git Rebase

Geliştiriciler genellikle git rebase kullanmakta tereddüt ederler çünkü bir rebase'in dosyaları kod tabanınızdan kalıcı olarak silmek için kullanılabileceğini bilirler.

Yukarıda gördüğümüz gibi, git rebase , kodunuzu saklamak, düzenlemek ve silmek için kullanılabilir - peki ya bir dosyayı gerçekten geçmişten kalıcı olarak kaldırmak istiyorsanız?

Bir keresinde geliştirme ekibimizden birinin yanlışlıkla çok büyük bir dosyayı kod tabanına kaydettiği bir senaryoya tanık olmuştum. Çok daha büyük bir dalın parçasıydı, bu yüzden büyük dosya kod incelemesinde fark edilmedi ve yanlışlıkla ana dalda kontrol edildi. Birisi depoyu yeniden klonlamak istediğinde bu bir sorun haline geldi - indirmesi çok uzun zaman aldı! Ve elbette, söz konusu dosya gereksizdi. Dosya ana şubeye yapılan son işlem olsaydı sorun olmazdı - bu durumda donanımdan sıfırlama ( git reset --hard HEAD~1 ) çalıştırabilir ve dalı itmeye zorlayabilirsiniz.

Benzer şekilde, dosya belirli bir taahhütteki tek değişiklikse, git reset --hard <commit-id> çalıştırarak tüm taahhüdü kaldırabilirsiniz. Ancak bizim senaryomuzda, büyük dosya, sondan ikinci işleme olarak, geçmişte tutmak istediğimiz diğer kodlarla birlikte işlendi.

Zahmetli taahhüdü bulduğunuzda, git checkout ve taahhüt karmasını kullanarak kontrol edin:

 $ git checkout ce861e4c6989a118aade031020fd936bd28d535b Note: checking out 'ce861e4c6989a118aade031020fd936bd28d535b'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at ce861e4 Add CSS styles

Dosyayı kaldırın veya kodunuzu düzenleyin ve korumak istediğiniz kodu (veya dosyaları) olduğu gibi bırakın.

 $ rm verylargefile.txt $ git status HEAD detached at ce861e4 Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: verylargefile.txt no changes added to commit (use "git add" and/or "git commit -a")

git add -A çalıştırdığınızdan emin olun, böylece silinen dosyanız sahnelenir ve Git onu kaldırmayı bilir. Şimdi git commit --amend -v çalıştırın ve Git sizden taahhüt mesajınızı düzenlemenizi isteyecektir.

Bundan sonra git rebase --onto HEAD <commit-id> main çalıştırın. Bu, bazı birleştirme çakışmalarıyla karşılaşabileceğiniz yerdir; bu, yeni taahhüdünüz ile eski kod arasında bir çakışma olduğu anlamına gelir. Git sizden çatışmayı çözmenizi isteyecek:

 $ git add -A $ git status HEAD detached at ce861e4 Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: verylargefile.txt $ git commit --amend -v [detached HEAD 7c9516a] Add CSS styles Date: Thu Jan 14 14:43:54 2021 +0100 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 css/common.css.map delete mode 100644 verylargefile.txt $ git status HEAD detached from ce861e4 nothing to commit, working tree clean $ git rebase --onto HEAD ce861e4 First, rewinding head to replay your work on top of it... Fast-forwarded HEAD to HEAD.

Dosyayı metin düzenleyicinizde açarsanız, Git'in dizin dosyasının iki sürümünü işaretlediğini görürsünüz. Beğendiğiniz değişiklikleri korumak için birini kaldırmanız veya düzenlemeniz yeterlidir.

 <p> Toptal was created by engineers. We are entrepreneurs, all passionate about working with top tech talent and exciting companies from all over the world. </p> <<<<<<< HEAD <p> Toptal connects the top 3% of freelance talent all over the world. </p> </main> </body> </html> ======= </main> </body> </html> >>>>>>> Add index file

<<<<<<< HEAD ile eşittir işaretleri arasındaki kod bir versiyondur ve eşittir işaretleri ile >>>>>>> Add index file arasındaki kod “Add index file” taahhüdünden gelen versiyondur. . Yani bir versiyonda “Toptal dünyanın her yerindeki en iyi %3 freelance yetenekleri birbirine bağlıyor” ek paragrafı varken diğerinde yok.

Düzenlenen dosyanızı kaydedin ve git add filename ve ardından git rebase --continue komutunu çalıştırın. Herhangi bir değişiklik yoksa git rebase --skip da çalıştırabilirsiniz. "Büyük dosya" taahhüdünüz ile main'deki en son taahhüd arasında çok fazla taahhüt varsa, yeniden temellendirmeden geçmek biraz zaman alabilir.

Sabırlı olun ve büyük bir ekipteyseniz ikinci bir görüş aldığınızdan emin olun! Mümkünse, birleştirdiğiniz taahhütleri yazan kişiye/kişilere danışmak özellikle önemlidir.

Birleştirme değişikliklerinin, en güncel değişikliklerinizle değil, geçmişteki belirli taahhütle ilgili olduğunu unutmayın. Diğer bir deyişle, sitenizdeki metin Arial iken ve şimdi Verdana iken bir taahhüdü düzenliyorsanız, bu taahhüdü yazı tipi yüzü olarak Arial'in geçmişiyle birlikte tutmalısınız.

Ayrıca Git bir boşluk veya satır sonu karakteri görürse birleştirme çakışmasına neden olabileceğini unutmayın, bu yüzden dikkatli olun!

Bağlanmak ve Çekmekten Daha Fazlası

Git, birçok geliştiricinin düşündüğünden daha güçlüdür. Bir acemi tanıtırsanız, onlara bu paha biçilmez özellikler hakkında bazı ipuçları verdiğinizden emin olun. Daha verimli bir iş akışı sağlar.

Git hakkında daha fazla bilgi edinmek mi istiyorsunuz? Toptal'ın Git İpuçları ve Uygulamalar sayfasına bir göz atın.