GIT CONFLICTS ve Çakışmaların Çözümü (4)
GİT kullanımında branch kullanımı ve farklı branch larda bulunan geliştirmelerin birleştirilmesini gördük. Günlük hayatta aynı branch üzerinde aynı dosyanın değiştirilmesi sık olmasa dahi karşılacağınız bir durumdur.
Bununla ilgili bir örnek dizisi yapalım. Bu konunun adı CONFLICTS olarak geçmektedir.
öncelikle durumu kontrol edelim.
ozgur-MacBook-Pro:gitsample ozgurozkok$ git status
On branch master
nothing to commit, working tree clean
ozgur-MacBook-Pro:gitsample ozgurozkok$ git log –oneline
7472ef5 (HEAD -> master, devel) tool.cpp dosyasını eklemiştim
4ef6ed1 (devtest) yeniden ekledim bi şeyler
02390c2 dosyayı yaratırken yaptğım değişiklikler
CONNFLICTS çalışması yapmak için değişiklikleri eski haline getirerek, temiz 🙂 bir ağaç üzerinde çalışma yapacağız. Değişiklikleri (COMMIT işlerini) geri almak sıfırlamak için RESET komutunu kullanıyoruz. RESET’ i HARD ile birlikte kullandığımızda değişiklikler siliniyor.
ozgur-MacBook-Pro:gitsample ozgurozkok$ git reset –hard 02390c2
HEAD is now at 02390c2 dosyayı yaratırken yaptğım değişiklikler
ozgur-MacBook-Pro:gitsample ozgurozkok$ git status
On branch master
nothing to commit, working tree clean
ozgur-MacBook-Pro:gitsample ozgurozkok$ git log –oneline
02390c2 (HEAD -> master) dosyayı yaratırken yaptğım değişiklikler
Önceki derslerde yaptığımız değişiklikler silindi ve çalışma dizinimizde tek dosya kaldı.
Şimdi iki branch açacağız. İki branch üzerinde farklı kişiler aynı dosya üzerinde bir takım değişiklikler yapacak ve çakışma elde edeceğiz. Ardından da çakışmayı çözeceğiz.
Branch ‘lerimizin isimleri branch-1 ve branch-2 olacak.
ozgur-MacBook-Pro:gitsample ozgurozkok$ git branch branch-1
ozgur-MacBook-Pro:gitsample ozgurozkok$ git branch branch-2
ozgur-MacBook-Pro:gitsample ozgurozkok$ git status
On branch master
nothing to commit, working tree clean
ozgur-MacBook-Pro:gitsample ozgurozkok$ git log –oneline
02390c2 (HEAD -> master, branch-2, branch-1) dosyayı yaratırken yaptğım değişiklikler
ozgur-MacBook-Pro:gitsample ozgurozkok$
İki branch üzerinde farklı adlı iki function oluşturarak birleştirmeyi deneyeceğim.
Senaryomuz tam olarak şu olacak . BRANCH-1 üzerinde funcOne , BRANCH-2 üzerinde funcTwo oluşturacağız. İkisini MASTER üzerinde birleştireceğiz.
}ozgur-MacBook-Pro:gitsample ozgurozkok$ git checkout branch-1
M main.cpp
Switched to branch ‘branch-1’
ozgur-MacBook-Pro:gitsample ozgurozkok$ cat main.cpp
void funcOne(){
printf(“birinci fonksiyon”);
}
void main(){
printf(“merhaba dünya”);
funcOne();
}ozgur-MacBook-Pro:gitsample ozgurozkok$ git add main.cpp
ozgur-MacBook-Pro:gitsample ozgurozkok$ git commit -m “funcOne fonksiyonu ekledim.”
[branch-1 9defe3f] funcOne fonksiyonu ekledim.
1 file changed, 5 insertions(+)
Yaptığımız değişiklikler BRANCH-1 üzerinde kaldı. BRANCH-2 ‘e geçtiğimizde görmeyeceğiz.
ozgur-MacBook-Pro:gitsample ozgurozkok$ git checkout branch-2
Switched to branch ‘branch-2’
ozgur-MacBook-Pro:gitsample ozgurozkok$ cat main.cpp
void main(){
printf(“merhaba dünya”);
}ozgur-MacBook-Pro:gitsample ozgurozkok$ git add main.cpp
ozgur-MacBook-Pro:gitsample ozgurozkok$ git commit -m “ikinci fonksiyonu ekledim”
[branch-2 c917605] ikinci fonksiyonu ekledim
1 file changed, 6 insertions(+)
ozgur-MacBook-Pro:gitsample ozgurozkok$ git log –oneline
c917605 (HEAD -> branch-2) ikinci fonksiyonu ekledim
02390c2 (master) dosyayı yaratırken yaptğım değişiklikler
ozgur-MacBook-Pro:gitsample ozgurozkok$ git status
On branch branch-2
nothing to commit, working tree clean
ozgur-MacBook-Pro:gitsample ozgurozkok$ git checkout branch-1
Switched to branch ‘branch-1’
ozgur-MacBook-Pro:gitsample ozgurozkok$ git log –oneline
9defe3f (HEAD -> branch-1) funcOne fonksiyonu ekledim.
02390c2 (master) dosyayı yaratırken yaptğım değişiklikler
ozgur-MacBook-Pro:gitsample ozgurozkok$ git status
On branch branch-1
nothing to commit, working tree clean
İki branch üzerinde aynı dosyanın iki biçimi oluştu. Şimdi MASTER branch’ e geçerek bunları merge edeceğiz.
ozgur-MacBook-Pro:gitsample ozgurozkok$ git checkout master
Switched to branch ‘master’
ozgur-MacBook-Pro:gitsample ozgurozkok$ git merge branch-1
Updating 02390c2..9defe3f
Fast-forward
main.cpp | 5 +++++
1 file changed, 5 insertions(+)
ozgur-MacBook-Pro:gitsample ozgurozkok$ git merge branch-2
Auto-merging main.cpp
CONFLICT (content): Merge conflict in main.cpp
Automatic merge failed; fix conflicts and then commit the result.
ozgur-MacBook-Pro:gitsample ozgurozkok$ cat main.cpp
<<<<<<< HEAD
void funcOne(){
printf(“birinci fonksiyon”);
=======
void funcTwo()
{
printf(“ikinci fonksiyon”);
>>>>>>> branch-2
}
void main(){
printf(“merhaba dünya”);
<<<<<<< HEAD
funcOne();
=======
funcTwo();
>>>>>>> branch-2
}ozgur-MacBook-Pro:gitsample ozgurozkok$
Çalışma dosyamızı incelediğimizde çakışmayı belirten HEAD ve —— belirteçlerini görüyoruz. STATUS ile görebiliyoruz.
ozgur-MacBook-Pro:gitsample ozgurozkok$ git log –oneline
9defe3f (HEAD -> master, branch-1) funcOne fonksiyonu ekledim.
02390c2 dosyayı yaratırken yaptğım değişiklikler
ozgur-MacBook-Pro:gitsample ozgurozkok$ git status
On branch master
You 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: main.cpp
no changes added to commit (use “git add” and/or “git commit -a”)
ozgur-MacBook-Pro:gitsample ozgurozkok$
Şimdi bu kodumuzu beklediğimiz gibi düzeltelim.
ozgur-MacBook-Pro:gitsample ozgurozkok$ cat main.cpp
void funcOne(){
printf(“birinci fonksiyon”);
}
void funcTwo()
{
printf(“ikinci fonksiyon”);
}
void main(){
printf(“merhaba dünya”);
funcOne();
funcTwo();
}
Artık MASTER branch üzerindeyiz ve yaptıklarımızı doğrudan COMMIT ediyoruz.
ozgur-MacBook-Pro:gitsample ozgurozkok$ git add main.cpp
ozgur-MacBook-Pro:gitsample ozgurozkok$ git commit -m “conflict işini çözmüştüm”
[master 1ff64b6] conflict işini çözmüştüm
ozgur-MacBook-Pro:gitsample ozgurozkok$ git status
On branch master
nothing to commit, working tree clean
ozgur-MacBook-Pro:gitsample ozgurozkok$
CONFLICT sorunları takım çalışmalarında karşımıza çıkabilir. Kodlarımızı düzenlerken, BRANCH ‘lerimizi oluştururken yaptığımız pek çok işin amacı bu çakışmaları baştan engellemek içindir.