git ready

Lerne Git Commit für Commit
von Nick Quaranto, Übersetzung von Nico Gulden

Branchen und Mergen

eingetragen am 25 Jan 2009

Branchen oder verzweigen ist in Git einfacher, als du denkst. Es ist schnell (40 Zeichen in eine Datei geschrieben), einfach (ein Befehl zum Erzeugen eines Branches) und effizient (es erzeugt keine vollständige Kopie deines aktuellen Arbeitsstatus). Die Branches, die du erzeugst, müssen nicht im Remote Repository existieren, so dass du sie zum Testen neuer Features oder für Bugfixes verwenden kannst, ohne bereits funktionierende Teile zu beschädigen. Why Git is Better Than X drückt es wohl am besten aus:

Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. […] Git makes this process incredibly easy and it changes the way most developers work when they learn it.

Das ist nett, aber du könntest noch Vorbehalte bei der Nutzung von Branches haben, wegen der Assoziationen mit vorangegangenen Versionskontrollsystem und deren Handhabung von Branches. Derartige Sorgen gehören der Vergangenheit an. Wir gehen ein einfaches Beispiel zu Branchen, Mergen und Konfliktlösung durch.

Ich arbeite wieder mit dem jekyll Repository. Ich checke einen Branch aus, machen ein paar Änderungen an Dateien und führe sie im Master Branch zusammen.

$ git checkout -b fixes
  Switched to a new branch "fixes"

$ vim lib/jekyll/core_ext.rb

$ git commit -am "Adding cutoff method to String"
  Created commit 670e353: Adding cutoff method to string
   1 files changed, 15 insertions(+), 1 deletions(-)

$ git checkout master
  Switched to branch "master"

$ git merge fixes
  Updating e53ac7a..670e353
  Fast forward
   lib/jekyll/core_ext.rb |   16 +++++++++++++++-
    1 files changed, 15 insertions(+), 1 deletions(-)

Das war’s! Mit git branch -d fixes entfernst du den Branch. Da es so einfach ist, einen Branch zu erstellen und damit zu arbeiten, ist die Einbindung dieses Prozesses in den Arbeitsablauf sinnvoll. Jos Susser schrieb einen großartigen Beitrag darüber, wie er Branches bei seiner Arbeit verwendet

Es ist wirklich ein einfaches Beispiel eines fast-forward Merges. Aber das ist nicht immer so. Lass uns durch eine Änderung gehen, die ich in der selben Zeile der Datei in beiden Branches, Master und dem neuen Branch, gemacht habe. Schauen wir, wie Git darauf reagiert:

$ vim lib/jekyll/core.rb

$ git commit -am "Causing a merge on purpose"
  Created commit 8aba87e: Causing a merge on purpose
   1 files changed, 2 insertions(+), 2 deletions(-)

$ git checkout -b conflicts

$ vim lib/jekyll/core.rb

$ git commit -am "Changing cutoff default"
  Created commit 6041ddd: Changing cutoff default
   1 files changed, 1 insertions(+), 1 deletions(-)

$ git checkout master
  Switched to branch "master"

$ git merge conflicts
  Auto-merged lib/jekyll/core_ext.rb
  CONFLICT (content): Merge conflict in lib/jekyll/core_ext.rb
  Automatic merge failed; fix conflicts and then commit the result.

Die geöffnete Datei offenbart uns, dass Git uns die Unterschiede der Versionen in diesem Stück Text zeigt:

git status sollte noch unseren Konflikt anzeigen. Wir wollen die Änderung meiner neuen Version behalten und löschen einfach die Zeilen, die Git dort eingefügt hat und die alte Version. Die Datei mit add und commit normal behandeln und die Zusammenführung ist aufgelöst!

$ git status
  # On branch master
  #
  # Changed but not updated:
  #   (use "git add <file>..." to update what will be committed)
  #
  # unmerged:   lib/jekyll/core_ext.rb
  #

$ vim lib/jekyll/core.rb

$ git commit -am "Fixing conflict!"
  Created commit 9c8e9fd: Fixing conflict!

Damit entsteht ein besonderer Commit, der zwei Eltern-Commits hat, jeweils von den Branches, die zusammengeführt wurden:

$ git show HEAD
  commit 9c8e9fd335381fe6a97708f7b3cd1d5acf670d2d
  Merge: 8aba87e... 6041ddd...
  Author: Nick Quaranto <nick@quaran.to>
  Date:   Sun Jan 25 13:22:03 2009 -0500

      Fixing conflict!

Künftige Tips werden Helferwerkzeuge für diesen Prozess abdecken, wie git-mergetool und gitk --merge. Wenn du ein gutes Tutorial dazu oder andere Arten der Zusammenführung kennst, schicke uns einen Tip! Schaue dir in der Zwischenzeit Scott Chacons Gitcast zu diesem Thema an oder lies den Git Community Book’s guide, wenn du mehr Informationen zu diesem Thema möchtest.