Ana Sayfa Dersler Kaynakça

Commit ve Değişiklikleri Geri Alma

Bu derste git log, git checkout, git clean, git revert, git reset ve git rm komutlarını öğreneceğiz. Git'te yazı editörleri gibi geleneksel "geri al" fonksiyonları olmadığını bilmek önemlidir.

Git'i bir zaman dizisi yöneticisi gibi düşünebilirsiniz. Commitler bu zaman dizisinde belirli noktaları belirtmektedir. Ayrıca, dallar kullanarak bu zaman dizisini farklı dallara ayırabiliriz. Git'te "geri aldığınızda" teknik olarak geçmişe dönüyorsunuzdur ya da aynı hatanın yapılmadığı başka bir zaman dizisine geçiyorsunuzdur.

Bu derste, bir yazılım projesinin önceki sürümleriyle çalışmak için gerekli olan tüm becerileri öğrenebileceksiniz. İlk olarak, eski commitleri keşfetmeyi nasıl yapacağınızı öğrenecek, ardından proje geçmişindeki genel commitleri geri alma ile yerel makinenizde yayınlanmamış değişiklikleri sıfırlama arasındaki farkı öğreneceksiniz.

Kaybedileni bulmak: Eski Commitleri İncelemek

Versiyon kontrol sistemlerinin prensibi herhangi bir hata yapıldığında önceki bir güvenli versiyona geri gelmektir. Böylelikle bütün kod tabanının kaybedilmesi önlenmiş olur. Bir commit geçmişi oluşturduktan sonra eski commitleri inceleyebilir ve onlara geri dönebilirsiniz. Bu eski commitleri incelemek için en önemli komut "git log" komutudur. Aşağıdaki örnekte popüler bir grafik kodunun en son commitlerini listeliyoruz.
git log --oneline
e2f9a78fe Replaced FlyControls with OrbitControls
d35ce0178 Editor: Shortcuts panel Safari support.
9dbe8d0cf Editor: Sidebar.Controls to Sidebar.Settings.Shortcuts. Clean up.
05c5288fc Merge pull request #12612 from TyLindberg/editor-controls-panel
0d8b6e74b Merge pull request #12805 from harto/patch-1
23b20c22e Merge pull request #12801 from gam0022/improve-raymarching-example-v2
fe78029f1 Fix typo in documentation
7ce43c448 Merge pull request #12794 from WestLangley/dev-x
17452bb93 Merge pull request #12778 from OndrejSpanel/unitTestFixes
b5c1b5c70 Merge pull request #12799 from dhritzkiv/patch-21
1b48ff4d2 Updated builds.
88adbcdf6 WebVRManager: Clean up.
2720fbb08 Merge pull request #12803 from dmarcos/parentPoseObject
9ed629301 Check parent of poseObject instead of camera
219f3eb13 Update GLTFLoader.js
15f13bb3c Update GLTFLoader.js
6d9c22a3b Update uniforms only when onWindowResize
881b25b58 Update ProjectionMatrix on change aspect
Her commitin kendine özel bir SHA-1 hash kodu bulunmaktadır. Bu kodlar commit zaman dizisinde seyahat etmek ve eski commitlere geri dönmek için kullanılır. Varsayılan kullanım olarak "git log" komutu sadece geçerli daldaki commitleri gösterir. Tüm dallarda yapılan commitleri listelemek için aşağıdaki komutu kullanabilirsiniz:
git log --branches=*
Geri dönmek istediğiniz bir commiting referansını bulduktan sonra "git checkout" komutunu kullanarak yerel cihazınızda o zaman dilimine geri dönüş yapabilirsiniz. Geliştirme sürecinin normal seyri sırasında, HEAD genellikle ana veya başka bir yerel dalı işaret eder, ancak önceki bir commite kontrol ettiğinizde, HEAD artık bir dala işaret etmez ve doğrudan bir commite işaret eder. Buna "ayrılmış HEAD" durumu denir ve aşağıdaki gibi görselleştirilebilir: Eski bir dosyayı kontrol etmek HEAD işaretçisinin değerini değiştirmez. Aynı dal ve commit üzerinde kalır ve "ayrılmış HEAD" durumuna girmez. Dosyanın eski versiyonunu diğer her dosya gibi commitleyebilirsiniz.

Eski Version Görüntülemek

Önce dönmek istediğiniz versiyonun kodunu bulmanız lazım. Bunu "git log" komutunu kullanarak bulabilirsiniz:
git log --oneline
Sürüm geçmişi aşağıdakine benzer şekilde görünecektir:
b7119f2 Çılgın şeyler denemeye devam
872fa7e Çılgın bir şey dene
a1e8fb5 hello.txt dosyasına önemli değişiklikler
435b61d hello.txt oluştur
9773e52 ilk commit
Git checkout komutunu kullanarak "hello.txt dosyasına önemli değişiklikler" commitine geri dönüş yapabiliriz:
git checkout a1e8fb5
Bunu kullanarak mevcut klasörün durumunu a1e8fb5 commitindeki durum ile aynı yapıyorsunuz. Dosyalara bakabilir, compile edebilir, test yürütebilir ve hatta dosyaları değiştirebilirsiniz. Yaptığınız değişiklikler projenin mevcut durumuna kaydedilmeyecektir. Projeyi geliştirmeye devam etmek için projenin mevcut durumuna geri dönmeniz gerekmektedir:
git checkout main
Burada varsayılan "main" dalda geliştirme yaptığınızı varsayıyoruz. Ana dala geri döndükten sonra git revert veya git reset komutları ile istenmeyen değişiklikleri geri alabilirsiniz.

Yapılan Commiti Geri Almak

Bu kısımda aşağıdaki durumda olan bir proje için birden fazla geri alma metotu inceleyeceğiz:
git log --oneline
872fa7e Çılgın bir şey dene
a1e8fb5 hello.txt dosyasına önemli değişiklikler
435b61d hello.txt oluştur
9773e52 ilk commit
Burada 872fa7e commitini geri almaya odaklanacağız.

Git Checkout İle Geri Alma

Git checkout komutunu kullanarak önceki commiti, a1e8fb5'i kontrol edebiliriz ve depoyu çılgın committen öncesindeki bir duruma getirebiliriz. Belirli bir commiti çıkarma, depoyu "ayrılmış HEAD" durumuna getirir. Bu, artık herhangi bir dal üzerinde çalışmadığınız anlamına gelir. Bu durumda, değişiklikleri yapılan bir dalı daha önceden belirlenmiş bir dala geri döndürdüğünüzde, yaptığınız yeni commitler tabansız kalır. Tabansız commitler, Git'in çöp toplayıcısı tarafından silinebilir. Çöp toplayıcısı, yapılandırılmış bir aralıkta çalışır ve tabansız commitleri kalıcı olarak yok eder. Tabansız commitlerin çöp toplayıcı tarafından silinmesini önlemek için bir dalda olduğumuzdan emin olmanız gerekmektedir.

Ayrılmış HEAD durumundan "git checkout -b deli_olmayan_yeni_dal" komutunu kullanarak "deli_olmayan_yeni_dal" adında yeni bir dal oluşturabilir ve o duruma geçebiliriz. Depo şimdi 872fa7e commitinin artık olmadığı yeni bir zaman dizisinde bulunuyor. Bu noktada, 872fa7e commitinin olmadığı bu yeni dalda çalışmaya devam edebilir ve onu 'geri alınmış' olarak kabul edebiliriz. Ne yazık ki, önceki dala ihtiyacınız varsa, belki de ana dalınızdı, bu geri alma stratejisi uygun değildir. Başka 'geri alma' stratejilerine göz atalım.

Git Revert İle Geri Alma

Bu sefer geri alma 'revert' işlemi deneyelim. Eğer "git revert HEAD" komutunu çalıştırırsak, Git son commitin tersini içeren yeni bir commit oluşturacaktır. Bu, mevcut dal geçmişine yeni bir commit ekler ve şimdi aşağıdaki gibi görünür:
git log --oneline
e2f9a78 Revert "Çılgın bir şey dene"
872fa7e Çılgın bir şey dene
a1e8fb5 hello.txt dosyasına önemli değişiklikler
435b61d hello.txt oluştur
9773e52 ilk commit
872fa7e commitinin hala geçmişte olmasına rağmen yeni e2f9a78 commiti onun tam tersi olduğu için değişiklikler geri alınmış sayabiliriz. Önceki metota fark olarak aynı dalı kullanmaya devam edebiliriz. Bu çözüm tatmin edici bir geri alma yöntemidir. Bu, paylaşılan genel depolarla çalışmak için ideal bir 'geri alma' yöntemidir. Eğer yönetilen ve minimum bir Git geçmişi tutma gereksinimleriniz varsa, bu strateji tatmin edici olmayabilir.

Git Reset İle Geri Alma

Bu örnek için "Git Revert İle Geri Alma" kısmından devam edeceğiz. "git reset --hard a1e8fb5" komutunu kullanırsak versiyon geçmişi o commite geri dönecektir. Artık, "git log" komutunu kullanmak bize bu görünümü verecektir:
git log --oneline
a1e8fb5 hello.txt dosyasına önemli değişiklikler
435b61d hello.txt oluştur
9773e52 ilk commit
Gördüğünüz gibi e2f9a78 ve 872fa7e commitleri tamamen zaman dizisinden silinmiş bulunmaktadır. Buradan sonra artık çalışmaya devam edebilir ve çılgın değişiklikler hiç olmamış gibi devam edebiliriz. Bu metot geçmiş açısından en temiz olanıdır. Bunu kullanmak yerel değişiklikler için harikadır, ancak uzaktan depolar için zorluklar ortaya çıkacaktır. Eğer 872fa7e commiti var olan bir paylaşılan uzaktan bir deponuz var ise Git bunu yakalayacaktır ve hemen bir hata verecektir. Git bu durumlarda sizin yerel kopyanızın eski olduğunu zannedecektir ve push işlemini durduracaktır. Bu durumlarda "git revert" kullanılması daha elverişlidir.

En Son Commiti Geri Alma

Önceki bölümde, commitleri geri alma için farklı stratejileri tartıştık. Bu stratejilerin hepsi en son commiti değiştirmek için uygulanabilir. Ancak bazı durumlarda, son commiti kaldırmanız veya sıfırlamanız gerekmez. Belki de yanlışlıkla yapılmış bir committi. Bu durumda en son commiti düzeltebilirsiniz. Çalışma dizininde daha fazla değişiklik yaptıysanız ve bunları git add kullanarak commit için hazır hale getirdiyseniz, "git commit --amend" komutunu kullanabilirsiniz. Bu, Git'in yapılandırılmış sistem düzenleyicisini açmasını sağlar ve en son commit mesajını değiştirmenize olanak tanır. Yeni değişiklikler düzeltilmiş commite eklenir.

Commit Edilmemiş Değişiklikleri Geri Alma

Çalışan Klasör

Çalışma klasörü genellikle yerel dosya sistemiyle senkron halindedir. Çalışma klasöründeki değişiklikleri geri almak için, favori düzenleyicinizi kullanarak dosyaları düzenleyebilirsiniz. Git'in çalışma klasörünü yönetmeye yardımcı olan birkaç yardımcı programı vardır. "git clean" komutu, çalışma klasöründeki yapılan değişiklikleri geri almak için bir kolaylık sağlayan bir yardımcı programdır. Ayrıca, "git reset" --mixed veya --hard seçenekleriyle kullanılabilir ve çalışma klasöründe bir sıfırlama uygular.

Staging Dizini

git add komutu, değişiklikleri staging dizinine eklemek için kullanılır. Git reset genellikle staging dizini değişikliklerini geri almak için kullanılır. --mixed reset, staging dizinindeki bekleyen değişiklikleri geri alır.