Giriş
Git günümüzde oldukça popüler bir sürüm kontrol sistemidir. Bu yazıda, master branch üzerinde yapılmış ancak henüz commit edilmemiş değişikliklerin yeni bir branch üzerine nasıl taşınacağını inceleyeceğiz. Git hakkında temel bilgiler için buradan faydalanabilirsiniz.
Git projesine yeni özellik eklenmesi
Git tarafından yönetilen bir projeye yeni bir özellik eklerken kullanılan genel akışı şu şekildedir.
- Yeni bir “feature/development” benzeri isimde branch oluşturulur, ardından o branch’e geçilir.
- Geliştirme tamamlanır ve local repository üzerinde commit edilir.
- Feature branch (feature/development) remote repository üzerine push edilir ve pull request oluşturulur.
- Pull request, takım üyeleri tarafından incelendikten sonra yeni değişiklikler master branch veya yayın yapılacak olan branch ile birleştirilir.
Problem
Bazen değişiklikler yapmaya başlarız fakat yeni bir feature branch oluşturmayı ve buna geçmeyi unutabiliriz. Sonuç olarak, değişikliklerimizi gerçekleştireceğimiz zaman, yanlış branch üzerinde olduğumuzu fark edebiliriz. Örneğin bütün değişiklikleri master branch üzerinde yaptığımızı fark edebiliriz. Çoğu zaman remote master branch, üzerine doğrudan commit edilemeyecek şekilde yapılandırılır. Bu nedenle yeni bir feature branch oluşturmamız ve commit edilmeyen işleri yeni branch üzerine taşımamız gerekir. Burada önemli olan nokta, ana branch üzerinde bir değişikliğin yapılmamasıdır.
Örnek bir senaryoyu aşağıdaki adımlarla inceleyebiliriz. Branch durumlarını görüntülemek için komutlar aşağıdaki gibidir.
$ git branch
* master
$ git status
On branch master
nothing to commit, working tree clean
Yukarıdaki çıktıdan da görebileceğimiz gibi, şu anda master branch üzerindeyiz ve temiz bir branch olduğu görünüyor.
Projemize login.html diye bir dosya ekleyerek değişiklikleri izleyecek olursak:
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
login.html
nothing added to commit but untracked files present (use "git add" to track)
Yukarıdaki çıktının gösterdiği gibi, yeni bir login.html dosyası eklendi. Şimdi tam bu anda, işin master branch yerine bir fature branch üzerine eklenmesi gerektiğini fark ediyoruz.
Git yeni branch oluşturma
Yeni bir brach oluşturmak için git checkout <BranchName> komutu kullanılır. Yeni brach oluşturup oluşturulan brach’e geçiş yapmak için git checkout -b <BranchName> komutu kullanılır. Ayrıca, bu komut mevcut branch’i olduğu gibi bırakacak ve tüm commit edilmemiş değişiklikleri yeni branch üzerine getirecektir.
$ git checkout -b feature/login
Switched to a new branch 'feature/login'
$ git status
On branch feature/login
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
login.html
nothing added to commit but untracked files present (use "git add" to track)
Yukarıdaki komutlardan anlaşıldığı gibi, feature/login isimli branch oluşturuldu ve commit edilmeyen tüm değişiklikler master branch üzerinden dan feature/login branch üzerine taşındı. Artık, değişikliklere stage ve commit işlemleri uygulanabilir. İki işlemi bir arada yapan komutlar aşağıdaki gibidir.
$ git add . && git commit -m "Created login page."
[feature/login (root-commit) 0f18133] Created login page.
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 login.html
Şimdi master branch üzerinde onu değiştirmeden bıraktığımızdan emin olmalıyız.
$ git checkout master
Switched to branch 'master'
$ git status
On branch master
nothing to commit, working tree clean
Master branch üzerinde her hangi bir değişiklik olmadığı görülüyor.
İşler yeni branch üzerinde commit edildiğinden dolay bu branch (feature/login) remote repository’ye aktarılabilir.
$ git push -u origin feature/login
Remote repository üzerinde değişiklikler yine feature/login branch üzerinde oluşturulmuştur. Artık remote repository de, pull request ile değişiklikler master branch üzerinde birleştirilebilir. Birleştirme işleminden sonra local repository üzerinde master branch’e geçilerek pull işlemi ile master branch güncellenir.
$ git checkout master
Switched to branch 'master'
$ git pull origin master
Local repository master branch güncellenmiş olur.