Benutzer-Werkzeuge

Webseiten-Werkzeuge


git

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Letzte ÜberarbeitungBeide Seiten der Revision
git [2014/03/11 11:41] – fixws alias olligit [2022/07/14 20:07] – [Leere Verzeichnisse commiten] olli
Zeile 91: Zeile 91:
 benutzen. Diese Datei ist dann automatisch im Staging-Bereich. benutzen. Diese Datei ist dann automatisch im Staging-Bereich.
  
 +===== Inhalt des Stash anzeigen =====
 +Um den Inhalt des Stash anzuzeigen, kann der Befehl
 +<code bash>
 +git stash show -p
 +</code>
 +verwendet werden.
 +Ältere Stashes können mit 
 +<code bash>
 +git stash show -p stash@{1}
 +</code>
 +angezeigt werden.
 ===== Grafisches git blame ===== ===== Grafisches git blame =====
 Mit Mit
Zeile 130: Zeile 141:
 <code> <code>
 *       text=auto *       text=auto
-</code>  +</code> 
 + 
 +===== Wortbasierter Diff ===== 
 +Mit  
 +<code bash> 
 +git diff --word-diff  
 +</code> 
 +lässt sich ein wortbasierter Diff durchführen. Für viele Sprachen enthält Git angepasste Parser. Um diese auszuwählen muss in .gitattributes für die Dateieindung die entsprechene Sprache ausgewählt werden, z.B.:    
 +<code> 
 +*.m diff=matlab 
 +</code> 
 +Dabei dürfen keine Leerzeichen zwischen diff, dem Gleichheitszeichen und der Sprache stehen. 
 +Eine Liste der unterstützten Sprachen findet sich im [[https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html|Abschnitt "Defining a custom hunk-header"]]. 
 + 
 +===== Editor für Commit-Message setzen ===== 
 +Der Editor, den Git zum Bearbeiten der Commit-Messages aufruft, kann auf mehrere Arten konfiguriert werden. Mit der Konfigurationsvariablen core.editor 
 +<code bash> 
 +git config --global core.editor "nano" 
 +</code> 
 +oder den Umgebungsvariablen GIT_EDITOR, VISUAL, EDITOR 
 +<code bash> 
 +export GIT_EDITOR=nano 
 +export VISUAL=nano 
 +export EDITOR=nano 
 +</code> 
 +Die Reihenfolge der Auswertung ist GIT_EDITOR, core.editor, VISUAL, EDITOR. 
 + 
 +===== Mehrere Remotes ===== 
 +git kann mehrere remotes verwalten. Das ist für das Pushen auf mehrere Server praktisch. 
 + 
 +Remote hinzufügen: 
 +<code bash> 
 +git remote add <name> <url> 
 +</code> 
 +Pushen: 
 +<code bash> 
 +git push <name> 
 +</code> 
 + 
 +===== Dateien, die nicht im Repo sind, entfernen  ===== 
 +Dateien, die nicht im Repository sind (untracked), können mit ''git clean'' entfernt werden. Mit  
 +<code bash> 
 +git clean -n 
 +</code> 
 +wird ein Trockenlauf durchgeführt. Mit dem Parameter ''-f'' statt ''-n'' wird dann tatsächlich gelöscht. Um ungetrackte Verzeichnisse zu entfernen, muss das Argument ''-d'' hinzugefügt werden. 
 + 
 +===== Alle Commits eines Autors anzeigen ===== 
 +Um alle Commits eines bestimmten Autors aufzulisten, kann man folgenden Befehl verwendet: 
 +<code bash> 
 +git log --author="name" 
 +</code> 
 +Der Name muss nicht vollständig angegeben werden. 
 +Um nicht nur den aktuellen Branch, sondern alle zu durchsuchen, kann der Parameter ''%%--%%all'' hinzugefügt werden.   
 + 
 +===== Prüfen, ob Branch einen Commit enthält ===== 
 +Um zu prüfen, ob ein Branch einen gegebenen Commit enthält kann man den folgenden Befehl verwenden: 
 +<code bash> 
 +git branch -a --contains <commitish> 
 +</code> 
 + 
 +<WRAP important round> 
 +Commits, die über einen Rebase oder Cherry-Pick ins Repo gekommen sind, werden so nicht gefunden.   
 +</WRAP> 
 + 
 +===== Autor nachträglich ändern ===== 
 +Um den Autor oder die Emailadresse nachträglich zu korrigieren, müssen folgendene Schritte durchgeführt werden: 
 +   * [[https://gist.github.com/octocat/0831f3fbd83ac4d46451|Skript]] herunterladen und ausführbar machen 
 +   * Emailadressen im Skript anpassen 
 +   * Skript ausführen 
 +   * Änderungen pushen 
 + 
 +<WRAP important round> 
 +Diese Operation schreibt die History neu. 
 +Wenn die Commits schon öffentlich sind, sollte man dies nur in Ausnahmefällen tun. 
 +</WRAP> 
 + 
 +===== Sparse Checkout ===== 
 +Um nur Teile (z.B. ein Unterzeichnis) eines Repositories auszuchecken, kann ein sog. Sparse Checkout gemacht werden: 
 +  * https://unix.stackexchange.com/a/468182 
 +  * https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ 
 + 
 +===== Branch in eigenes Repository ===== 
 +Um einen Branch ''branch-to-move'' in ein eigenes Repository zu kopieren kann folgendes verwendet werden: 
 +<code bash> 
 +git push url://to/new/repository.git branch-to-move:new-branch-name 
 +</code> 
 +''new-branch-name'' ist der Name, den der Branch im neuen Repository gekommen soll. 
 +''url%%://%%to/new/repository.git'' ist der Pfad zum git-Repository, dies kann auch ein lokaler Pfad sein. 
 + 
 +===== Leere Verzeichnisse commiten ===== 
 +Leere Verzeichnisse lassen sich nicht einchecken, der [[https://stackoverflow.com/questions/115983/how-can-i-add-an-empty-directory-to-a-git-repository/932982#932982|hier]] empfohlenen Workaround ist eine ''.gitignore''-Datei in dem Verzeichnis mit folgendem Inhalt: 
 +<code> 
 +# Ignore everything in this directory 
 +
 +# Except this file 
 +!.gitignore 
 +</code> 
 +Andere Möglichkeit sind leere Dateien wie ''.keep'' oder ''.gitkeep'' in dem Verzeichnis. 
 +Eine Diskussion dazu findet sich auch in obigem Link. 
 + 
 +===== git pull  oder fetch hängt ===== 
 +Wenn ''git pull'' oder ''fetch'' hängt, kann man ''git'' mit 
 +<code bash> 
 +GIT_TRACE=true git pull 
 +</code> 
 +ein Trace einschalten. 
 +Auch die Verwendung des von Github deaktivierten, unverschlüsselten [[https://github.blog/changelog/2022-03-15-removed-unencrypted-git-protocol-and-certain-ssh-keys/| ''git://''-Protokolls]] ruft dieses Verhalten hervor (dies lässt sich im o.g. Trace allerdings nicht erkennen). 
 + 
 ===== Nützliche Aliases ===== ===== Nützliche Aliases =====
 Diese Aliases können in die ~/.gitconfig eingetragen werden: Diese Aliases können in die ~/.gitconfig eingetragen werden:
-<code>+<code bash>
 [alias] [alias]
  st = status  st = status
Zeile 144: Zeile 263:
         # List all aliases.         # List all aliases.
         aliases = config --get-regexp alias         aliases = config --get-regexp alias
-        # Fix whitespace from here: http://code.google.com/p/nathan-collins--conf/source/browse/dot.gitconfig+        # Fix whitespace from here:  
 +        # http://code.google.com/p/nathan-collins--conf/source/browse/dot.gitconfig
  # Fix whitespace in the index while preserving a dirty tree, if  # Fix whitespace in the index while preserving a dirty tree, if
  # any.  # any.
Zeile 188: Zeile 308:
  git rebase --whitespace=fix HEAD~ && \  git rebase --whitespace=fix HEAD~ && \
  git reset --soft HEAD~ ; \  git reset --soft HEAD~ ; \
- fi"  + fi"  
 +        #resets binary permission to the ones in the repo 
 +        # from https://gist.github.com/jtdp/5443498 
 +        permission-resetb = "!git diff -p --no-ext-diff --no-color --diff-filter=d | grep -E \"^(diff|old mode|new mode)\" | sed -e \"s/^old/NEW/;s/^new/old/;s/^NEW/new/\" | git apply"
 </code> </code>
  
-git sed ersetzt in allen Dateien im Repository old-name durch new-name (siehe Bespiel). Dies ist sicherer als die entsprechende Lösung mit "find .", da dabei Verwaltungsdateien von Git mit verändert werden können.+''git sed'' ersetzt in allen Dateien im Repository old-name durch new-name (siehe Bespiel). Dies ist sicherer als die entsprechende Lösung mit "find .", da dabei Verwaltungsdateien von Git mit verändert werden können.
  
 Beispiel: Beispiel:
Zeile 200: Zeile 323:
 ===== Links ===== ===== Links =====
   * [[http://git-scm.com/|Git Homepage]]   * [[http://git-scm.com/|Git Homepage]]
-  * [[https://www.atlassian.com/de/git/tutorial|Git Tutorials]]+  * [[https://www.atlassian.com/git/tutorials|Git Tutorials]] 
 +  * [[https://chrisjean.com/git-submodules-adding-using-removing-and-updating/|Git Submodule Tutorial]]
  
  
  
git.txt · Zuletzt geändert: 2023/02/19 20:34 von olli