Close

2020-04-25

GIT CONFLICTS ve Çakışmaların Çözümü (4)

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.  

https://ozgurozkok.com/collaboration-made-easy-harnessing-the-power-of-pycharm-and-github-together/