Skip to content

Conflicten oplossen

Hein Pauwelyn edited this page Nov 27, 2016 · 13 revisions

Intoductie

Wanneer zijn er conflicten en hoe herken je ze?

Conflics happens when two branches have changed the same part of the same file, and then those branches are merged together. For example, if you make a change on a particular line in a file, and your colleague working in a repository makes a change on the exact same line, a merge conflict occurs. Git has trouble understanding which change should be used, so it asks you to help out.

Bron: help.github.com

Een conflict ziet er altijd zo uit:

the number of planets are
<<<<<<< HEAD
nine
=======
eight
>>>>>>> devHein
  • <<<<<<< hieronder staat de code aan op de master branch (waarom er HEAD staat i.p.v. master weet ik niet)
  • ======= onderschijd verschillende code versies
  • >>>>>>> hierboven staat de code op uw eigen branch (in deze situatie is dit devHein)

Hoe oplossen?

Eerst dit uitvoeren.

Indien je een conflict tegenkomt, ziet dit er zo uit in je client. Herkenbaar aan de ⚠️ naast het bestand.

conflict in client

Open dat bestand in uw gebruikelijke IDE en neem zelf de beslissing om de verkeerde code weg te nemen. In het bovenstaande voorbeeld mag alle doorstreepte tekst dus weg:

the number of planets are
<<<<<<< HEAD
nine
=======
eight
>>>>>>> devHein

Een meer toepasselijke voorbeeldje zie je hieronder:

public class Rekenmachine {
<<<<<<< HEAD
    public int berekenSom(int a, int b) {
=======
    public double berekenSom(double a, double b)
    {
>>>>>>> devHein
        return a + b;
    }

<<<<<<< HEAD
    public int berekenVerschil(int a, int b) {
=======
    public double berekenVerschil(double a, double b)
    {
>>>>>>> devHein
        return a - b;
    }
}

Aan u om te beslissen wat weg mag en wat moet blijven. Het is aangeraden om even te overleggen met uw team genoten.

Indien er geen ⚠️ tekens te zien zijn in uw client en de code compileert, kan je committen op uw eigen branch en kan je opnieuw verder werken.

Nog altijd conflicten?

Komt niet zoveel voor en niets anders kan.

Indien er nog altijd conflicten zijn en het bestand is niet te vinden, doe je het vinkje uit dat voor het bestand staat zoals op onderstaande afbeelding en commit je zonder die bestanden.

image

Deze bestanden komen na uw commit terug onder de veranderingen (changes) te staan maar zal waarschijnlijk geen problemen meer geven.

Discart changes?

Allerlaatste optie die je nog kan doen en als je echt niets anders kan.

Indien er een pipo veranderingen gedaan hebt die je niet wilt, kan je altijd kiezen voor discart changes. Hiervoor ga je als volgt te werk in de client:

  1. Rechtermuisknop op file
  2. Discart changes

Let er wel me op dat je niet te veel weg doet zodat uw eigen gemaakte en goede code niet weg is.

Ik kan niet mergen door conflicten

Indien je dit tegenkomt, moet je eerst uw branch updaten met de master en krijg je direct conflicten. Deze kan je oplossen op uw eigen branch zoals hierboven uitgelegd.

This branch has conflicts that must be resolved

Q&A

Q: Hoe los je dat dan op? als bv op lijn 27 van de build.gradle door mij een library abc werd toegevoegd en door iemand anders library xyz en ze moeten er beide in?

A: De eerste persoon die de commit van de nieuwe library doet, zal dit kunnen doen zonder conflict. De tweede persoon krijgt dan wel een conflict als hij zijn branch wilt updaten met alles wat op de master branch staat.

Een voorbeeld:

Dit werd gecommit door persoon A:

// ...

dependencies {

    //RETROFIT + RXJAVA
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
    compile 'com.android.support:support-v4:23.4.0'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
    compile 'com.google.code.gson:gson:2.6.2'
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'com.android.support:recyclerview-v7:23.4.0'
    compile 'com.jakewharton:butterknife:8.4.0' // nieuwe library door persoon A
    testCompile 'junit:junit:4.12'
}

Dit wil persoon B committen:

// ...

dependencies {

    //RETROFIT + RXJAVA
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
    compile 'com.android.support:support-v4:23.4.0'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
    compile 'com.google.code.gson:gson:2.6.2'
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'com.android.support:recyclerview-v7:23.4.0'
    compile 'com.github.bumptech.glide:glide:3.7.0'   // nieuwe library door persoon B op zelfde lijn als persoon A
    testCompile 'junit:junit:4.12'
}

Persoon B krijgt het conflict en ziet er zo uit:

// ...

dependencies {

    //RETROFIT + RXJAVA
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
    compile 'com.android.support:support-v4:23.4.0'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
    compile 'com.google.code.gson:gson:2.6.2'
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'com.android.support:recyclerview-v7:23.4.0'
<<<<<<< HEAD
    compile 'com.jakewharton:butterknife:8.4.0'
=======
    compile 'com.github.bumptech.glide:glide:3.7.0'  
>>>>>>> zijnBranch
    testCompile 'junit:junit:4.12'
}

Beide library zijn nodig voor het uitvoeren van de applicatie. De oplossing is zeer simpel. Verwijder gewoon de lijnen met <<<<<<< HEAD, ======= en >>>>>>> zijnBranch en laat de rest staan incl. de enters. Opslaan en committen.