Geçen hafta kullandığım git komutları

Merhabalar, bu ay yani Ekimin başından sonuna kadar DigitalOcean firmasının düzenlemiş olduğu Hacktoberfest etkinliği var. Github üzerindeki açık kaynak kodlara toplamda 4 adet PR attığınız zaman limited-edition tişört kazanıyorsunuz. Ben de bu vesileyle geçen hafta kullandığım git komutları ve karşılaştığım birkaç senaryoyu yazacağım.

git checkout -b new_branch
Yeni branch oluşturur ve o branch’a geçer.

git checkout -D existing_branch
Var olan branch’ı siler.

git log –oneline –decorate –graph –all
Projeye ait workflow’u özetiyle gösterir.

git remote -v
Projeye bağlı olan remote’ları gösterir.

git branch
Localde bulunan branch’ları gösterir.
-v , –merged, –no-merged gibi seçenekleri de ekleyerek istediğinizi listeleyebilirsiniz.

git fetch <remote>
Uzak bir repo’daki dosyaları locale çeker. Burada remote yerine origin yazarsanız origin remote’undaki dosyaları çeker.

git log –pretty=format:”%h – %an, %ar : %s”
Github üzerinde açık kaynak projeniz varsa kimin ne katkı yaptığını gösteren kendinize göre sütunları belirleyebileceğiniz bir komut.

git reset –soft HEAD~
Sadece yaptığınız son commit’i siler, stage edilmiş dosyalar kalır.

git reset –mixed HEAD~
Son commit’i siler ve stage edilen dosyalar unstage edilir.

git reset –hard HEAD~
Commit gider, stage’ler unstage edilir, elinizdeki kod da bi önceki haline döner. Kullanması biraz tehlikelidir.

Ben soft ve hard resete nazaran daha çok mixed kullandım. Hatta soft hiç kullanmadım diyebilirim. Mixed komutu commit ve stage edilmiş dosyaları hallediyor, ben de tekrar stage+commit ediyorum, geliştiricilerin de çoğu durumda bunu kullanıldıklarını duydum.

Projeme bir tane feature ekleyeceğim derken biyerde fazla tıkandım ve başlamadan önceki haline döndürmem gerekiyordu ki böylece diğer feature ekleme işine geçebileyim, o kadar kodu tek tek silemezdim.  Hard reseti ilk kez o zaman kullandım. Doğrudur kullanması tehlikeli, hatta kullanırken ikinci kez düşündüm ama çok da şahane bi komut olduğunu görmüş oldum.

git push origin master –force
Bash üzerinde local repo dizininde birkaç git komutu denemesi yaptıktan sonra push ederken sorun çıkarıyordu. Bi kaç kez normal push ettim yemedi, aşağıda yazdığım hatayı basıyordu. Bi sorun çıkıp çıkmayacağını düşündükten sonra –force ekleyerek push’ladım, iyi ki eklemişim, yedi. (Tabi bunun başka yolu da varmış.)

“Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing to the same ref. You may want to first integrate the remote changes (e.g., ‘git pull …’) before pushing again. See the ‘Note about fast-forwards’ in ‘git push –help’ for details.”

Senaryo: Bir dosyayı eklemeyi unuttuğunuzda dosyayı ekleyip stage ettikten sonra  –amend komutuyla eklediğiniz dosyayı, bi önceki commit içerisine dahil edebilirsiniz.
git commit –m ‘initial commit’
git add forgotten_file
git commit –amend

Senaryo (Yeni feature ekleme): Uzak repodan feature branch’ı develop branch ile birleştirme.
git branch –r
git fetch origin feature/new-feature:feature/new-feature
git fetch origin develop
git checkout develop
git merge feature/new-feature

Burada commit atılmıyor ve şunu basıyor:
“On branch develop
nothing to commit, working tree clean”

Daha sonrada geriye develop branch’ı push etmesi kalıyor, sonra github üzerinden PR atıp merge ediyorsunuz .
git push remote develop

Senaryo (Syncing your fork): Yerelde fork ettiğiniz projeniz olsun, büyük ihtimalle remote üzerinde katkı yaptığınız bu projeye yeni PR’lar atılmıştır. Siz de projeye katkı sağlarken mantıken en güncel haline katkı sağlamanız gerekir. Bu yüzden yereldeki forku güncellememiz gerekmektedir.

Önceden alttaki komutla clone işlemini yaptık diyelim:
git clone git@github.com:YOUR-USERNAME/YOUR-FORKED-REPO.git

Daha sonra komut satırında proje dizinine gelerek projeyi forkladığımız repoyu upstream olarak ekliyoruz. Ekledikten sonra fetch ediyoruz:
 cd into/cloned/fork-repo
git remote add upstream
git fetch upstream

Fetch’den sonra master branch’dayken pull ederek upstream’deki dosyaları çekiyoruz ve yereldeki forkumuz güncellenmiş oluyor.
git pull upstream master

Daha sonra github üzerindeki kendi forkunuzu güncellemek isterseniz pull ettikten sonra merge ve push edebilirsiniz.

Resmi dökümandaki çözüm:
upstream’dan dosyalar çekilir
git fetch upstream
localdeki master branch checkout edilir
git checkout master
upstream’daki master, yereldeki master ile merge edilir
git merge upstream/master