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
Nächste ÜberarbeitungBeide Seiten der Revision
git [2014/03/11 11:32] – list all aliases olligit [2021/01/06 15:01] – [Branch in eigenes Repository] 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.
 ===== 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 143: Zeile 252:
         ack = grep --break --heading --line-number #git grep with output like ack         ack = grep --break --heading --line-number #git grep with output like ack
         # 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 in the index while preserving a dirty tree, if 
 + # any. 
 +
 + # Assuming your index is empty, some useful variations are: 
 +
 + # - fix whitespace in all changes in all versioned files: 
 +
 + # git add -u :/ && git fixws && git reset 
 +
 + # - fix whitespace in all unversioned files and in all changes in 
 + # all versioned files: 
 +
 + # git add --all :/ && git fixws && git reset 
 +
 + # Logic: 
 +
 + # The 'git stash save' fails if the tree is clean (instead of 
 + # creating an empty stash :P). So, we only 'stash' and 'pop' if 
 + # the tree is dirty. 
 +
 + # The 'git rebase --whitespace=fix HEAD~' throws away the commit 
 + # if it's empty, and adding '--keep-empty' prevents the whitespace 
 + # from being fixed. So, we first check that the index is dirty. 
 +
 + # Also: 
 + # - '(! git diff-index --quiet --cached HEAD)' is true (zero) if 
 + # the index is dirty 
 + # - '(! git diff-files --quiet .)' is true if the tree is dirty 
 +
 + # The 'rebase --whitespace=fix' trick is from here: 
 + # http://stackoverflow.com/a/19156679/470844 
 + fixws = !"\ 
 + if (! git diff-files --quiet .) && \ 
 + (! git diff-index --quiet --cached HEAD) ; then \ 
 + git commit -m FIXWS_SAVE_INDEX && \ 
 + git stash save FIXWS_SAVE_TREE && \ 
 + git rebase --whitespace=fix HEAD~ && \ 
 + git reset --soft HEAD~ && \ 
 + git stash pop ; \ 
 + elif (! git diff-index --quiet --cached HEAD) ; then \ 
 + git commit -m FIXWS_SAVE_INDEX && \ 
 + git rebase --whitespace=fix HEAD~ && \ 
 + git reset --soft HEAD~ ; \ 
 + 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 155: Zeile 313:
 ===== 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