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.