Git: Wie Du Git mit GitHub nutzt (Howto)

Wie Du Git mit GitHub nutzt

In diesem Howto sind die wichtigsten Befehle für git zusammengestellt und beschrieben.

Die Ergebnisse aller beispielhaft durchgeführten Befehle sind in mein Repository git_test bei GitHub 🙂 zu finden.

Wissenswertes zu Git

Commit-Id

Alles was in Git gespeichert wird, bekommt eine eindeutige Id. Diese Id wird aus der Quersumme (Hashfunktion) über den Inhalt gebildet. Dabei wird der Algorithmus SHA-1 (Secure Hash Algorithm Variante 1) verwendet. Der Algorithmus SHA-1 erzeugt Hashes mit der Länge von 40 Zeichen (160 Bit) – aber häufig werden nur die ersten 7 Zeichen des Hashes als Kurzform verwendet (z. B. ae20eaf). Damit kann jederzeit überprüft werden, ob der Inhalt korrekt ist – indem der Hash-Wert wieder berechnet wird.

Directories und Repositories

Git besitzt ein Working Directory (Arbeitsverzeichnis), eine Staging Area (Index), ein Local Repository (Lokaler Datenspeicher) und das Remote Repository (Öffentlicher Datenspeicher). Im Arbeitsverzeichnis werden die Dateien verändert, wie bei jedem anderen Versionsverwaltungswerkzeug auch. Die vorgenommenen Änderungen werden dann in der Staging Area zum Commit zusammengestellt. Damit kann der Commit so zusammengestellt werden, wie der Entwickler es wünscht. Das Commit transferiert die Änderungen endgültig in das lokale Repository. Über den Push werden das öffentliche und lokale Repository miteinander synchronisiert.

Clon

Typischerweise wird in einem Git Repository ein Projekt abgelegt. Mehrere Repositories liegen wiederum auf einem Server. Damit unterscheidet sich Git zu anderen Versionsverwaltungswerkzeugen, die typischerweise in einem Repository mehrere Projekte verwalten. Git ist dezentral organisiert, um ein Projekt bearbeiten zu können, muss eine Kopie des Repositories geholt werden. Diese lokale Kopie nennt sich Klon. Änderungen an Dateien, neue Versionen und Branches werden zunächst in diesem Klon verwaltet. Später können diese lokalen Änderungen mit den Änderungen im Remote Repository abgeglichen werden. Neue Versionen und Branches müssen dabei separat übertragen werden.

Branch

Der Branch features-x ist in Git nur ein Zeiger auf einen Commit. Die Datei .git/refs/heads/features-x enthält die Id des Commits. Werden Änderungen in einen Branch eingebracht, so wird die Id in dieser Datei auf einen neuen Wert gesetzt. Die Branches werden normalerweise nicht automatisch mit einem entfernten Repository synchronisiert – die Änderungen (Commits) die auf einem Branch erfolgt sind – aber schon. Bestimmte Branches, wie der master, sind als Upstream markiert, diese werden mit einem entfernten Repository automatisch synchronisiert. Die Historie eines Branches entsteht aus der Historie der Vorgänger des Commits, welcher durch den Branch markiert ist. Ein Tag ist, wie die Branches, auch nur ein Zeiger auf einen Commit (Datei .git/refs/tags/v1.0).

git config

Mit diesem Befehl kann Git konfiguriert werden. In den folgenden Beispielen sind einige Konfigurationsmöglichkeiten aufgelistet. Einige Einstellungen sollten Projekt-übergreifend und abhängig vom Betriebssystem (core.editor und merge.tool) definiert werden. Um die Lesbarkeit zu erhöhen, werden die Ausgaben eingefärbt (color.*). Für Computer mit mehreren Prozessorkernen sollte die Option pack.threads auf 0 gesetzt werden.

Meine globalen Git Konfigurationen …

$ git config --global user.name "Frank W. Rahn"
$ git config --global user.email "...@frank-rahn.de"
$ git config --global color.diff "auto"
$ git config --global color.status "auto"
$ git config --global color.branch "auto"
$ git config --global color.interactive "auto"
$ git config --global color.ui "true"
$ git config --global core.editor "vim"
$ git config --global merge.tool "vimdiff"
$ git config --global pack.threads "0"
$ git config --global receive.denycurrentbranch "warn2"
$

Meine Repository-spezifische Git Konfigurationen …

$ git config --local user.name "Frank W. Rahn"
$

Beispielhafter Zugriff auf die Git Konfiguration.

$ git config user.name
Frank W. Rahn
$
$ git config --local --unset user.name
$

Mit dem folgenden Befehl können die Git Konfigurationen angesehen werden, die für alle User gelten.

$ git config --system --list
...

git init

Im folgendem Beispielen wird ein lokales Repository erzeugt und erste einfache Befehle ausgeführt.

Alle Befehle wurden unter Linux (Kubuntu) in der Kommandozeile (Bash) ausgeführt.

Das Erstellen eines lokalen Repositories in Verzeichnis git_test.

$ mkdir git_test
$ cd git_test
$ git init
Initialized empty Git repository in /home/frank/git_test/.git/
$ 
$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
$ git status -s
$

Das Verzeichnis ~/git_test ist das Working Directory von git.

git add / git status

Das Anlegen der Dateien README.md und .gitignore für Java-Projekte.

$ echo "Test Repository" > README.md
$ echo "===============" >> README.md
$ 
$ cat <<EOF > .gitignore
> *.class
> 
> # Package Files #
> *.jar
> *.war
> *.ear
> EOF
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .gitignore
#       README.md
nothing added to commit but untracked files present (use "git add" to track)
$ git status -s
?? .gitignore
?? README.md
$

Die neuen Dateien in den Staging Bereich hinzufügen.

$ git add --all
$ 
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   .gitignore
#       new file:   README.md
#
$ 
$ git status -s
A  .gitignore
A  README.md
$

Die Dateien sind nun in der lokalen Staging Area gekennzeichnet.

git commit

Die oben geänderten Dateien ins Repository überführen.

 
$ git commit -m "Erstellung"
[master (root-commit) 7b69e85] Erstellung
 2 file changed, 2 insertion(+)
 create mode 100644 .gitignore
 create mode 100644 README.md
$ 
$ git status
# On branch master
nothing to commit (working directory clean)
$ git status -s
$

Die Dateien sind nun im Local Repository gespeichert.

git diff / git log

Die Datei README.md ändern, die Unterschiede darstellen und ins Repository stellen.

 
$ cat <<EOF >> README.md
> 
> Ein Repository um einiges zu probieren, testen, etc.
> - [Frank Rahn](https://www.frank-rahn.de "Homepage von Frank Rahn")
> EOF
$ 
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   README.md
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git status -s
 M README.md
$ 
$ git diff README.md
diff --git a/README.md b/README.md
index 7493f96..c4a8783 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,5 @@
 Test Repository
 ===============
+
+Ein Repository um einiges zu probieren, testen, etc.
+- [Frank Rahn](https://www.frank-rahn.de "Homepage von Frank Rahn")
$
$ git add README.md
$ git status 
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   README.md
#
$ git status -s
M  README.md
$ 
$ git commit -m "Erste Erweiterungen"
[master 205e659] Erste Erweiterungen
 1 file changed, 3 insertion(+)
$ 
$ git status
# On branch master
nothing to commit (working directory clean)
$ git status -s
$ 
$ git log
commit 205e659fb0edb001c191bc7417c61b02b83c9375
Author: Frank W. Rahn <...@frank-rahn.de>
Date:   Sat Aug 18 16:12:22 2012 +0200

    Erste Erweiterungen

commit 7b69e85046057eac684292957f0c2e283b7aa483
Author: Frank W. Rahn <...@frank-rahn.de>
Date:   Sat Aug 18 16:01:28 2012 +0200

    Erstellung
$

Diesmal werden die Änderungen, ohne den Befehl git add, ins lokale Repository übernommen. Statt dessen wurde die abkürzende Option git commit -a für git add --all und git commit verwendet.

Das Einrichten eines Repository bei GitHub

In den folgenden Beispielen wird ein lokales Repository mit einem öffentlichem Repository bei GitHub verbunden und die lokalen Änderungen hochgeladen.

Dazu muss bei GitHub ein Konto eingerichtet und ein öffentliches Repository angelegt werden.

Siehe dazu die folgenden Anleitungen bei GitHub:

  1. Ein freies Konto bei GitHub einrichten
  2. Einen SSH Key für GitHub erzeugen
  3. Ein öffentliches Repository bei GitHub erzeugen
    Der Name des Repositories ist git_test, eine Beschreibung angeben und die Initialisierung nicht auswählen.
    Ein neues Repository auf GitHub erzeugen

    Ein neues Repository auf GitHub erzeugen (© Frank Rahn)

git remote / git push

In diesem Beispiel wird ssh als Authentifizierungsmechanismus und Kommunikationsprotokoll verwendet.

Das lokale Repository wird mit einem entfernten Repository verbunden und die Änderungen hochgeladen.

$ git remote add origin git@github.com:frank-rahn/git_test.git
$ git push -u origin master
Enter passphrase for key '/home/frank/.ssh/id_rsa': 
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 693 bytes, done.
Total 7 (delta 0), reused 0 (delta 0)
To git@github.com:frank-rahn/git_test.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
$

Diesmal wird https als Authentifizierungsmechanismus und Kommunikationsprotokoll verwendet.

Das lokale Repository mit einem entfernten Repository verbinden und die Änderungen hochladen.

$ git remote add origin https://frank-rahn@github.com/frank-rahn/git_test.git
$ git push -u origin master
Password for 'https://frank-rahn@github.com': 
To https://frank-rahn@github.com/frank-rahn/git_test.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
$

Das Ergebnis kann auf GitHub mit dem Browser begutachtet werden.

Das aktualisierte Repository bei GitHub

Das aktualisierte Repository bei GitHub (© Frank Rahn)

git clone

Das Holen eines öffentlichen Repositories und das Erstellen einer lokalen Arbeitskopie.

$ git clone git@github.com:frank-rahn/git_test.git
Cloning into 'git_test'...
Enter passphrase for key '/home/frank/.ssh/id_rsa': 
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 7 (delta 0), reused 7 (delta 0)
Receiving objects: 100% (7/7), done.
$ 
$ cd git_test
$ git status
# On branch master
nothing to commit (working directory clean)
$
$ git clone https://frank-rahn@github.com/frank-rahn/git_test.git
Cloning into 'git_test'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 7 (delta 0), reused 7 (delta 0)
Unpacking objects: 100% (7/7), done.
$ 
$ cd git_test
$ git status
# On branch master
nothing to commit (working directory clean)
$

git tag / git show

Die letzten Änderungen zu einer Version zusammenfassen.

 
$ vi README.md
$ git add README.md
$ git commit -m Korrektur
[master 4977b6e] Korrektur
 1 file changed, 1 insertion(+), 1 deletion(-)
$ 
$ git tag v1.0.0 -m "Version 1.0.0 erstellt"
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
$ 
$ git show v1.0.0
commit 4977b6ee26ac2c001af8699d3d45437fe9030721
Author: Frank W. Rahn <...@frank-rahn.de>
Date:   Sun Aug 19 21:45:34 2012 +0200
 
    Korrektur
 
diff --git a/README.md b/README.md
index c4a8783..8a8302f 100644
--- a/README.md
+++ b/README.md
@@ -2,4 +2,4 @@ Test Repository
 ===============
 
 Ein Repository um einiges zu probieren, testen, etc.
-- [Frank Rahn](https://www.frank-rahn.de "Homepage von Frank Rahn")
+ - [Frank Rahn](https://www.frank-rahn.de "Homepage von Frank Rahn")
$ 
$ git push
Password for 'https://frank-rahn@github.com': 
To https://frank-rahn@github.com/frank-rahn/git_test.git
   205e659..4977b6e  master -> master
$ 
$ git push --tags
Password for 'https://frank-rahn@github.com': 
To https://frank-rahn@github.com/frank-rahn/git_test.git
 * [new tag]         v1.0.0 -> v1.0.0
$

Damit die Versionen (tags) auch ins öffentliche Repository übertragen werden, dann muss zusätzlich der Befehl git push --tags verwendet werden. Mit dem Befehl git tag -d <tagname> können Tags wieder gelöscht und mit dem Befehl git tag -l alle Tags angezeigt werden.

git blame

Mit diesem Befehl kann herausgefunden werden, wer was an einer Datei geändert hat.

$ git blame README.md
^7b69e85 (Frank W. Rahn 2012-08-18 16:01:28 +0200 1) Test Repository
^7b69e85 (Frank W. Rahn 2012-08-18 16:01:28 +0200 2) ===============
205e659f (Frank W. Rahn 2012-08-18 16:12:22 +0200 3) 
205e659f (Frank W. Rahn 2012-08-18 16:12:22 +0200 4) Ein Repository um einiges zu probieren, testen, etc.
4977b6ee (Frank W. Rahn 2012-08-19 21:45:34 +0200 5)  - [Frank Rahn](https://www.frank-rahn.de "Homepage von Frank Rahn")
$

git rm

Das Löschen von Dateien im Repository.

$ echo "Test" > test
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test
nothing added to commit but untracked files present (use "git add" to track)
$ git add test
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   test
#
$ git rm test
error: 'test' has changes staged in the index
(use --cached to keep the file, or -f to force removal)
$ ls -l
insgesamt 8
-rw-rw-r-- 1 frank frank 154 Aug 19 22:00 README.md
-rw-rw-r-- 1 frank frank   5 Sep 15 15:45 test
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   test
#
$ 
$ git rm --cached test
rm 'test'
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test
nothing added to commit but untracked files present (use "git add" to track)
$ 
$ git rm test
fatal: pathspec 'test' did not match any files
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       test
nothing added to commit but untracked files present (use "git add" to track)
$ ls -l
insgesamt 8
-rw-rw-r-- 1 frank frank 154 Aug 19 22:00 README.md
-rw-rw-r-- 1 frank frank   5 Sep 15 15:45 test
$
 
$ git add test
$ git commit -m "Eine Datei hinzufügen"
[master e423724] Eine Datei hinzufügen
 1 file changed, 1 insertion(+)
 create mode 100644 test 
$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 
$
 
$ git rm test
rm 'test'
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    test
#
$ ls -l
insgesamt 4
-rw-rw-r-- 1 frank frank 154 Aug 19 22:00 README.md
$ 
$ git commit -m "Die Datei doch wieder löschen"
[master 834c378] Die Datei doch wieder löschen
 1 file changed, 1 deletion(-)
 delete mode 100644 test
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)
$

Falls die Datei test nach dem git rm test doch wieder hergestellt werden soll, muss der Befehl git checkout HEAD -- test verwendet werden.

git mv

Eine Datei verschieben bzw. umbenennen.

 
$ cat <<EOF > copyright.md
> Test Repository
> ===============
> 
> Copyright (C) 2012 Frank W. Rahn.
> EOF
$ git add copyright.md
$ git commit -m "Copyright hinzugefüht"
[master 5de0383] Copyright hinzugefüht
 1 file changed, 4 insertions(+)
 create mode 100644 copyright.md
$ git push
Enter passphrase for key '/home/frank/.ssh/id_rsa': 
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 384 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:frank-rahn/git_test.git
   834c378..5de0383  master -> master
$
$ git mv copyright.md COPYRIGHT.md
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    copyright.md -> COPYRIGHT.md
#
$ ls -l
insgesamt 8
-rw-rw-r-- 1 frank frank  67 Sep 15 16:49 COPYRIGHT.md
-rw-rw-r-- 1 frank frank 154 Aug 19 22:00 README.md
$
 
 
$ git commit -m "Datei umbenannt"
[master 8f30b7c] Datei umbenannt
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename copyright.md => COPYRIGHT.md (100%)
$ vi COPYRIGHT.md 
$ git add COPYRIGHT.md
$ git commit -m "Copyzeichen richtig gesetzt"
[master f89b24b] Copyzeichen richtig gesetzt
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git push
Enter passphrase for key '/home/frank/.ssh/id_rsa': 
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 661 bytes, done.
Total 5 (delta 0), reused 0 (delta 0)
To git@github.com:frank-rahn/git_test.git
   5de0383..f89b24b  master -> master
$
$ git log COPYRIGHT.md
commit f89b24b5cd8b39d9671a8eebdef10b3aebb752e8
Author: Frank W. Rahn <...@frank-rahn.de>
Date:   Sat Sep 15 17:09:56 2012 +0200

    Copyzeichen richtig gesetzt

commit 8f30b7cab9240af34ae113c50f21044ebf4e293a
Author: Frank W. Rahn <...@frank-rahn.de>
Date:   Sat Sep 15 17:02:02 2012 +0200

    Datei umbenannt
$
$ git log --follow COPYRIGHT.md
commit f89b24b5cd8b39d9671a8eebdef10b3aebb752e8
Author: Frank W. Rahn <...@frank-rahn.de>
Date:   Sat Sep 15 17:09:56 2012 +0200

    Copyzeichen richtig gesetzt

commit 8f30b7cab9240af34ae113c50f21044ebf4e293a
Author: Frank W. Rahn <...@frank-rahn.de>
Date:   Sat Sep 15 17:02:02 2012 +0200

    Datei umbenannt

commit 5de03832c99aca74a36aeb2e74efb2a9e17e741f
Author: Frank W. Rahn <...@frank-rahn.de>
Date:   Sat Sep 15 16:50:19 2012 +0200

    Copyright hinzugefüht
$

git branch / git checkout / git merge / git log

$ git branch 
* master
$ 
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$

Der Branch auf dem wir uns aktuell befinden, ist mit einem * markiert. Das ist zur Zeit der Branch master. Mit der Option -a werden auch die entfernten Branchen angezeigt.

$ git branch 
* master
$ git branch temp-branch
$ git branch 
* master
  temp-branch
$ git branch -d temp-branch
Deleted branch temp-branch (was ea3cfb9).
$ git branch 
* master
$
 
$ git branch features-1
$ git branch 
  features-1
* master
$ 
$ git checkout features-1 
Switched to branch 'features-1'
$ git branch 
* features-1
  master
$ 
$ echo "Features 1" > features-1.txt
$ git add features-1.txt
$ git commit -m "Implementierung Features 1"
[features-1 f4c4480] Implementierung Features 1
 1 file changed, 1 insertion(+)
 create mode 100644 features-1.txt
$ git status 
# On branch features-1
nothing to commit (working directory clean)
$ git push origin features-1 
Enter passphrase for key '/home/frank/.ssh/id_rsa': 
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 299 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@github.com:frank-rahn/git_test.git
 * [new branch]      features-1 -> features-1
$
 
$ vi features-1.txt 
$ git commit -a -m "Kleinere Änderung"
[features-1 71032f2] Kleinere Änderung
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git status
# On branch features-1
nothing to commit (working directory clean)
$
$ git push
Enter passphrase for key '/home/frank/.ssh/id_rsa': 
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 277 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@github.com:frank-rahn/git_test.git
   f4c4480..71032f2  features-1 -> features-1
$
 
$ vi features-1.txt 
$ git commit -a -m "Weitere Änderung"
[features-1 4dcb955] Weitere Änderung
 1 file changed, 1 insertion(+)
$
$ git checkout master
Switched to branch 'master'
$ echo "Master" > master.txt
$ 
$ git merge features-1 
Updating ea3cfb9..4dcb955
Fast-forward
 features-1.txt |    2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 features-1.txt
$ 
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 3 commits.
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       master.txt
nothing added to commit but untracked files present (use "git add" to track)
$ ls -l
insgesamt 16
-rw-rw-r-- 1 frank frank  70 Sep 15 17:08 COPYRIGHT.md
-rw-rw-r-- 1 frank frank  13 Sep 15 19:43 features-1.txt
-rw-rw-r-- 1 frank frank   7 Sep 15 19:42 master.txt
-rw-rw-r-- 1 frank frank 960 Sep 15 18:33 README.md
$

Die Änderung aus dem Branch features-1 ist in den Branch master commited worden. Die neue Datei master.txt ist nur im Arbeitbereich vorhanden. Grundsätzlich sollte die Option --no-ff beim Merge verwendet werden. Diese Option erzwingt ein neues Commit-Objekt, auch wenn der Merge im fast-forward Modus durchgeführt wird. Damit können die Änderungen weiterhin auf den Feature-Branch sehen werden, im anderen Fall würden die Commits auf den Ziel-Branch verschoben.

Diese Option kann auch mit git config --global merge.ff "false" permanent eingestellt werden.

 
$ git add master.txt
$ git commit -m "Letzte Änderung übernehmen"
[master 03cd179] Letzte Änderung übernehmen
 1 file changed, 1 insertion(+)
 create mode 100644 master.txt
$
$ git branch -a
  features-1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/features-1
  remotes/origin/master
$
$ git push
Enter passphrase for key '/home/frank/.ssh/id_rsa': 
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 523 bytes, done.
Total 6 (delta 2), reused 0 (delta 0)
To git@github.com:frank-rahn/git_test.git
   71032f2..4dcb955  features-1 -> features-1
   ea3cfb9..03cd179  master -> master
$

Ein größeres Beispiel zum parallelen Arbeiten mit Entwicklungzweigen ist im Beitrag Großes Beispiel mit Git und GitHub zu finden.

$ git log --pretty=oneline --graph
*   ae20eafeb68aa87ad8c25a49b4b6eca8d30902e4 Merge branch 'features-3'
|  
| * c9e737624aa4805b4a7a565683082f83f894aac1 Änderung auf dem Branch features-3
* |   050023bd4de7f1ae09cc56eb4f29bda20a511503 Merge branch 'features-2'
|   
| * | 9b8df6e434fb06ddae6feda4ba6e0ec4da3bceb2 Änderung auf dem Branch features-2 (2)
| |/  
| * 9566b8c1664d46cf1a44d7230e691f99771ccda2 Änderung auf dem Branch features-2
* |   4abfd7107531d82c7a4ded8960879175a579a728 Merge branch 'features-1'
|   
| * | 1475192079aba54f7d72fba38c58183d3265fc54 Änderung auf dem Branch features-1
* | | 8596f32a8b917df217c9f4ea07d0a7fccbe68512 Änderung auf dem Branch master (2)
* | | a9ee53815d71b69e9676981b75cf1be05900c439 Änderung auf dem Branch master
| |/  
|/|   
* | 7ec87e3b7577cb0432804109c80239aa7f421b4d Multibranch Test Vorbereitung
* | 03cd1798363337086d7109b8533d2802fa4e93ca Letzte Änderung übernehmen
|/  
* 4dcb955b2a95f32e31e6181b6359ee3f269b61eb Weitere Änderung
* 71032f2bb043d28d0d5d922b1fc750c207099980 Kleinere Änderung
* f4c448093477c211bf3a25b39b4e433c527c686a Implementierung Features 1
* ea3cfb90b1aa03e108b7724220647174a7522388 Doppelte Einrückung erstellt
* 7607fcfc7591cc2b7553e77eb0def0f20965643b Markdown erweitert
* f89b24b5cd8b39d9671a8eebdef10b3aebb752e8 Copyzeichen richtig gesetzt
* 8f30b7cab9240af34ae113c50f21044ebf4e293a Datei umbenannt
* 5de03832c99aca74a36aeb2e74efb2a9e17e741f Copyright hinzugefüht
* 834c378eb1cd14e97baf6b02a48b56961bcb8f70 Die Datei doch wieder löschen
* e4237249b3a5a72e28567cb633659aca0105ad84 Eine Datei hinzufügen
* 4977b6ee26ac2c001af8699d3d45437fe9030721 Korrektur
* 205e659fb0edb001c191bc7417c61b02b83c9375 Erste Erweiterungen
* 7b69e85046057eac684292957f0c2e283b7aa483 Erstellung
$

Die Option --pretty=oneline komprimiert die Daten eines Commits auf eine Zeile und die Option --graph zeigt die graphische Darstellung der Commits im Repository.

Spezielle Anwendungsfälle

 
$ vi master.txt 
$ git add master.txt
$ git commit -m "Blancs eingefügt"
[master 1c3b98c] Blancs eingefügt
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git commit --amend
[master 4625d02] Blancs eingefügt
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git commit --amend -m "Blanks eingefügt"
[master 1bdeb5e] Blanks eingefügt
 1 file changed, 1 insertion(+), 1 deletion(-)
$ vi README.md 
$ git add README.md
$ git commit --amend -a
[master 0fe6d8b] Blanks eingefügt und neue Zeile hinzugefüght
 2 files changed, 2 insertions(+), 1 deletion(-)
$ git commit --amend -m "Blanks eingefügt und neue Zeile hinzugefügt"
[master 45cca03] Blanks eingefügt und neue Zeile hinzugefügt
 2 files changed, 2 insertions(+), 1 deletion(-)
$ git push
Enter passphrase for key '/home/frank/.ssh/id_rsa': 
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 398 bytes, done.
Total 4 (delta 3), reused 0 (delta 0)
To git@github.com:frank-rahn/git_test.git
   ae20eaf..45cca03  master -> master
$
$ git reset HEAD <Datei>
$
$ git reset HEAD <Datei>
$
$ git checkout <Datei>
$
$ git pull
$

Der Befehl git pull ist eine Zusammenfassung der Befehle git fetch und git merge. Eine Variante ist git pull --rebase als Kurzform von git fetch und git rebase.

Einen Branch aus einem entfernten Repository auschecken und mit der Option --track oder -t als einen Upstream konfiguriert, damit git pull den Branch auch im entfernten Repository synchronisieren kann.

$ git checkout -t <remote>/<tracked branch>
$

Mit dem folgendem Befehl git cherry-pick können Code-Änderungen aus genau einem Commit in den aktuellen Branch übernommen werden. Dieses wird verwendet, wenn eine Änderung zwischen Branches ausgetauscht wird, die nicht zusammengeführt (git merge) werden (z. B. Rückportierung einer Änderung in einen älteren Branch). Wird dieser Befehl zwischen Branches angewendet, die später zusammengeführt werden, so entsteht ein Konflikt.

$ git cherry-pick 45cca03
$

Literaturempfehlung

Frank Rahn
Letzte Artikel von Frank Rahn (Alle anzeigen)
1 Kommentar

Trackbacks & Pingbacks

  1. […] empfehle den Beitrag Git mit GitHub, dort werden die Begriffe und Grundlagen von Git […]

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

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

Ihre E-Mail-Adresse wird nicht veröffentlicht. Ihr Kommentar wird verschlüsselt an meinen Server gesendet. Erforderliche Felder sind mit * markiert.

Weitere Informationen und Widerrufshinweise finden Sie in meiner Datenschutzerklärung.