Mein privates Git Cheat Sheet

Da ich in verschiedensten Projekten regelmäßig mit Git arbeite, habe ich mir überlegt, die wichtigsten Szenarien, denen ich begegne, in einem privaten Cheat Sheet zusammenzufassen.

Ich weiß, dass ich der Welt damit nichts Neues offenbare, aber es ist praktisch, das alles mal an einem Ort versammelt zu haben.

Aktualisieren von Upstream-Repositories

Ich arbeite häufig mit Upstream-Repositories, von denen ich aus irgend einem Grund einmal einen Clone erstellt habe. Damit ich bei diesem Repositories auf dem Laufenden bleibe, füge ich sie meiner lokalen Arbeitskopie als Remote-Repository hinzu.

Ein Beispiel dafür ist mein Fork von Homebrew auf GitHub. Damit dieser nicht zu weit hinter dem offiziellen Homebrew-Repository läuft, aktualisiere ich ihn regelmäßig. Dazu habe ich auf meinem lokalen Clone (origin ist git@github.com:gbeine/homebrew.git) das Homebrew-Repository hinzugefügt:

git remote add upstream https://github.com/Homebrew/homebrew.git

Jetzt kann ich mein Fork Repository mit vier einfachen Schritten auf den aktuellen Stand des offiziellen Homebrew-Repositories bringen:

  1. Die Daten von Remote Repository holen:
    git fetch upstream
  2. Auf den master wechseln (ich arbeite hier normalerweise mit Branches):
    git checkout master
  3. Den master auf den Stand des upstream aktualisieren:
    git rebase upstream/master
  4. Den aktualisierten master auf origin veröffentlichen:
    git push origin master

Damit sind alle Änderungen aus dem offiziellen Repository in meinen Fork übernommen worden.

Mergen von Upstream-Repositories

Das zuerst beschriebene Szenario funktioniert gut, so lange man keine Änderungen auf dem master macht, die man veröffentlichen möchte. Macht man solche Änderungen, muss man entweder auf einen anderen Branch ausweichen oder die folgenden Schritte verwenden.

Als Beispiel dafür verwende ich meinen Fork des MediaWiki-Repositories. Auf GitHub habe ich einen Fork von https://github.com/wikimedia/mediawiki-core.git erstellt und einen lokalen Clone erzeugt. origin ist git@github.com:gbeine/MediaWiki.git.

Ich habe Änderungen auf dem master meines Clones gemacht und auch veröffentlicht. Dennoch möchte ich meine private Version von MediaWiki auf dem aktuellen Stand des offiziellen Repositories halten. Das geht ebenfalls mit einem Upstream-Repository und einem zusätzlichen Branch.

Zunächst muss ich wieder das offizielle Remote-Repository hinzufügen:

git remote add upstream https://github.com/wikimedia/mediawiki-core.git

Jetzt kann ich meinen master mit den folgenden Schritten auf den aktuellen Stand bringen:

  1. Die aktuellen Daten von Upstream-Repository holen:
    git fetch upstream
  2. Auf den Branch für upstream wechseln (-B benötigt man nur beim ersten Mal):
    git checkout -B upstream
  3. Den upstream aktualisieren:
    git merge upstream/master
  4. Optional, aber sinnvoll: den Branch upstream veröffentlichen:
    git push -f origin upstream
  5. Auf den master wechseln:
    git checkout master
  6. Vom Branch upstream auf den master mergen:
    git merge --no-ff upstream
  7. Den master veröffentlichen:
    git push origin master

Sofern man noch keine Änderungen auf dem master gemacht hat, kann man beim Schritt drei auch git rebase upstream/master verwenden. Das ist auf jeden Fall der beste Weg! Zur Not geht man für den upstream-Branch einige Commits zurück.

Wichtig ist, dass man beim Aktualisieren des master keinen Fast-Forward-Merge durchführt. Deshalb habe ich Fast-Forward-Merges für meinen master abgeschalten:

git config branch.master.mergeoptions "--no-ff"

Löschen von Branches

Die Möglichkeit, Branches zu löschen, benötige ich ebenfalls wegen meiner Homebrew-Aktivitäten. Das Löschen von Branches ist mit Git denkbar einfach.

  1. Remote Branch löschen:
    git push origin :mybranch
  2. Lokalen Branch löschen:
    git branch -d mybranch

Branches verfolgen

Einen lokalen Branch an einen bestimmten remote Branch zu binden, ist kein Problem:

git branch -u upstream/remote_branch local_branch

Branches veröffentlichen

Neue Branches lassen sich sehr einfach veröffentlichen:

git push git@github.com:gbeine/homebrew.git newbranch

Upstream mit Subversion

Das oben beschriebene Konzept der Upstream Branches lässt sich natürlich auch mit Subversion-Repositories anwenden. Wenn das Subversion-Repository der Upstream sein soll, funktioniert das wie folgt:

  1. Clonen des Git-Repositories als origin:
    git clone "git-url"
  2. Auf upstream Branch wechseln:
    git checkout -B upstream
  3. Verbinden mit Subversion-Repository als upstream:
    git svn init —prefix upstream/ -s "svn-url"`
  4. Daten von Subversion holen:
    git svn fetch
  5. Den upstream auf den aktuellen Stand bringen:
    git svn rebase
  6. Den upstream Branch veröffentlichen:
    git push origin upstream
  7. Zum master Branch wechseln:
    git checkout master
  8. Die Änderungen aus Subversion übernehmen:
    git merge --no-ff upstream
  9. Den master Branch veröffentlichen:
    git push origin master

Jetzt kann man wie oben beschrieben, Änderungen von Subversion nach Git mergen. Die Aktualisierungen aus Subversion zieht man immer in den upstream Branch und kann diesen auch im Remote Git-Repository veröffentlichen.

Löschen von Commits

Es passiert mir manchmal, dass ich etwas committe, das ich dann doch nicht so haben will. Dann muss der letzte Commit wieder gelöscht werden. Das geht mit diesem Kommando:

git reset —soft HEAD~1

Quellen

Da das alles nur gut geklaut ist, hier die URLs der Seiten, die mich inspiriert und illuminiert haben:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.