Blok 8 · Ders 52
Takım çalışması: Git dalları ve pull request
Dal (branch), birleştirme, çakışma çözmek, pull request ve kod incelemesi; ekiplerin Git'i nasıl kullandığı.
Bu dersin sonunda
- Bir işi kendi dalında yapıp
git switch -c,git branchvegit mergeile ana dala katabilirsin - İleri sarma ile birleştirme commit'inin farkını
git log --graphçıktısında gösterebilirsin - Çakışma işaretlerini okuyup bir çakışmayı elle ya da VS Code ile çözebilirsin
git fetch,git pullve uzak dallarla bir takım arkadaşıyla aynı depoda çalışabilir, reddedilen push'u düzeltebilirsin- GitHub'da pull request açıp inceleyebilir; anlaşılır dal adı, commit mesajı ve PR açıklaması yazabilirsin
git restorevegit revertile değişiklikleri güvenle geri alabilir,git reset --hard'ın neyi sildiğini bilirsin
Bu sayfada
- Alıştırma deposu: kadro
- Dal nedir, neden kullanılır?
- Dal açmak ve dallar arasında geçmek
- Birleştirmek: git merge
- Kaydedilmemiş değişiklikle dal değiştirmek
- Çakışma (conflict)
- Takım arkadaşıyla çalışmak: push, fetch, pull
- GitHub'da pull request ve kod incelemesi
- İyi commit, iyi PR açıklaması, iyi dal adı
- Geri almak
- Sık hatalar
- Görevler
- Kendini sına
- Kayıt noktası
Blok 6 ve 7'deki projeleri tek başına yazdın: her commit doğrudan main'e gitti. İş yerinde aynı depoda beş kişi aynı anda çalışır; biri yeni özellik yazarken öteki acil bir hatayı düzeltir, üçüncüsü ikisinin kodunu okur. Bu derste bunun karışıklık çıkarmadan nasıl yapıldığını öğreneceksin: dallar, birleştirme, çakışma, takım arkadaşıyla push ve pull, pull request ve geri almanın güvenli yolları. Takım arkadaşını da kendi bilgisayarında taklit edeceksin: aynı depoyu iki klasöre indirip biri sen, öteki "Ayşe" olacak.
Alıştırma deposu: kadro
Önce üzerinde oynayacağın küçük bir depo kur. C:\kod içinde kadro adında bir klasör oluştur, VS Code'da aç (File → Open Folder) ve kadro.js dosyasını yaz:
const kadro = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]const baslik = "Bu akşamın kadrosu" console.log(baslik)for (const sampiyon of kadro) { console.log("- " + sampiyon)}PS C:\kod\kadro> node kadro.jsBu akşamın kadrosu- Ahri- Garen- Jinx- Lux- TeemoGit'i başlat, ilk kaydı al ve dalın adını Ders 7'deki gibi main yap:
PS C:\kod\kadro> git initInitialized empty Git repository in C:/kod/kadro/.git/PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Kadro listesini yazdır"[master (root-commit) 4c3ed5f] Kadro listesini yazdır 1 file changed, 7 insertions(+) create mode 100644 kadro.jsPS C:\kod\kadro> git branch -M mainPS C:\kod\kadro> git branch* mainSon komut yeni: git branch depodaki dalları listeler. Şimdilik tek dal var, main. Başındaki * "şu an bu daldasın" demek. Commit kimlikleri (4c3ed5f) sende farklı olacak; bu dersteki bütün kimlikler için bu geçerli.
Dal nedir, neden kullanılır?
Diyelim ki kadroya kaptan bilgisini ekliyorsun. İşin yarısındasın, kod henüz çalışmıyor. Tam o sırada takım arkadaşın yazıyor: "Başlıkta yazım hatası var, sitede görünüyor, hemen düzeltir misin?" Tek bir main'in varsa iki kötü seçeneğin var: yarım kodunla birlikte commit'leyip yayına göndermek ya da yarım işini silip baştan başlamak.
Dal (branch) bu sorunu çözer. main her zaman çalışan, yayına hazır kod olarak kalır. Yeni bir işe başlarken ondan bir kol ayırırsın; o koldaki commit'ler main'i etkilemez. İş bitip denenince kolu main'e katarsın. Acil düzeltme gelirse main'e döner, düzeltmeyi yapar, sonra yarım işine kaldığın yerden devam edersin.
Dal açmak ve dallar arasında geçmek
Toplam şampiyon sayısını yazdıran küçük bir özellik ekleyeceksin, ama main'de değil, kendi dalında. git switch -c yeni bir dal açar ve seni hemen o dala geçirir (-c, create: oluştur):
PS C:\kod\kadro> git switch -c kadro-sayisiSwitched to a new branch 'kadro-sayisi'PS C:\kod\kadro> git branch* kadro-sayisi mainArtık iki dal var ve * yeni dalın yanında. VS Code'un sol alt köşesindeki durum çubuğunda da dalın adı yazar; dal değiştirince orası da değişir. Şimdi dosyanın sonuna bir satır ekle:
const kadro = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]const baslik = "Bu akşamın kadrosu" console.log(baslik)for (const sampiyon of kadro) { console.log("- " + sampiyon)}console.log("Toplam: " + kadro.length + " şampiyon")Bu akşamın kadrosu- Ahri- Garen- Jinx- Lux- TeemoToplam: 5 şampiyonCommit'le, geçmişe bak, sonra main'e dön ve programı yeniden çalıştır:
PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Kadrodaki şampiyon sayısını yazdır"[kadro-sayisi 215ca32] Kadrodaki şampiyon sayısını yazdır 1 file changed, 1 insertion(+)PS C:\kod\kadro> git log --oneline --all215ca32 (HEAD -> kadro-sayisi) Kadrodaki şampiyon sayısını yazdır4c3ed5f (main) Kadro listesini yazdırPS C:\kod\kadro> git switch mainSwitched to branch 'main'PS C:\kod\kadro> node kadro.jsBu akşamın kadrosu- Ahri- Garen- Jinx- Lux- Teemo- Commit çıktısındaki köşeli parantezde dalın adı yazar: commit
kadro-sayisi'ye gitti. --allbütün dalların commit'lerini gösterir.mainhâlâ ilk commit'te,kadro-sayisibir adım önde.git switch maindediğin andaToplamsatırı dosyadan kayboldu. Merak etme, silinmedi:kadro-sayisidalında duruyor. Dal değiştirmek, klasördeki dosyaları o dalın son commit'indeki hâline getirir. VS Code açık dosyayı kendiliğinden yeniler.
| Komut | Ne yapar? |
|---|---|
git branch | Dalları listeler; * bulunduğun dal |
git switch -c ad | ad adında yeni dal açar ve ona geçer |
git switch ad | Var olan ad dalına geçer |
git branch -d ad | ad dalını siler (birleştirilmişse) |
Birleştirmek: git merge
Özellik hazır, denendi. Onu main'e katmak için hedef dala geçip birleştirmek istediğin dalın adını verirsin. Sen zaten main'desin:
PS C:\kod\kadro> git merge kadro-sayisiUpdating 4c3ed5f..215ca32Fast-forward kadro.js | 1 + 1 file changed, 1 insertion(+)PS C:\kod\kadro> git log --oneline --all215ca32 (HEAD -> main, kadro-sayisi) Kadrodaki şampiyon sayısını yazdır4c3ed5f Kadro listesini yazdırPS C:\kod\kadro> git branch -d kadro-sayisiDeleted branch kadro-sayisi (was 215ca32).Fast-forward çıktısına dikkat. Sen dalda çalışırken main'e yeni commit gelmemişti; Git'in tek yapması gereken main etiketini ileri kaydırmaktı. Yeni commit oluşmadı, log'da iki etiket aynı commit'i gösteriyor. Sonra işi biten dalı sildin; commit'i silinmedi, artık main'de.
İki kol da ilerlediyse: birleştirme commit'i
Gerçek hayatta sen dalında çalışırken main de ilerler. Bunu dene: kaptan adında bir dal aç, dosyanın sonuna console.log("Kaptan: " + kadro[0]) satırını ekleyip commit'le. Sonra main'e dön ve 2. satırdaki başlığı "Cuma akşamı kadrosu" yapıp onu da commit'le:
PS C:\kod\kadro> git switch -c kaptanSwitched to a new branch 'kaptan'PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Kaptanı yazdır"[kaptan f0c6804] Kaptanı yazdır 1 file changed, 1 insertion(+)PS C:\kod\kadro> git switch mainSwitched to branch 'main'PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Başlığı cuma akşamına çevir"[main 51ea0df] Başlığı cuma akşamına çevir 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> git log --oneline --graph --all* f0c6804 (kaptan) Kaptanı yazdır| * 51ea0df (HEAD -> main) Başlığı cuma akşamına çevir|/* 215ca32 Kadrodaki şampiyon sayısını yazdır* 4c3ed5f Kadro listesini yazdır--graph geçmişi çizer: her * bir commit, | ve / çizgileri kolları gösterir. 215ca32'den sonra geçmiş ikiye ayrılmış. Artık ileri sarma mümkün değil, çünkü iki kolda da öbüründe olmayan bir commit var. Birleştir:
PS C:\kod\kadro> git merge kaptanAuto-merging kadro.jsMerge made by the 'ort' strategy. kadro.js | 1 + 1 file changed, 1 insertion(+)Komutu yazınca VS Code'da MERGE_MSG adlı bir sekme açılır ve terminal hint: Waiting for your editor to close the file... diyerek bekler. Sekmede Git'in önerdiği mesaj durur: Merge branch 'kaptan'. Sekmeyi kapat; birleştirme tamamlanır ve terminal yukarıdaki çıktıyı yazar. ort, Git'in birleştirme yönteminin adı.
PS C:\kod\kadro> git log --oneline --graph* ffce963 (HEAD -> main) Merge branch 'kaptan'|\| * f0c6804 (kaptan) Kaptanı yazdır* | 51ea0df Başlığı cuma akşamına çevir|/* 215ca32 Kadrodaki şampiyon sayısını yazdır* 4c3ed5f Kadro listesini yazdırPS C:\kod\kadro> node kadro.jsCuma akşamı kadrosu- Ahri- Garen- Jinx- Lux- TeemoToplam: 5 şampiyonKaptan: AhriPS C:\kod\kadro> git branch -d kaptanDeleted branch kaptan (was f0c6804).En üstteki ffce963 yeni bir commit: iki kolu birleştiren birleştirme commit'i. Her commit kendinden önceki commit'i bilir; ona commit'in ebeveyni (parent) denir. Sıradan bir commit'in tek ebeveyni vardır, birleştirme commit'inin iki: 51ea0df ve f0c6804. Grafikte ffce963'ün hemen altındaki |\ çizgisi bu iki ebeveyne giden kolları gösteriyor. Programın çıktısında hem yeni başlık hem kaptan satırı var. İki kişi aynı dosyanın farklı satırlarını değiştirdiyse Git ikisini kendisi birleştirir.
main yalnızca ileri kayar. Sağda birleştirme commit'i: iki kol, iki ebeveynli yeni bir commit'te birleşir.Kaydedilmemiş değişiklikle dal değiştirmek
Bir sonraki deneme için yasuo adında bir dal aç, 1. satırda "Teemo"yu "Yasuo" yap ve commit'le. Sonra aynı dosyada küçük bir değişiklik daha yap (son satırda kadro[0]'ı kadro[1] yap) ama bu sefer commit'lemeden main'e geçmeye çalış:
PS C:\kod\kadro> git switch -c yasuoSwitched to a new branch 'yasuo'PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Teemo yerine Yasuo"[yasuo 45f1ad4] Teemo yerine Yasuo 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> git status --short M kadro.jsPS C:\kod\kadro> git switch mainerror: Your local changes to the following files would be overwritten by checkout: kadro.jsPlease commit your changes or stash them before you switch branches.Abortinggit status --short, durum çıktısının kısa hâli: her dosya için tek satır yazar, M "değişti" demek. Git dal değiştirmeyi reddetti: main'e geçerse kadro.js'i main'deki hâline getirecek, kaydetmediğin değişiklik yok olacaktı. Mesaj iki yol öneriyor: commit'le ya da kenara koy (stash). Değişikliği istemiyorsan üçüncü yol da onu atmak:
PS C:\kod\kadro> git restore kadro.jsPS C:\kod\kadro> git switch mainSwitched to branch 'main'Çakışma (conflict)
Git aynı dosyanın farklı satırlarını kendisi birleştirir. Peki iki dal aynı satırı farklı biçimde değiştirdiyse? Dene: main'desin; 1. satırdaki "Teemo"yu bu sefer "Annie" yap ve commit'le. Artık yasuo dalı aynı satırda Yasuo, main Annie diyor.
PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Teemo yerine Annie"[main a257423] Teemo yerine Annie 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> git merge yasuoAuto-merging kadro.jsCONFLICT (content): Merge conflict in kadro.jsAutomatic merge failed; fix conflicts and then commit the result.PS C:\kod\kadro> git statusOn branch mainYou have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Unmerged paths: (use "git add <file>..." to mark resolution) both modified: kadro.js no changes added to commit (use "git add" and/or "git commit -a")CONFLICT (content): Merge conflict in kadro.js: "kadro.js'in içeriğinde çakışma var". Hangi şampiyonun doğru olduğu bir insan kararı; Git birleştirmeyi yarıda durdurup kararı sana bıraktı. both modified: iki dal da bu dosyayı değiştirmiş.
Dosyaya bak. Git iki hâli de içine yazmış ve araya işaret satırları koymuş:
<<<<<<< HEADconst kadro = ["Ahri", "Garen", "Jinx", "Lux", "Annie"]=======const kadro = ["Ahri", "Garen", "Jinx", "Lux", "Yasuo"]>>>>>>> yasuoconst baslik = "Cuma akşamı kadrosu" console.log(baslik)for (const sampiyon of kadro) { console.log("- " + sampiyon)}console.log("Toplam: " + kadro.length + " şampiyon")console.log("Kaptan: " + kadro[0])PS C:\kod\kadro> node kadro.jsC:\kod\kadro\kadro.js:1<<<<<<< HEAD^^ SyntaxError: Unexpected token '<<' at wrapSafe (node:internal/modules/cjs/loader:1861:18) ... Node.js v24.20.0İşaretler dosyada durdukça program çalışmaz: Node <<<<<<< satırını JavaScript sanıp okuyamıyor.
<<<<<<< HEADile=======arası senin tarafın: bulunduğun dalın (main) hâli.=======ile>>>>>>> yasuoarası gelen taraf: birleştirmek istediğinyasuodalının hâli.- İşaretlerin dışında kalan satırlar çakışmasız; Git onları zaten birleştirdi.
VS Code bu işaretleri tanır ve dosyayı renklendirir: senin tarafın yeşil, gelen taraf mavi. Her çakışmanın üstünde tıklanabilir küçük bağlantılar belirir:
Çakışmayı çözmek
- Karar ver. Hangisi doğru: Annie mi, Yasuo mu, ikisinin karışımı mı? Bir takımdaysan değişikliği yapan kişiye sor. Burada Yasuo'da karar kıldınız diyelim.
- Dosyayı düzelt. Accept Incoming Change'e tıkla ya da elle düzenle: Annie'li satırı ve üç işaret satırını sil, Yasuo'lu satır kalsın. Hangi yolu seçersen seç, sonuçta dosyada
<<<<<<<,=======,>>>>>>>kalmamalı. - Dene. Kaydet ve
node kadro.jsile çalıştır.git diff --checkkomutu unutulmuş işaret varsa satırını söyler, yoksa hiçbir şey yazmaz. - Çözüldü de.
git add kadro.js. Buradagit add, "bu dosyanın çakışmasını çözdüm" demek. - Commit'le.
git commityaz,-molmadan. VS Code'da Git'in hazırladığıMerge branch 'yasuo'mesajıyla bir sekme açılır; kapat.
Düzeltilmiş dosya şöyle olmalı:
const kadro = ["Ahri", "Garen", "Jinx", "Lux", "Yasuo"]const baslik = "Cuma akşamı kadrosu" console.log(baslik)for (const sampiyon of kadro) { console.log("- " + sampiyon)}console.log("Toplam: " + kadro.length + " şampiyon")console.log("Kaptan: " + kadro[0])Cuma akşamı kadrosu- Ahri- Garen- Jinx- Lux- YasuoToplam: 5 şampiyonKaptan: AhriPS C:\kod\kadro> git diff --checkPS C:\kod\kadro> git add kadro.jsPS C:\kod\kadro> git statusOn branch mainAll conflicts fixed but you are still merging. (use "git commit" to conclude merge) Changes to be committed: modified: kadro.js PS C:\kod\kadro> git commit[main e323d1c] Merge branch 'yasuo'PS C:\kod\kadro> git branch -d yasuoDeleted branch yasuo (was 45f1ad4).All conflicts fixed but you are still merging: "bütün çakışmalar çözüldü ama birleştirme sürüyor". Son git commit birleştirmeyi bitirdi.
Birleştirme düzenleyicisi. Çakışmalı dosyada Resolve in Merge Editor düğmesi de belirir. Üç bölmeli bir ekran açar: solda gelen taraf (Incoming), sağda senin tarafın (Current), altta sonuç (Result). Her çakışmanın yanındaki seçeneklerle sonuca hangi tarafın gireceğini seçer, gerekirse sonucu elle düzeltirsin. Complete Merge dosyayı kaydedip hazırlık alanına ekler; birleştirmeyi bitirmek için yine git commit yazarsın. VS Code'un arayüzü zamanla değişebilir. Düğmeyi göremezsen Ctrl+Shift+G ile VS Code'un Git panelini (Source Control) aç; Merge Changes başlığı altındaki dosyaya sağ tıklayıp Open in Merge Editor'ı seç.
Takım arkadaşıyla çalışmak: push, fetch, pull
Gerçek bir ekipte uzak depo GitHub'dadır ve her takım arkadaşının bilgisayarında bir klonu vardır. İkinci bir GitHub hesabı açmadan denemek için uzak depoyu C:\kod\uzak içinde açacaksın; hayali takım arkadaşın Ayşe'nin klonu C:\kod\ayse-kadro'da duracak. Git için uzak deponun GitHub'da ya da yan klasörde olması fark etmez: komutlar aynı, yalnızca adres farklı.
PS C:\kod\kadro> cd C:\kodPS C:\kod> git init --bare -b main uzak\kadro.gitInitialized empty Git repository in C:/kod/uzak/kadro.git/PS C:\kod> cd kadroPS C:\kod\kadro> git remote add origin C:\kod\uzak\kadro.gitPS C:\kod\kadro> git push -u origin mainEnumerating objects: 22, done.Counting objects: 100% (22/22), done.Delta compression using up to 12 threadsCompressing objects: 100% (15/15), done.Writing objects: 100% (22/22), 1.88 KiB | 482.00 KiB/s, done.Total 22 (delta 8), reused 0 (delta 0), pack-reused 0 (from 0)To C:\kod\uzak\kadro.git * [new branch] main -> mainbranch 'main' set up to track 'origin/main'.git init --bareçıplak bir depo açar;-b mainvarsayılan dalınımainyapar (GitHub bunu kendisi yapar). Sondaki.git, çıplak depolara verilen geleneksel ek.git remote addvegit push -u origin mainDers 7'den; bu sefer adreshttps://…değil, bir klasör.
Şimdi VS Code'un terminal panelindeki + düğmesiyle ikinci bir terminal aç. Bu terminal Ayşe'nin olacak:
PS C:\kod\kadro> cd C:\kodPS C:\kod> git clone C:\kod\uzak\kadro.git ayse-kadroCloning into 'ayse-kadro'...done.PS C:\kod> cd ayse-kadroPS C:\kod\ayse-kadro> git config user.name "Ayşe Kaya"PS C:\kod\ayse-kadro> git config user.email "ayse@example.com"PS C:\kod\ayse-kadro> git log --oneline -2e323d1c (HEAD -> main, origin/main, origin/HEAD) Merge branch 'yasuo'a257423 Teemo yerine AnnieKlon bütün geçmişi getirdi. git config'i --global olmadan yazdık: ayar yalnızca bu klonda geçerli, Ayşe'nin commit'leri onun adını taşır. --global yazsaydın senin adın da her yerde Ayşe olurdu. Log'daki origin/main'e birazdan geleceğiz.
Ayşe gönderir, seninki reddedilir
Ayşe'nin terminalinde: kadro.js'in 2. satırındaki başlığı "Cuma akşamı 5v5 kadrosu" yap (Ayşe'nin dosyası C:\kod\ayse-kadro\kadro.js; VS Code'da File → Open File ile açabilirsin), sonra commit'le ve gönder. İki sekmenin adı da kadro.js olacak; VS Code onları ayırmak için sekmede adın yanına klasörü de yazar. Kimin dosyasını düzenlediğine dikkat et.
PS C:\kod\ayse-kadro> git add .PS C:\kod\ayse-kadro> git commit -m "Başlığa 5v5 ekle"[main 75c5e0a] Başlığa 5v5 ekle 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\ayse-kadro> git pushEnumerating objects: 5, done.Counting objects: 100% (5/5), done.Delta compression using up to 12 threadsCompressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 286 bytes | 286.00 KiB/s, done.Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)To C:\kod\uzak\kadro.git e323d1c..75c5e0a main -> mainSen bundan habersizsin. Kendi terminaline dön; C:\kod\kadro\kadro.js'in sonuna console.log("Maç 21.00'de başlıyor") satırını ekle, commit'le ve gönder:
PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Maç saatini yazdır"[main 60b78ef] Maç saatini yazdır 1 file changed, 1 insertion(+)PS C:\kod\kadro> git pushTo C:\kod\uzak\kadro.git ! [rejected] main -> main (fetch first)error: failed to push some refs to 'C:\kod\uzak\kadro.git'hint: Updates were rejected because the remote contains work that you do nothint: have locally. This is usually caused by another repository pushing tohint: the same ref. If you want to integrate the remote changes, usehint: 'git pull' before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.Ders 7'deki hatanın aynısı, bu sefer bir takım arkadaşı yüzünden: uzak depoda senin bilmediğin bir commit var. Push'un kabulü için uzak depodaki main'in senin main'inin geçmişinde olması gerekir; değil. Kabul edilseydi Ayşe'nin commit'i silinirdi. fetch first: "önce indir".
git fetch: önce bak
git fetch uzak depodaki yenilikleri indirir ama senin dosyalarına ve dallarına dokunmaz:
PS C:\kod\kadro> git fetchremote: Enumerating objects: 5, done.remote: Counting objects: 100% (5/5), done.remote: Compressing objects: 100% (2/2), done.remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)From C:\kod\uzak\kadro e323d1c..75c5e0a main -> origin/mainPS C:\kod\kadro> git statusOn branch mainYour branch and 'origin/main' have diverged,and have 1 and 1 different commits each, respectively. (use "git pull" if you want to integrate the remote branch with yours) nothing to commit, working tree cleanPS C:\kod\kadro> git log --oneline --graph --all -4* 60b78ef (HEAD -> main) Maç saatini yazdır| * 75c5e0a (origin/main, origin/HEAD) Başlığa 5v5 ekle|/* e323d1c Merge branch 'yasuo'|\| * 45f1ad4 Teemo yerine Yasuomain -> origin/main: indirilen commit origin/main etiketine yazıldı. origin/main, senin bilgisayarında duran ve "uzak depodaki main en son baktığımda şuradaydı" diyen bir etiket. git status artık durumu biliyor: iki taraf ayrılmış (diverged), sende 1, uzakta 1 farklı commit var; grafik de bunu çiziyor. origin/HEAD uzak deponun varsayılan dalını gösterir, şimdilik geç.
Fetch'ten sonra push'u yeniden denersen hata değişir ama sonuç aynıdır:
PS C:\kod\kadro> git pushTo C:\kod\uzak\kadro.git ! [rejected] main -> main (non-fast-forward)error: failed to push some refs to 'C:\kod\uzak\kadro.git'hint: Updates were rejected because the tip of your current branch is behindhint: its remote counterpart. If you want to integrate the remote changes,hint: use 'git pull' before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.fetch first "uzakta hiç görmediğin commit var" demekti; non-fast-forward "o commit'i gördün ama birleştirmedin, uzaktaki main seninkinin ileri sarması olamaz" demek. Çaresi aynı: birleştir.
git pull: indir ve birleştir
git pull, git fetch ile git merge'ün art arda çalışmasıdır: yenilikleri indirir ve origin/main'i bulunduğun dala birleştirir.
PS C:\kod\kadro> git pullAuto-merging kadro.jsMerge made by the 'ort' strategy. kadro.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> git log --oneline --graph -4* 2abefd0 (HEAD -> main) Merge branch 'main' of C:\kod\uzak\kadro|\| * 75c5e0a (origin/main, origin/HEAD) Başlığa 5v5 ekle* | 60b78ef Maç saatini yazdır|/* e323d1c Merge branch 'yasuo'|\PS C:\kod\kadro> node kadro.jsCuma akşamı 5v5 kadrosu- Ahri- Garen- Jinx- Lux- YasuoToplam: 5 şampiyonKaptan: AhriMaç 21.00'de başlıyorPS C:\kod\kadro> git pushEnumerating objects: 10, done.Counting objects: 100% (10/10), done.Delta compression using up to 12 threadsCompressing objects: 100% (4/4), done.Writing objects: 100% (6/6), 689 bytes | 689.00 KiB/s, done.Total 6 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)To C:\kod\uzak\kadro.git 75c5e0a..2abefd0 main -> mainBu birleştirmede de MERGE_MSG sekmesi açılır; kapat. Mesaj Merge branch 'main' of C:\kod\uzak\kadro olur; GitHub'da sonunda deponun https://github.com/… adresi yazar. Değişiklikler farklı satırlarda olduğu için Git ikisini de birleştirdi. Aynı satırı değiştirseydiniz git pull da çakışmayla dururdu; onu yukarıdaki gibi çözerdin. Artık uzaktaki commit senin geçmişinde olduğu için push kabul edildi.
git pull'un ayrışmış dalları birleştirmesi bir ayara bağlı: Windows için Git kurulumu, git pull davranışını soran ekranın varsayılan seçeneğiyle bunu kendisi ayarlar (pull.rebase=false). Mac ya da Linux kullanıyorsan veya kurulumda o ekranda başka bir seçenek işaretlediysen git pull birleştirmek yerine Need to specify how to reconcile divergent branches diyerek durabilir; çözümü Sık hatalar bölümündeki kartta.
git pull ikisini bir birleştirme commit'inde birleştirdi.Ayşe'nin terminalinde de git pull yaz. Onun main'i senin birleştirme commit'inin doğrudan gerisinde olduğu için Git yalnızca ileri sarar:
PS C:\kod\ayse-kadro> git pullremote: Enumerating objects: 10, done.remote: Counting objects: 100% (10/10), done.remote: Compressing objects: 100% (4/4), done.remote: Total 6 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)From C:\kod\uzak\kadro 75c5e0a..2abefd0 main -> origin/mainUpdating 75c5e0a..2abefd0Fast-forward kadro.js | 1 + 1 file changed, 1 insertion(+)| Komut | İndirir mi? | Senin dalını değiştirir mi? | Ne zaman? |
|---|---|---|---|
git fetch | Evet | Hayır, yalnız origin/… etiketleri | "Uzakta ne var?" diye bakmak için |
git pull | Evet | Evet, birleştirir | Çalışmaya başlamadan önce ve push'tan önce |
git push | Hayır, gönderir | Uzak dalı ileri alır | Commit'lerini paylaşmak için |
Uzak dallar
Ekiplerde yeni işler doğrudan main'e değil, uzak depoya gönderilen dallara gider. Ayşe yedek oyuncuyu yazdıran bir dal açıyor: ozellik/yedek dalında dosyanın sonuna console.log("Yedek: Teemo") ekleyip commit'liyor. Yeni bir dalı ilk kez gönderirken, Ders 7'deki main gibi -u ile gönderirsin. -u'suz, düz git push yazarsan Ders 7'deki has no upstream branch hatasını alırsın:
PS C:\kod\ayse-kadro> git switch -c ozellik/yedekSwitched to a new branch 'ozellik/yedek'PS C:\kod\ayse-kadro> git add .PS C:\kod\ayse-kadro> git commit -m "Yedek oyuncuyu yazdır"[ozellik/yedek b260258] Yedek oyuncuyu yazdır 1 file changed, 1 insertion(+)PS C:\kod\ayse-kadro> git push -u origin ozellik/yedekEnumerating objects: 5, done.Counting objects: 100% (5/5), done.Delta compression using up to 12 threadsCompressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 314 bytes | 314.00 KiB/s, done.Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)To C:\kod\uzak\kadro.git * [new branch] ozellik/yedek -> ozellik/yedekbranch 'ozellik/yedek' set up to track 'origin/ozellik/yedek'.Sen de fetch edip dalı kendi bilgisayarında açabilirsin:
PS C:\kod\kadro> git fetchremote: Enumerating objects: 5, done.remote: Counting objects: 100% (5/5), done.remote: Compressing objects: 100% (2/2), done.remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)From C:\kod\uzak\kadro * [new branch] ozellik/yedek -> origin/ozellik/yedekPS C:\kod\kadro> git branch* mainPS C:\kod\kadro> git branch -a* main remotes/origin/HEAD -> origin/main remotes/origin/main remotes/origin/ozellik/yedekPS C:\kod\kadro> git switch ozellik/yedekSwitched to a new branch 'ozellik/yedek'branch 'ozellik/yedek' set up to track 'origin/ozellik/yedek'.PS C:\kod\kadro> node kadro.jsCuma akşamı 5v5 kadrosu- Ahri- Garen- Jinx- Lux- YasuoToplam: 5 şampiyonKaptan: AhriMaç 21.00'de başlıyorYedek: TeemoPS C:\kod\kadro> git switch mainSwitched to branch 'main'Your branch is up to date with 'origin/main'.git branchyalnız senin dallarını,git branch -a(all) uzak izleme dallarını da gösterir.- Sende
ozellik/yedekdiye bir dal yoktu; Git aynı adlı uzak dalı buldu, ondan yerel bir dal açtı ve ikisini bağladı (set up to track). Takım arkadaşının işini böyle kendi bilgisayarında çalıştırıp denersin; kod incelemesinin ilk adımı genelde budur.
GitHub'da pull request ve kod incelemesi
Şimdiye kadar dalları git merge ile kendin birleştirdin. Ekiplerde kimse dalını main'e kendi başına katmaz. Ayşe dalını GitHub'a gönderir ve bir pull request açar: "ozellik/yedek'i main'e birleştirmek istiyorum, bakar mısınız?" Takımdan biri değişikliği okur, yorum yazar, gerekirse düzeltme ister; her şey tamamsa birleştirir. Bu okumaya kod incelemesi denir.
Alıştırma deposun GitHub'da olmadığı için PR'ı Görev 6'da Ders 7'deki ogren deponda deneyeceksin. Akış şöyle:
- Dalı gönder.
git push -u origin ozellik/yedek. GitHub çıktıya PR açma adresini verenremote:satırları da ekleyebilir. - PR'ı aç. Depo sayfasında dosya listesinin üstündeki sarı şeritte Compare & pull request'e bas (şerit yoksa Pull requests sekmesinde New pull request). base kutusunda hedef (
main), compare kutusunda senin dalın seçili olmalı. - Başlık ve açıklama yaz. Başlık kısa bir özet, açıklama "ne, neden, nasıl denenir" (aşağıda şablon var). Create pull request ile aç. Henüz bitmediyse yanındaki oktan taslak (draft) PR açabilirsin; taslak birleştirilemez.
- İncelenmesini bekle. Sağdaki Reviewers bölümünden bir takım arkadaşını çağır. Yorum gelirse aynı dalda düzeltip push edersin; yeni commit'ler PR'a kendiliğinden eklenir.
- Birleştir. Onaydan sonra en alttaki Merge pull request, ardından Confirm merge. Çıkan Delete branch ile GitHub'daki dalı silebilirsin.
- Kendi bilgisayarını güncelle.
git switch main,git pull,git branch -d ozellik/yedek.
İnceleme nasıl yapılır? Files changed sekmesi değişen satırları Ders 7'deki git diff gibi gösterir: eklenenler yeşil +, silinenler kırmızı -. Satır numarasının üstüne gelince çıkan mavi yorum simgesiyle o satıra yorum yazar, Start a review ile incelemene eklersin; sen gönderene kadar bu yorumları yalnızca sen görürsün. Yorum kutusundaki Suggestion simgesiyle hazır bir düzeltme de önerebilirsin. Bitince değişikliklerin üstündeki Review changes'a basar, bir özet yazar, Comment (yalnızca yorum), Approve (onay) ya da Request changes (düzeltme iste) seçip Submit review dersin. PR'ı açan kişi kendi PR'ını onaylayamaz, yalnızca yorum yazabilir.
İncelerken şunlara bak:
- Çalışıyor mu? Dalı kendi bilgisayarında çalıştır (
git fetch,git switch ozellik/yedek,node kadro.js). Sınır durumlarını dene: boş liste, sıfır, çok uzun ad. - Tek bir iş mi? Başlıkta "yedek oyuncu" yazıp içinde başka üç değişiklik varsa bölünmesini iste. Küçük PR hızlı ve dikkatli incelenir.
- Okunuyor mu? Adlar anlamlı mı, unutulmuş
console.logya da yorum satırına alınmış eski kod var mı? - Gizli bilgi var mı?
.env, API anahtarı, şifre. Bunlar bir kez GitHub'a giderse anahtarı yenilemek gerekir.
Yorumu kişiye değil koda yaz, nedenini söyle, mümkünse soru olarak sor: "Bu yanlış" yerine "kadro boşsa burada Kaptan: undefined yazmaz mı? Bir if ile denetlesek?" İyi bulduğun yeri de söyle. Sana gelen yorumları da kişisel alma: amaç ortak kodun iyi olması.
İyi commit, iyi PR açıklaması, iyi dal adı
Ders 7'de iyi commit mesajının kurallarını gördün: ne yaptığını emir kipiyle söyle, kısa tut, bir commit bir iş. Ekiplerde buna çoğu zaman ortak bir biçim eklenir. En yaygını Conventional Commits: mesajın başına değişikliğin türünü yazarsın.
| Tür | Ne zaman? | Örnek |
|---|---|---|
feat | Yeni özellik | feat: yedek oyuncuyu yazdır |
fix | Hata düzeltme | fix: toplamda NaN çıkmasını düzelt |
docs | Yalnız belge (README…) | docs: README'ye çalıştırma adımını ekle |
refactor | Davranışı değiştirmeyen düzenleme | refactor: kadro listesini ayrı dosyaya taşı |
test | Test ekleme ya da düzeltme | test: toplam hesabına sınır testleri ekle |
chore | Bakım işleri | chore: bağımlılıkları güncelle |
Kuralın tanımladığı türler feat ve fix; ötekiler yaygın bir gelenek. Türden sonra parantezde değişen bölümü, yani kapsamı (scope) yazabilirsin: fix(kadro): kaptan indeksini düzelt. Eski davranışı bozan değişiklikte türün sonuna ünlem konur: feat!: kadro dosyasının biçimini değiştir. Türler İngilizce kalır, açıklamayı ekibin dilinde yazarsın.
Dal adları da bir bakışta ne olduğunu söylemeli:
| Kötü | Neden kötü? | Daha iyi |
|---|---|---|
yeni | Ne yaptığını söylemiyor | ozellik/yedek-oyuncu |
deniz-dal | Kimin olduğu belli, ne olduğu değil | duzeltme/kaptan-indeksi |
yeni ozellik | Boşluk: Git kabul etmez | ozellik/rol-listesi |
özellik/yedek | Git kabul eder ama Türkçe harf bazı araç ve klavyelerde sorun çıkarır | ozellik/yedek |
Kural: küçük harf, sözcükler arasında tire, başta işin türü ve /. İngilizce çalışan ekipler feature/…, fix/…, docs/… yazar. Bazı ekipler iş kaydının numarasını da ekler: fix/42-toplam-nan.
PR açıklaması inceleyenin işini kolaylaştırmalı. Ne yapıldığını kod zaten söylüyor; açıklama neden yapıldığını ve nasıl deneneceğini anlatmalı. Birçok ekip böyle bir şablon kullanır:
## Ne değişti?Kadro listesinin altına yedek oyuncu yazdırılıyor. ## Neden?Maç öncesi kim yedekte, herkes görsün diye. ## Nasıl denenir?1. `git switch ozellik/yedek`2. `node kadro.js`3. Son satırda `Yedek: Teemo` görünmeli. ## NotlarYedek şimdilik sabit; ileride listeye çevrilebilir.Arayüzde bir değişiklik varsa açıklamaya ekran görüntüsü de koyarsın.
Geri almak
Bir şeyi bozmak normal; önemli olan doğru aracı seçmek. Hangisini kullanacağın, değişikliğin nerede olduğuna bağlı:
| Durum | Komut | Ne yapar? |
|---|---|---|
| Dosyada kaydetmediğin değişikliği atmak | git restore dosya | Dosyayı son commit'teki hâline döndürür. Attığın değişiklik geri gelmez. |
git add yaptın, hazırlıktan çıkarmak | git restore --staged dosya | Hazırlık alanından çıkarır, dosyadaki değişikliğe dokunmaz. |
| Paylaştığın bir commit'i geri almak | git revert kimlik | O commit'in tersini yapan yeni bir commit ekler. Geçmiş korunur. |
| Her şeyi zorla eski bir yere götürmek | git reset --hard | Kaydedilmemiş her şeyi siler; bir commit verirsen dalı da oraya geri sarar. Tehlikeli. |
git restore: kaydetmediğin değişikliği atmak
Diyelim yanlışlıkla "Garen"i "Garne" yaptın ve kaptan satırını sildin. git diff ne olduğunu gösterir, git restore geri alır:
PS C:\kod\kadro> git status --short M kadro.jsPS C:\kod\kadro> git diffdiff --git a/kadro.js b/kadro.jsindex b32b084..91570e9 100644--- a/kadro.js+++ b/kadro.js@@ -1,4 +1,4 @@-const kadro = ["Ahri", "Garen", "Jinx", "Lux", "Yasuo"]+const kadro = ["Ahri", "Garne", "Jinx", "Lux", "Yasuo"] const baslik = "Cuma akşamı 5v5 kadrosu" console.log(baslik)@@ -6,5 +6,4 @@ for (const sampiyon of kadro) { console.log("- " + sampiyon) } console.log("Toplam: " + kadro.length + " şampiyon")-console.log("Kaptan: " + kadro[0]) console.log("Maç 21.00'de başlıyor")PS C:\kod\kadro> git restore kadro.jsPS C:\kod\kadro> git status --short"Garne" hatasını yeniden yap; bu sefer git add'den sonra fark ettin. Önce hazırlıktan çıkarırsın; git status'un ipucu da bunu söylüyor:
PS C:\kod\kadro> git add .PS C:\kod\kadro> git statusOn branch mainYour branch is up to date with 'origin/main'. Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: kadro.js PS C:\kod\kadro> git restore --staged kadro.jsPS C:\kod\kadro> git status --short M kadro.jsPS C:\kod\kadro> git restore kadro.jsgit revert: paylaşılmış bir commit'i geri almak
Daha kötüsü: hatalı bir commit'i push ettin bile. Kaptanı Yasuo yapmak için kaptan satırındaki kadro[0]'ı kadro[5] yaptın; oysa dizide 5 eleman var ve son elemanın sıra numarası 4:
PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Kaptanı Yasuo yap"[main ab8c70f] Kaptanı Yasuo yap 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> git pushEnumerating objects: 5, done.Counting objects: 100% (5/5), done.Delta compression using up to 12 threadsCompressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 288 bytes | 288.00 KiB/s, done.Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)To C:\kod\uzak\kadro.git 2abefd0..ab8c70f main -> mainPS C:\kod\kadro> node kadro.jsCuma akşamı 5v5 kadrosu- Ahri- Garen- Jinx- Lux- YasuoToplam: 5 şampiyonKaptan: undefinedMaç 21.00'de başlıyorCommit artık uzak depoda; Ayşe çekmiş bile olabilir. Onu geçmişten silmek yerine tersini yapan yeni bir commit eklersin:
PS C:\kod\kadro> git revert HEAD[main 5c3f03b] Revert "Kaptanı Yasuo yap" 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> git log --oneline -35c3f03b (HEAD -> main) Revert "Kaptanı Yasuo yap"ab8c70f (origin/main, origin/HEAD) Kaptanı Yasuo yap2abefd0 Merge branch 'main' of C:\kod\uzak\kadroPS C:\kod\kadro> node kadro.jsCuma akşamı 5v5 kadrosu- Ahri- Garen- Jinx- Lux- YasuoToplam: 5 şampiyonKaptan: AhriMaç 21.00'de başlıyorPS C:\kod\kadro> git pushEnumerating objects: 5, done.Counting objects: 100% (5/5), done.Delta compression using up to 12 threadsCompressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 316 bytes | 316.00 KiB/s, done.Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)To C:\kod\uzak\kadro.git ab8c70f..5c3f03b main -> mainHEAD"son commit" demek; daha eski bir commit'i geri almak için kimliğini yazarsın:git revert ab8c70f.- Revert de mesaj ister: VS Code'da
Revert "Kaptanı Yasuo yap"mesajlı bir sekme açılır, kapat. Çıktı sekmeyi kapattıktan sonra gelir. - Hatalı commit log'da duruyor, hemen üstünde onu geri alan commit var. Geçmiş dürüst kalır, herkes
git pullile düzeltmeyi alır.
git reset --hard: neden tehlikeli?
İnternette "her şeyi geri al" diye en çok önerilen komut git reset --hard'dır. Ne yaptığını görmek için dosyanın sonuna yarım kalmış bir iş gibi // yarım kalan iş: roller satırını ekle, kaydet ve şunları çalıştır:
PS C:\kod\kadro> git status --short M kadro.jsPS C:\kod\kadro> git reset --hardHEAD is now at 5c3f03b Revert "Kaptanı Yasuo yap"PS C:\kod\kadro> git status --shortPS C:\kod\kadro> git reset --hard HEAD~1HEAD is now at ab8c70f Kaptanı Yasuo yapPS C:\kod\kadro> git pushTo C:\kod\uzak\kadro.git ! [rejected] main -> main (non-fast-forward)error: failed to push some refs to 'C:\kod\uzak\kadro.git'hint: Updates were rejected because the tip of your current branch is behindhint: its remote counterpart. If you want to integrate the remote changes,hint: use 'git pull' before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.PS C:\kod\kadro> git pullUpdating ab8c70f..5c3f03bFast-forward kadro.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)- İlk
git reset --hardyarım kalan işi (M kadro.js) sormadan sildi. Commit'lenmemiş değişiklik için Git'te geri dönüş yok; ne çöp kutusu var ne "geri al". git reset --hard HEAD~1(HEAD~1: "son commit'in bir öncesi") dalı bir commit geri sardı, revert commit'i dalın geçmişinden düştü. Uzak depo onu hâlâ tuttuğu için push reddedildi. İnternette bunun "çözümü" olarakgit push --forcegörürsün: uzak dalı zorla senin hâline getirir, arada başkalarının gönderdiği commit'leri siler. Paylaşılmış dalda asla yapma.- Burada
git pullile kurtardık, çünkü commit uzak depodaydı. Hiç push etmediğin commit için bu yol da yok.
git revert geçmişe yeni bir commit ekler; git reset --hard dalı geri sarar ve aradaki commit'i dalın geçmişinden düşürür.Geçmişe bakmak: kopuk HEAD
Eski bir commit'teki kod nasıldı, merak ettin. İlk commit'in kimliği git log --oneline çıktısının en alt satırında yazar; aşağıda 4c3ed5f, sen kendi kimliğini kullan. git switch'e bir dal adı yerine commit kimliği verirsen Git itiraz eder ve ne yapman gerektiğini söyler:
PS C:\kod\kadro> git switch 4c3ed5ffatal: a branch is expected, got commit '4c3ed5f'hint: If you want to detach HEAD at the commit, try again with the --detach option.PS C:\kod\kadro> git switch --detach 4c3ed5fHEAD is now at 4c3ed5f Kadro listesini yazdırPS C:\kod\kadro> node kadro.jsBu akşamın kadrosu- Ahri- Garen- Jinx- Lux- TeemoPS C:\kod\kadro> git statusHEAD detached at 4c3ed5fnothing to commit, working tree cleanPS C:\kod\kadro> git switch mainPrevious HEAD position was 4c3ed5f Kadro listesini yazdırSwitched to branch 'main'Your branch is up to date with 'origin/main'.--detach (koparmak) HEAD'i daldan koparıp doğrudan o commit'e bağlar: dosyalar ilk günkü hâline döndü. Bakmak için zararsızdır; git switch main ile geri dönersin. İnternetteki yazılar bunun için çoğu zaman git checkout 4c3ed5f der; aynı yere götürür ve uzun bir uyarı yazar:
PS C:\kod\kadro> git checkout 4c3ed5fNote: switching to '4c3ed5f'. You are in 'detached HEAD' state. You can look around, make experimentalchanges and commit them, and you can discard any commits you make in thisstate without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you maydo so (now or later) by using -c with the switch command. Example: git switch -c <new-branch-name> Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at 4c3ed5f Kadro listesini yazdırUyarı şunu diyor: "Etrafa bakabilir, deneme yapıp commit'leyebilirsin; bir dala dönünce bu commit'ler hiçbir dala bağlı olmadığı için kaybolabilir." Gerçekten de bu durumda 1. satırdaki "Teemo"yu "Zed" yapıp commit'lersen ve main'e dönersen Git son kez uyarır:
PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Zed dene"[detached HEAD b6bcf48] Zed dene 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> git switch mainWarning: you are leaving 1 commit behind, not connected toany of your branches: b6bcf48 Zed dene If you want to keep it by creating a new branch, this may be a good timeto do so with: git branch <new-branch-name> b6bcf48 Switched to branch 'main'Your branch is up to date with 'origin/main'.Commit'i saklamak istiyorsan önerilen komutu çalıştır: git branch zed-denemesi b6bcf48. Uyarı bir daha gösterilmez; kaçırırsan kimliği bulmak zorlaşır. Kural: kopuk HEAD'de commit atma; denemek istiyorsan önce git switch -c deneme-adi ile dal aç.
Sık hatalar
Bu derste karşılaşabileceğin Git hataları. Hepsi bütün derslerin hatalarıyla birlikte hata rehberinde de duruyor.
error: Your local changes to the following files would be overwritten by checkoutNe zaman çıkar? Kaydetmediğin bir değişiklik varken, o dosyanın farklı olduğu başka bir dala geçmeye çalışınca. Mesaj switch yazsan da checkout der.
PS C:\kod\kadro> git switch mainerror: Your local changes to the following files would be overwritten by checkout: kadro.jsPlease commit your changes or stash them before you switch branches.AbortingNasıl düzelir? Değişikliği istiyorsan önce commit'le (yarım iş de olsa kendi dalında commit'lemek sorun değil). İstemiyorsan git restore kadro.js ile at. Sonra dal değiştir.
CONFLICT (content): Merge conflict in kadro.jsNe zaman çıkar? git merge ya da git pull sırasında iki taraf aynı satırı farklı değiştirmişse. Git birleştirmeyi yarıda durdurur.
PS C:\kod\kadro> git merge yasuoAuto-merging kadro.jsCONFLICT (content): Merge conflict in kadro.jsAutomatic merge failed; fix conflicts and then commit the result.Nasıl düzelir? Dosyadaki <<<<<<<, =======, >>>>>>> arasındaki iki hâlden doğrusunu seç, işaretleri sil, programı çalıştırıp dene, git add dosya ve git commit. Vazgeçmek istersen git merge --abort.
error: Committing is not possible because you have unmerged files.Ne zaman çıkar? Çakışmayı çözüp git add yapmadan commit'lemeye çalışınca.
PS C:\kod\kadro> git commit -m "deneme"error: Committing is not possible because you have unmerged files.hint: Fix them up in the work tree, and then use 'git add/rm <file>'hint: as appropriate to mark resolution and make a commit.fatal: Exiting because of an unresolved conflict.U kadro.jsNasıl düzelir? Son satırdaki U "birleştirilmemiş" (unmerged) demek. O dosyanın çakışmasını çöz, git add kadro.js ile çözüldüğünü bildir, sonra commit'le.
SyntaxError: Unexpected token '<<'Ne zaman çıkar? Çakışma işaretlerinden biri dosyada unutulmuşsa. Commit bile edilmiş olabilir; Git içeriğe bakmaz, Node bakar.
PS C:\kod\kadro> node kadro.jsC:\kod\kadro\kadro.js:1<<<<<<< HEAD^^ SyntaxError: Unexpected token '<<' ...Nasıl düzelir? Gösterilen işaret satırını ve gereksiz tarafı sil. git add'den önce çalıştırılan git diff --check unutulan her işareti satırıyla söyler: kadro.js:1: leftover conflict marker. CSS ya da HTML dosyasında unutulan işaret hata bile vermeyebilir, sayfa sessizce bozulur; --check alışkanlığı bu yüzden değerli.
! [rejected] main -> main (non-fast-forward)Ne zaman çıkar? Uzak dalda senin birleştirmediğin commit'ler varken push edince. git fetch yapmadıysan aynı durum (fetch first) diye görünür (Ders 7'deki kart).
PS C:\kod\kadro> git pushTo C:\kod\uzak\kadro.git ! [rejected] main -> main (non-fast-forward)error: failed to push some refs to 'C:\kod\uzak\kadro.git'hint: Updates were rejected because the tip of your current branch is behindhint: its remote counterpart. If you want to integrate the remote changes,hint: use 'git pull' before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.Nasıl düzelir? git pull (çakışma çıkarsa çöz), programı dene, yeniden git push. git push --force yazma: uzaktaki commit'leri siler.
fatal: Need to specify how to reconcile divergent branches.Ne zaman çıkar? Senin dalın ve uzaktaki dal ayrışmışken (ikisinde de öbüründe olmayan commit varken) git pull yazınca, Git'e bu durumda ne yapacağı hiç söylenmemişse. Windows için Git kurulumu bu ayarı varsayılan olarak yapar; Mac'te, Linux'ta ya da kurulumda git pull ekranında başka bir seçenek işaretlediysen görürsün.
PS C:\kod\kadro> git pullhint: You have divergent branches and need to specify how to reconcile them.hint: You can do so by running one of the following commands sometime beforehint: your next pull:hint:hint: git config pull.rebase false # mergehint: git config pull.rebase true # rebasehint: git config pull.ff only # fast-forward onlyhint:hint: You can replace "git config" with "git config --global" to set a defaulthint: preference for all repositories. You can also pass --rebase, --no-rebase,hint: or --ff-only on the command line to override the configured default perhint: invocation.fatal: Need to specify how to reconcile divergent branches.Nasıl düzelir? Mesaj üç yol sayıyor; bu kurs birleştirmeyi (merge) kullanıyor. Bir kez git config --global pull.rebase false yaz, sonra git pull'u tekrarla: Git dersteki gibi birleştirir. rebase, commit'lerini uzaktakilerin ucuna yeniden yazan başka bir yöntem; bu derste işlemiyoruz.
fatal: 'yeni ozellik' is not a valid branch nameNe zaman çıkar? Dal adında boşluk ya da Git'in yasakladığı bir işaret (örneğin ~ ^ : ? * [ ya da ..) varsa.
PS C:\kod\kadro> git switch -c "yeni ozellik"fatal: 'yeni ozellik' is not a valid branch namehint: See 'git help check-ref-format'hint: Disable this message with "git config set advice.refSyntax false"Nasıl düzelir? Boşluk yerine tire kullan: git switch -c ozellik/yeni-ozellik.
fatal: a branch named 'ozellik/yedek' already existsNe zaman çıkar? git switch -c ile var olan bir dalı yeniden açmaya çalışınca. Nasıl düzelir? O dala geçeceksen -c'siz yaz: git switch ozellik/yedek. Yeni iş içinse başka ad seç.
error: the branch 'deneme' is not fully mergedNe zaman çıkar? git branch -d ile içinde hiçbir yere birleştirilmemiş commit'ler olan bir dalı silmeye çalışınca. Git o commit'leri kaybetmeni önlüyor.
PS C:\kod\kadro> git branch -d denemeerror: the branch 'deneme' is not fully mergedhint: If you are sure you want to delete it, run 'git branch -D deneme'hint: Disable this message with "git config set advice.forceDeleteBranch false"Nasıl düzelir? Daldaki iş gerekiyorsa önce birleştir; gerçekten çöpse büyük harfle git branch -D deneme. PR'ı GitHub'da Squash and merge ile birleştirdiysen de bu hata çıkabilir, çünkü main'e senin commit'lerin değil, tek bir yeni commit girdi. PR'ın birleştiğini gördüysen -D güvenli.
fatal: a branch is expected, got commit '4c3ed5f'Ne zaman çıkar? git switch'e dal adı yerine commit kimliği verince.
Nasıl düzelir? Yalnızca bakmak istiyorsan git switch --detach 4c3ed5f, işin bitince git switch main. O commit'ten yeni bir iş başlatacaksan dal aç: git switch -c eski-surum 4c3ed5f.
warning: remote HEAD refers to nonexistent ref, unable to checkoutNe zaman çıkar? Çıplak depoyu -b main olmadan açıp main'i gönderdiysen, klonlarken. Çıplak depo varsayılan dal olarak master'ı gösteriyor ama içinde yalnız main var; klon boş açılır.
PS C:\kod> git clone C:\kod\uzak\kadro.git ayse-kadroCloning into 'ayse-kadro'...done.warning: remote HEAD refers to nonexistent ref, unable to checkoutNasıl düzelir? Klon klasöründe git switch main yaz; Git uzaktaki main'i bulup açar. Bir dahaki sefere çıplak depoyu git init --bare -b main … ile aç. GitHub'da bu sorun olmaz, varsayılan dalı kendisi ayarlar.
Görevler
Görevleri sırayla C:\kod\kadro'da (gerektiğinde Ayşe'nin terminalinde) yap. Her görevden önce main'de ve git status temiz olmalı. Kimlikler ve sayılar sende farklı olacak; önemli olan komutların sırası ve çıktıların anlamı.
Dal aç, ileri sarmayla birleştir
ozellik/harita adında bir dal aç. Dosyanın sonuna console.log("Harita: Sihirdar Vadisi") satırını ekleyip commit'le. Sonra main'e birleştir ve dalı sil. Birleştirme çıktısında Fast-forward görmelisin; git log --oneline -1 çıktısında ise main ile ozellik/harita aynı commit'i göstermeli.
Sınır denemesi: dalı sildikten sonra git branch -d ozellik/harita'yı bir kez daha çalıştır. Ne der?
İpucu 1
Sıra: git switch -c …, düzenle, git add ., git commit -m "…", git switch main, git merge ….
İpucu 2
main'de sen dalda çalışırken yeni commit olmadığı için Git yalnızca etiketi ileri kaydırır. Log'u dalı silmeden önce çalıştır, yoksa ozellik/harita etiketini göremezsin.
Çözümü göster
PS C:\kod\kadro> git switch -c ozellik/haritaSwitched to a new branch 'ozellik/harita'PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Haritayı yazdır"[ozellik/harita cb98821] Haritayı yazdır 1 file changed, 1 insertion(+)PS C:\kod\kadro> git switch mainSwitched to branch 'main'Your branch is up to date with 'origin/main'.PS C:\kod\kadro> git merge ozellik/haritaUpdating 5c3f03b..cb98821Fast-forward kadro.js | 1 + 1 file changed, 1 insertion(+)PS C:\kod\kadro> git log --oneline -1cb98821 (HEAD -> main, ozellik/harita) Haritayı yazdırPS C:\kod\kadro> git branch -d ozellik/haritaDeleted branch ozellik/harita (was cb98821).PS C:\kod\kadro> git branch -d ozellik/haritaerror: branch 'ozellik/harita' not foundİkinci silme branch 'ozellik/harita' not found der: dal artık yok. Commit ise main'de duruyor; dal silmek commit silmez.
Yanlış dalda başlamak
main'deyken dosyanın sonuna console.log("Mod: Dereceli") ekledin ve commit'lemeden önce fark ettin: bu iş kendi dalında olmalıydı. Değişikliği kaybetmeden ozellik/mod adlı yeni bir dala taşı ve orada commit'le. Sonunda main'e döndüğünde git status --short hiçbir şey yazmamalı ve node kadro.js çıktısında Mod satırı olmamalı; git log --oneline --all -3 ise commit'i ozellik/mod dalında göstermeli.
Sınır denemesi: main'de aynı satırı bir kez daha ekle ve git add . de yap. Bu sefer işten tamamen vazgeçtin: değişikliği önce hazırlıktan çıkar, sonra dosyadan at. Her adımdan sonra git status --short'a bak; en sonda hiçbir şey yazmamalı.
İpucu 1
"Değişiklik bazen seninle gelir" kutusunu hatırla. Yeni açılan bir dal, bulunduğun commit'ten başlar; o an dosya iki dalda da aynıdır.
İpucu 2
git switch -c ozellik/mod kaydedilmemiş değişikliği yanında götürür. Commit'i yeni dalda atınca main'in bundan haberi olmaz.
Çözümü göster
PS C:\kod\kadro> git status --short M kadro.jsPS C:\kod\kadro> git switch -c ozellik/modSwitched to a new branch 'ozellik/mod'PS C:\kod\kadro> git status --short M kadro.jsPS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Oyun modunu yazdır"[ozellik/mod 36c79aa] Oyun modunu yazdır 1 file changed, 1 insertion(+)PS C:\kod\kadro> git switch mainSwitched to branch 'main'Your branch is ahead of 'origin/main' by 1 commit. (use "git push" to publish your local commits)PS C:\kod\kadro> git status --shortPS C:\kod\kadro> node kadro.jsCuma akşamı 5v5 kadrosu- Ahri- Garen- Jinx- Lux- YasuoToplam: 5 şampiyonKaptan: AhriMaç 21.00'de başlıyorHarita: Sihirdar VadisiPS C:\kod\kadro> git log --oneline --all -336c79aa (ozellik/mod) Oyun modunu yazdırcb98821 (HEAD -> main) Haritayı yazdır5c3f03b (origin/main, origin/HEAD) Revert "Kaptanı Yasuo yap"ahead of 'origin/main' by 1 commit: Görev 1'in commit'i henüz gönderilmedi, Görev 4'te gidecek. ozellik/mod şimdilik birleştirilmeden kalsın; sonraki görevlerin çıktıları buna göre.
Sınır denemesi, satırı yeniden ekledikten sonra:
PS C:\kod\kadro> git add .PS C:\kod\kadro> git status --shortM kadro.jsPS C:\kod\kadro> git restore --staged kadro.jsPS C:\kod\kadro> git status --short M kadro.jsPS C:\kod\kadro> git restore kadro.jsPS C:\kod\kadro> git status --shortM'nin yerine dikkat: solda (M kadro.js) "hazırlıkta", sağda ( M kadro.js) "değişti ama hazırlıkta değil" demek. git restore --staged yalnız hazırlıktan çıkardı, satırı ancak git restore sildi.
Başlık çakışmasını çöz
main'den iki dal aç (ikisini de main'deyken): baslik-turnuva dalında 2. satırdaki başlığı "Cumartesi turnuva kadrosu", baslik-dereceli dalında "Cuma akşamı dereceli kadrosu" yap ve commit'le. Sonra main'e önce baslik-turnuva'yı, sonra baslik-dereceli'yi birleştir. İkincisi çakışacak; çakışmayı iki başlığı birleştiren tek bir satırla çöz:
Cumartesi turnuvası, dereceli kadroBitince git diff --check hiçbir şey yazmamalı, node kadro.js bu başlıkla başlamalı ve iki dal silinmiş olmalı.
İpucu 1
İlk birleştirme ileri sarma olur (main yerinden oynamamıştı). İkincisinde artık main de ilerlemiş durumda ve iki dal aynı satırı değiştirmiş.
İpucu 2
Çakışmada HEAD tarafında turnuva başlığı, baslik-dereceli tarafında dereceli başlık olacak. İkisini de değil, yeni bir satır istiyoruz: üç işaret satırını ve iki eski satırı silip tek const baslik = "…" satırı yaz.
İpucu 3
Çözdükten sonra: git diff --check, node kadro.js, git add ., git commit (sekmeyi kapat), git branch -d baslik-turnuva baslik-dereceli. -d'ye birden çok dal adı verebilirsin.
Çözümü göster
PS C:\kod\kadro> git switch -c baslik-turnuvaSwitched to a new branch 'baslik-turnuva'PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Başlığı turnuvaya çevir"[baslik-turnuva 1a75f82] Başlığı turnuvaya çevir 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> git switch mainSwitched to branch 'main'Your branch is ahead of 'origin/main' by 1 commit. (use "git push" to publish your local commits)PS C:\kod\kadro> git switch -c baslik-dereceliSwitched to a new branch 'baslik-dereceli'PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Başlığa dereceli ekle"[baslik-dereceli c764fd7] Başlığa dereceli ekle 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> git switch mainSwitched to branch 'main'Your branch is ahead of 'origin/main' by 1 commit. (use "git push" to publish your local commits)PS C:\kod\kadro> git merge baslik-turnuvaUpdating cb98821..1a75f82Fast-forward kadro.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> git merge baslik-dereceliAuto-merging kadro.jsCONFLICT (content): Merge conflict in kadro.jsAutomatic merge failed; fix conflicts and then commit the result.PS C:\kod\kadro> git diff --checkkadro.js:2: leftover conflict markerkadro.js:4: leftover conflict markerkadro.js:6: leftover conflict markerDosyanın başı çakışmada şöyle:
const kadro = ["Ahri", "Garen", "Jinx", "Lux", "Yasuo"]<<<<<<< HEADconst baslik = "Cumartesi turnuva kadrosu"=======const baslik = "Cuma akşamı dereceli kadrosu">>>>>>> baslik-dereceliİşaretli beş satırın (2'den 6'ya) yerine tek satır yaz: const baslik = "Cumartesi turnuvası, dereceli kadro". Sonra:
PS C:\kod\kadro> git diff --checkPS C:\kod\kadro> node kadro.jsCumartesi turnuvası, dereceli kadro- Ahri- Garen- Jinx- Lux- YasuoToplam: 5 şampiyonKaptan: AhriMaç 21.00'de başlıyorHarita: Sihirdar VadisiPS C:\kod\kadro> git add .PS C:\kod\kadro> git commit[main 824bfed] Merge branch 'baslik-dereceli'PS C:\kod\kadro> git branch -d baslik-turnuva baslik-dereceliDeleted branch baslik-turnuva (was 1a75f82).Deleted branch baslik-dereceli (was c764fd7).PS C:\kod\kadro> git log --oneline --graph -5* 824bfed (HEAD -> main) Merge branch 'baslik-dereceli'|\| * c764fd7 Başlığa dereceli ekle* | 1a75f82 Başlığı turnuvaya çevir|/* cb98821 Haritayı yazdır* 5c3f03b (origin/main, origin/HEAD) Revert "Kaptanı Yasuo yap"İlk git diff --check işaretlerin üç satırını buldu; düzeltmeden sonra hiçbir şey yazmadı. Çıktıda iki başlık da yok, ikisini birleştiren yeni başlık var: çakışma çözümü "birini seç"ten ibaret değil.
Takım turu: reddedilen push
Önce kendi main'ini gönder (git push; Görev 1 ve 3'ün commit'leri gider). Sonra:
- Ayşe'nin terminalinde
main'e geç vegit pullyap. Ayşe 1. satırda"Lux"u"Lux (destek)"yapıp commit'lesin ve göndersin. - Kendi terminalinde Ayşe'yi çekmeden, maç saatini
21.00'deden21.30'daya çevir, commit'le ve gönder. Push reddedilmeli. - Durumu düzelt ve gönder. Sonra Ayşe de çeksin.
Bittiğinde iki terminalde de git log --oneline -1 aynı commit'i göstermeli ve node kadro.js hem Lux (destek) hem 21.30'da yazmalı.
İpucu 1
Ayşe hâlâ ozellik/yedek dalında olabilir; önce git switch main.
İpucu 2
Reddedilen push'un çaresi git pull. İki değişiklik farklı satırlarda olduğu için çakışma çıkmaz; MERGE_MSG sekmesini kapatman yeter.
Çözümü göster
Senin terminalin:
PS C:\kod\kadro> git pushTo C:\kod\uzak\kadro.git 5c3f03b..824bfed main -> mainAyşe'nin terminali:
PS C:\kod\ayse-kadro> git switch mainSwitched to branch 'main'Your branch is up to date with 'origin/main'.PS C:\kod\ayse-kadro> git pullFrom C:\kod\uzak\kadro 2abefd0..824bfed main -> origin/mainUpdating 2abefd0..824bfedFast-forward kadro.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)PS C:\kod\ayse-kadro> git add .PS C:\kod\ayse-kadro> git commit -m "Lux'un rolünü yaz"[main 2ac441d] Lux'un rolünü yaz 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\ayse-kadro> git pushTo C:\kod\uzak\kadro.git 824bfed..2ac441d main -> mainSenin terminalin:
PS C:\kod\kadro> git add .PS C:\kod\kadro> git commit -m "Maç saatini 21.30 yap"[main 93bc471] Maç saatini 21.30 yap 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> git pushTo C:\kod\uzak\kadro.git ! [rejected] main -> main (fetch first)error: failed to push some refs to 'C:\kod\uzak\kadro.git'hint: Updates were rejected because the remote contains work that you do nothint: have locally. This is usually caused by another repository pushing tohint: the same ref. If you want to integrate the remote changes, usehint: 'git pull' before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.PS C:\kod\kadro> git pullFrom C:\kod\uzak\kadro 824bfed..2ac441d main -> origin/mainAuto-merging kadro.jsMerge made by the 'ort' strategy. kadro.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> node kadro.jsCumartesi turnuvası, dereceli kadro- Ahri- Garen- Jinx- Lux (destek)- YasuoToplam: 5 şampiyonKaptan: AhriMaç 21.30'da başlıyorHarita: Sihirdar VadisiPS C:\kod\kadro> git pushTo C:\kod\uzak\kadro.git 2ac441d..4bba64b main -> mainPS C:\kod\kadro> git log --oneline -14bba64b (HEAD -> main, origin/main, origin/HEAD) Merge branch 'main' of C:\kod\uzak\kadroAyşe'nin terminali:
PS C:\kod\ayse-kadro> git pullFrom C:\kod\uzak\kadro 2ac441d..4bba64b main -> origin/mainUpdating 2ac441d..4bba64bFast-forward kadro.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\ayse-kadro> git log --oneline -14bba64b (HEAD -> main, origin/main, origin/HEAD) Merge branch 'main' of C:\kod\uzak\kadroPush ve pull çıktılarındaki ilerleme satırlarını (Enumerating objects…, remote: …) kısalık için çıkardık; sende görünür. İki klon da 4bba64b'de: ekip aynı yerde. Sınır denemesi: turu ikiniz de aynı satırı değiştirerek tekrarla; bu sefer git pull çakışmayla durur, Görev 3'teki gibi çözersin.
Gönderilmiş hatayı revert ile geri al
Kendi terminalinde toplam satırını console.log("Toplam: " + kadro.length - 1 + " şampiyon") yap (listenin son oyuncusunu yedek sayıp toplamdan düşmek istedin), Toplamdan yedeği çıkar mesajıyla commit'le ve gönder. Ayşe çeksin, dosyanın sonuna console.log("İyi oyunlar") ekleyip commit'lesin ve göndersin. Sen de çek ve programı çalıştır: toplam satırında bir sorun göreceksin.
Hatalı commit artık son commit değil; üstünde Ayşe'nin commit'i var. Ayşe'nin işini bozmadan yalnızca hatalı commit'i geri al, gönder ve Ayşe de çeksin. Sonunda iki klonda da Toplam: 5 şampiyon ve İyi oyunlar birlikte görünmeli; git log hatalı commit'i de, onu geri alan commit'i de göstermeli.
Sınır denemesi: revert'ten önce hatalı commit'in kodunu tek başına çalıştır. Kopuk HEAD'le o commit'e git, node kadro.js yaz, sonra main'e dön. İyi oyunlar görünmemeli, çünkü o satır sonraki commit'te geldi.
İpucu 1
Toplam satırında NaN şampiyon çıkıyor. Sebebi Ders 9'dan: "Toplam: " + 5 önce metin olur, metinden 1 çıkarınca NaN (sayı değil). Ama bu görevde hatayı düzeltmeyeceğiz, geri alacağız.
İpucu 2
git revert HEAD Ayşe'nin commit'ini geri alır, yanlış. git log --oneline -3 ile hatalı commit'in kimliğini bul ve git revert o kimlikle çalışsın.
İpucu 3
git reset --hard burada iki kez yanlış: paylaşılmış commit'leri dalın geçmişinden düşürür, üstelik Ayşe'nin commit'ini de götürür.
Çözümü göster
Hatalı commit'i gönderdikten ve Ayşe'nin commit'ini çektikten sonra:
PS C:\kod\kadro> node kadro.jsCumartesi turnuvası, dereceli kadro- Ahri- Garen- Jinx- Lux (destek)- YasuoNaN şampiyonKaptan: AhriMaç 21.30'da başlıyorHarita: Sihirdar Vadisiİyi oyunlarPS C:\kod\kadro> git log --oneline -3d54490d (HEAD -> main, origin/main, origin/HEAD) Kapanış mesajı ekleade2988 Toplamdan yedeği çıkar4bba64b Merge branch 'main' of C:\kod\uzak\kadroPS C:\kod\kadro> git revert ade2988Auto-merging kadro.js[main 28e03a1] Revert "Toplamdan yedeği çıkar" 1 file changed, 1 insertion(+), 1 deletion(-)PS C:\kod\kadro> node kadro.jsCumartesi turnuvası, dereceli kadro- Ahri- Garen- Jinx- Lux (destek)- YasuoToplam: 5 şampiyonKaptan: AhriMaç 21.30'da başlıyorHarita: Sihirdar Vadisiİyi oyunlarPS C:\kod\kadro> git log --oneline -428e03a1 (HEAD -> main) Revert "Toplamdan yedeği çıkar"d54490d (origin/main, origin/HEAD) Kapanış mesajı ekleade2988 Toplamdan yedeği çıkar4bba64b Merge branch 'main' of C:\kod\uzak\kadroPS C:\kod\kadro> git pushTo C:\kod\uzak\kadro.git d54490d..28e03a1 main -> mainPush'un ilerleme satırlarını yine çıkardık. Ayşe git pull ile düzeltmeyi alır (Fast-forward) ve aynı çıktıyı görür. İyi oyunlar yerinde kaldı: revert yalnızca o commit'in değiştirdiği satırı geri çevirdi. Satırlar ayrı olduğu için çakışma da çıkmadı; aynı satıra dokunsalardı revert de çakışmayla durabilirdi. Asıl düzeltmeyi (kadro.length - 1'i parantez içine almak) istersen ayrı bir fix: commit'iyle yaparsın.
Sınır denemesi (git revert'ten önce yapılır):
PS C:\kod\kadro> git switch --detach ade2988HEAD is now at ade2988 Toplamdan yedeği çıkarPS C:\kod\kadro> node kadro.jsCumartesi turnuvası, dereceli kadro- Ahri- Garen- Jinx- Lux (destek)- YasuoNaN şampiyonKaptan: AhriMaç 21.30'da başlıyorHarita: Sihirdar VadisiPS C:\kod\kadro> git switch mainPrevious HEAD position was ade2988 Toplamdan yedeği çıkarSwitched to branch 'main'Your branch is up to date with 'origin/main'.NaN satırı var, İyi oyunlar yok: kopuk HEAD seni tam o commit'in anına götürdü. Bakmak zararsız, çünkü git switch main her şeyi geri getirdi.
GitHub'da ilk pull request'in
Bu görev gerçek GitHub'da, Ders 7'de açtığın ogren deposunda. C:\kod\ogren'de:
main'i güncelle,docs/ders52-notuadında bir dal aç.README.md'deki içindekiler listesine- **Ders 52:** Git dalları, birleştirme ve pull requestsatırını ekle; Conventional Commits biçiminde bir mesajla commit'le ve dalı GitHub'a gönder.- GitHub'da PR aç. Açıklamaya dersteki şablonla "ne, neden, nasıl denenir" yaz.
- Files changed'de eklediğin satıra kendi kendine bir yorum yaz ve incelemeyi Comment olarak gönder (kendi PR'ını onaylayamazsın).
- Merge pull request ile birleştir, GitHub'daki dalı sil.
- Kendi bilgisayarında
main'e dön, çek, yerel dalı sil ve silinen uzak dalın izini de temizle.
Bittiğinde GitHub'daki README'de Ders 52 satırı görünmeli, git branch -a çıktısında docs/ders52-notu kalmamalı.
İpucu 1
Mesaj: docs: README'ye Ders 52 notunu ekle. İlk push'ta -u origin docs/ders52-notu.
İpucu 2
PR birleşince GitHub'daki main bir adım ileride olur; git pull onu getirir. Yerel dalı git branch -d ile sil.
İpucu 3
GitHub'da silinen dalın bilgisayarındaki izi (remotes/origin/docs/ders52-notu) kendiliğinden gitmez. git fetch --prune uzakta artık olmayan dalların izlerini siler (prune: budamak).
Çözümü göster
PS C:\kod\ogren> git switch mainAlready on 'main'Your branch is up to date with 'origin/main'.PS C:\kod\ogren> git pull# GitHub'dan gelen çıktı: yenilik yoksa "Already up to date."PS C:\kod\ogren> git switch -c docs/ders52-notuSwitched to a new branch 'docs/ders52-notu'PS C:\kod\ogren> git status --short M README.mdPS C:\kod\ogren> git add README.mdPS C:\kod\ogren> git commit -m "docs: README'ye Ders 52 notunu ekle"[docs/ders52-notu 19f6a44] docs: README'ye Ders 52 notunu ekle 1 file changed, 1 insertion(+)PS C:\kod\ogren> git push -u origin docs/ders52-notu# Ders 7'deki ilk push'a benzer; sonda * [new branch] docs/ders52-notu -> docs/ders52-notuGitHub'da: depo sayfasındaki Compare & pull request, açıklama, Create pull request; Files changed'de satır yorumu, Review changes → Comment → Submit review; Conversation'da Merge pull request → Confirm merge, sonra Delete branch. PR sayfasında artık mor bir Merged etiketi görünür.
PS C:\kod\ogren> git switch mainSwitched to branch 'main'Your branch is up to date with 'origin/main'.PS C:\kod\ogren> git pull# remote: ve From https://github.com/… satırlarıUpdating 762aeb3..e3a8953Fast-forward README.md | 1 + 1 file changed, 1 insertion(+)PS C:\kod\ogren> git branch -d docs/ders52-notuDeleted branch docs/ders52-notu (was 19f6a44).PS C:\kod\ogren> git fetch --prune# From https://github.com/… satırı - [deleted] (none) -> origin/docs/ders52-notuPS C:\kod\ogren> git branch -a* main remotes/origin/HEAD -> origin/main remotes/origin/mainYeşil # satırları bizim notumuz: oralarda GitHub'ın adresi ve ilerleme satırları görünür. Çözümün yerel kısmını GitHub yerine C:\kod\uzak'taki bir çıplak depoyla denedik; GitHub'da yalnızca adresler farklıdır. PR'ı Squash and merge ile birleştirdiysen git branch -d not fully merged diyebilir; PR'ın birleştiğini gördüğün için -D güvenli.
Kendini sına
Soru 1
git switch ozellik/rol yazdın; sende böyle bir dal yok ama Ayşe onu push etmiş. Ne olur? -c ile yazsan fark eder miydi?
Cevabı göster
Önce git fetch yaptıysan Git origin/ozellik/rol'ü bulur, ondan aynı adlı yerel bir dal açıp bağlar (set up to track) ve Ayşe'nin işini görürsün. Fetch yapmadıysan Git o dalı hiç duymamıştır: fatal: invalid reference: ozellik/rol alırsın. git switch -c ozellik/rol ise bulunduğun commit'ten yeni bir dal açar: Ayşe'nin commit'leri onda olmaz, yalnızca adları aynı olur.
Soru 2
git merge çıktısında Fast-forward yazdı ve git log --graph'ta yeni bir commit görünmüyor. Neden?
Cevabı göster
Birleştirdiğin dal, bulunduğun dalın doğrudan devamıydı: sen dalda çalışırken hedef dala yeni commit gelmemişti. Git'in birleştirecek iki kolu yoktu; yalnızca hedef dalın etiketini ileri kaydırdı. Birleştirme commit'i yalnızca iki kol da ilerlediyse oluşur.
Soru 3
main'deyken git merge dukkan-indirim dedin ve dosyada bunu gördün. Hangi satır hangi dala ait? Accept Incoming Change'e basarsan ne kalır?
<<<<<<< HEADconst esyaFiyati = 3000=======const esyaFiyati = 2600>>>>>>> dukkan-indirimCevabı göster
<<<<<<< HEAD ile ======= arası bulunduğun dalın, yani main'in hâli: 3000. ======= ile >>>>>>> dukkan-indirim arası gelen dalın hâli: 2600. Accept Incoming Change üç işaret satırını ve main'in satırını siler; geriye yalnızca const esyaFiyati = 2600 kalır. Ardından dosyayı dene, git add ve git commit.
Soru 4
git fetch sonrası git status şunu diyor. Dosyaların değişti mi? Ne yaparsın?
Your branch is behind 'origin/main' by 2 commits, and can be fast-forwarded. (use "git pull" to update your local branch)Cevabı göster
Hayır. git fetch yalnızca origin/main'i güncelledi; senin main'in ve dosyaların yerinde. Uzakta senin almadığın 2 commit var, sende de onlarda olmayan commit yok. git pull yaparsın; ayrışma olmadığı için birleştirme commit'i oluşmaz, ileri sarma olur.
Soru 5
Push ettiğin bir commit'in bozuk olduğunu fark ettin; Ayşe de çekti. git revert mi, git reset --hard mı? Neden?
Cevabı göster
git revert. Bozuk commit'in tersini yapan yeni bir commit ekler; geçmiş korunur, Ayşe dahil herkes git pull ile düzeltmeyi alır. git reset --hard dalı geri sarar: push reddedilir, --force ile zorlarsan uzak depodaki commit'leri (belki Ayşe'nin yenilerini de) silersin ve Ayşe'nin klonu uzak depoyla ters düşer.
Soru 6
Hangi commit mesajları Conventional Commits biçimine uyuyor?
1. fix: kaptan indeksini düzelt2. Düzeltme yapıldı3. feat(kadro): yedek oyuncuyu yazdır4. docs README güncellendiCevabı göster
1 ve 3. Biçim tür: açıklama; tür ile açıklama arasında iki nokta ve boşluk olmalı, kapsam isteğe bağlı olarak parantezde verilir. 2'de tür yok ve neyin düzeltildiği belli değil. 4'te iki nokta yok; doğrusu docs: README'ye çalıştırma adımını ekle gibi, neyin değiştiğini söyleyen bir mesaj.
Soru 7
Kopuk HEAD'deyken bir commit attın, sonra git switch main dedin. Commit'e ne oldu, nasıl kurtarırsın?
Cevabı göster
Commit silinmedi ama hiçbir dala bağlı değil; Git you are leaving 1 commit behind uyarısında kimliğini yazdı. O kimlikle bir dal açarak kurtarırsın: git branch zed-denemesi b6bcf48. Uyarıyı kaçırırsan kimliği bulmak zorlaşır; bu yüzden kopuk HEAD'de commit atmadan önce git switch -c ile dal açmak en iyisi.
Kayıt noktası
Bu derste zaten birçok commit attın ve C:\kod\uzak'a gönderdin. Dersi, öğrendiğin akışla bir README ekleyerek kapat: dal aç, commit'le, main'e birleştir, gönder, dalı sil. docs/readme dalını açtıktan sonra C:\kod\kadro'da şu dosyayı oluştur:
# kadro Ders 52'de Git dallarını, birleştirmeyi ve takım akışını denediğim alıştırma deposu. ```node kadro.js```Bir sonraki derste "bu değişiklik bir şeyi bozdu mu?" sorusunu elle değil, otomatik cevaplayan testler yazacak ve onları her push'ta, her pull request'te GitHub Actions ile kendiliğinden çalıştıracaksın.