versionsverwaltung:git

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
versionsverwaltung:git [2021/03/17 10:45] – alte Version wiederhergestellt (2021/03/07 23:20) stversionsverwaltung:git [2025/03/30 22:15] (aktuell) – [Änderungen zurücknehmen] st
Zeile 168: Zeile 168:
  
   * lokale Änderungen zurücknehmen (wie svn revert): <code>git checkout PFAD_ODER_DATEI</code>   * lokale Änderungen zurücknehmen (wie svn revert): <code>git checkout PFAD_ODER_DATEI</code>
-  * Datei doch nicht committen: <code>git reset HEAD PFAD_ODER_DATEI</code> +  * Datei doch nicht committen: <code>git reset HEAD UNGEWOLLTER_PFAD_ODER_DATEI</code>Datei soll behalten werden aber aus dem commit gennommen werden (getestet):<code bash>git reset --soft HEAD~1 
-  * letzte commit message ändern (öffnet Editor zur Änderung): +git restore --staged UNGEWOLLTER_PFAD_ODER_DATEI 
-    * <code>git commit --amend</code>Falls der commit bereits an entfernte Repositories gesendet wurde ist die [[https://help.github.com/en/articles/changing-a-commit-message|Reparatur mit rebase und force push möglich]] (hat aber gravierende Auswirkungen auf Dritte) +# man kann sogar den gleichen commit wieder benutzen: 
-    * Author / E-Mail beim letzten commit ändern: git commit --amend --author="John Doe <john@doe.org>"+git commit -c ORIG_HEAD 
 +</code> [[https://stackoverflow.com/questions/12481639/remove-file-from-latest-commit|andere Wege]] 
 +  * letzte commit message ändern (öffnet Editor zur Änderung): <code>git commit --amend</code> 
 +    * Falls der commit bereits an entfernte Repositories gesendet wurde ist die [[https://help.github.com/en/articles/changing-a-commit-message|Reparatur mit rebase und force push möglich]] (hat aber gravierende Auswirkungen auf Dritte) 
 +    * Author / E-Mail beim letzten commit ändern: <code bash>git commit --amend --author="John Doe <john@doe.org>"</code> 
 +    * nachträglich letzten commit signen: <code bash>git commit -S --amend</code> ansonsten [[https://superuser.com/questions/397149/can-you-gpg-sign-old-commits|nur mit rebase]] 
 +    * mehrere lokale commits mit der falschen user.email sind mit diesem Skript änderbar (leider nicht mit rebase), erfordert aber wieder force push falls bereits übertragen: <code bash>git filter-branch --env-filter ' 
 +OLD_EMAIL="OLD@example.com" 
 +NEW_NAME="NEW NAME" 
 +NEW_EMAIL="NEW@example.com" 
 +if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL"
 +then 
 +  export GIT_COMMITTER_NAME="$NEW_NAME" 
 +  export GIT_COMMITTER_EMAIL="$NEW_EMAIL" 
 +fi 
 +if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL"
 +then 
 +  export GIT_AUTHOR_NAME="$NEW_NAME" 
 +  export GIT_AUTHOR_EMAIL="$NEW_EMAIL" 
 +fi 
 +' --tag-name-filter cat -- --branches --tags</code> weitere Informationen bei der Quelle: https://mhagemann.medium.com/how-to-change-the-user-for-all-your-git-commits-ffefbacf2652
   * Modifizierungen endgültig verwerfen((alternativ: temporäres Wegräumen geänderter Dateien mit git stash)): <code>git checkout -- PFAD_ODER_DATEI</code>   * Modifizierungen endgültig verwerfen((alternativ: temporäres Wegräumen geänderter Dateien mit git stash)): <code>git checkout -- PFAD_ODER_DATEI</code>
   * rebase: grundlegende Änderungen vornehmen (potentiell desktruktiv, es sollten keine gepushten Commits verändert werden!):   * rebase: grundlegende Änderungen vornehmen (potentiell desktruktiv, es sollten keine gepushten Commits verändert werden!):
Zeile 206: Zeile 226:
 Bei beiden Methoden wird die URL zurückgeliefert wo der PR erstellt werden kann. Bei beiden Methoden wird die URL zurückgeliefert wo der PR erstellt werden kann.
  
-==== Änderungen zwischen Tags anzeigen ====+==== PGP signing ==== 
 + 
 +**Keymanagement**: 
 +  * erstellen: <file>gpg --full-generate-key 
 +gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation, Inc. 
 +This is free software: you are free to change and redistribute it. 
 +There is NO WARRANTY, to the extent permitted by law. 
 + 
 +Please select what kind of key you want: 
 +   (1) RSA and RSA (default) 
 +   (2) DSA and Elgamal 
 +   (3) DSA (sign only) 
 +   (4) RSA (sign only) 
 +  (14) Existing key from card 
 +Your selection? 1 
 +RSA keys may be between 1024 and 4096 bits long. 
 +What keysize do you want? (2048) 4096 
 +Requested keysize is 4096 bits 
 +Please specify how long the key should be valid. 
 +         0 = key does not expire 
 +      <n>  = key expires in n days 
 +      <n>w = key expires in n weeks 
 +      <n>m = key expires in n months 
 +      <n>y = key expires in n years 
 +Key is valid for? (0) 
 +Key does not expire at all 
 +Is this correct? (y/N) y 
 + 
 +GnuPG needs to construct a user ID to identify your key. 
 + 
 +Real name: Stefan Schwarz 
 +Email address: stefan.schwarz@domain.tld 
 +Comment: 
 +You selected this USER-ID: 
 +    "Stefan Schwarz <stefan.schwarz@domain.tld>" 
 + 
 +Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
 +We need to generate a lot of random bytes. It is a good idea to perform 
 +some other action (type on the keyboard, move the mouse, utilize the 
 +disks) during the prime generation; this gives the random number 
 +generator a better chance to gain enough entropy. 
 +We need to generate a lot of random bytes. It is a good idea to perform 
 +some other action (type on the keyboard, move the mouse, utilize the 
 +disks) during the prime generation; this gives the random number 
 +generator a better chance to gain enough entropy. 
 +gpg: key 3DD879D552CC995F marked as ultimately trusted 
 +gpg: directory '/home/USER/.gnupg/openpgp-revocs.d' created 
 +gpg: revocation certificate stored as '/home/USER/.gnupg/openpgp-revocs.d/CFEF13CC5040450E63CC1BC43DD879D552CC995F.rev' 
 +public and secret key created and signed. 
 + 
 +pub   rsa4096 2025-02-03 [SC] 
 +      CFEF13CC5040450E63CC1BC43DD879D552CC995F 
 +uid                      Stefan Schwarz <stefan.schwarz@domain.tld> 
 +sub   rsa4096 2025-02-03 [E]</file> 
 +  * anzeigen: <code bash>gpg --list-secret-keys --keyid-format=long</code> <file> Ausgabe: 
 +gpg: checking the trustdb 
 +gpg: marginals needed: 3  completes needed: 1  trust model: pgp 
 +gpg: depth: 0  valid:    signed:    trust: 0-, 0q, 0n, 0m, 0f, 1u 
 +/home/USER/.gnupg/pubring.kbx 
 +------------------------------- 
 +sec   rsa4096/3DD879D552CC995F 2025-02-03 [SC] 
 +      CFEF13CC5040450E63CC1BC43DD879D552CC995F 
 +uid                 [ultimate] Stefan Schwarz <stefan.schwarz@domain.tld> 
 +ssb   rsa4096/57EC66B3C0D405F5 2025-02-03 [E]</file> 
 +  * testen: <code bash>echo "test" | gpg --clearsign</code> 
 +  * Pubkey anzeigen: <code bash>gpg --armor --export 3DD879D552CC995F # kurze ID</code> 
 +  * Backup des private keys: <code bash>gpg --export-secret-keys --armor CFEF13CC5040450E63CC1BC43DD879D552CC995F > ~/pgp-signing-3DD879D552CC995F.key # lange ID</code> 
 + 
 +  * pgp-signing in git aktivieren: 
 +    * <code bash>git config --global commit.gpgsign true</code> 
 +    * <code bash>git config --global user.signingkey 3DD879D552CC995F # KurzID</code> 
 +    * :!: Auf dem git-server muss noch im Benutzerprofil der pubkey hinterlegt werden. 
 + 
 +Quelle: https://endjin.com/blog/2022/12/how-to-sign-your-git-commits 
 +=== Fehlerbehandlung === 
 + 
 +<file>Fehler: "Inappropriate ioctl for device"</file> 
 +Lösung: <code bash>export GPG_TTY=$(tty)</code> 
 + 
 +-> permanent in z.B. .bashrc eintragen. 
 + 
 + 
 +==== Tags ==== 
 + 
 +[[https://git-scm.com/book/en/v2/Git-Basics-Tagging|Git Basics - Tagging]] 
 + 
 +<code bash>git tag -a 1.0 [-m "message like version 1.0"]</code> 
 + 
 +**Tags übertragen**: <code bash>git push --follow-tags</code>dauerhaft konfigurieren:<code bash>git config --global push.followTags true</code> ((''followTags = true'' in der [push]-Sektion von ~/.gitconfig)) 
 + 
 +bestimmten Tag übertragen:<code bash>git push origin <tag_name></code> ((push all tags at once (not recommended!):<code bash>git push --tags</code>)) 
 + 
 + 
 + 
 +=== Änderungen zwischen Tags anzeigen === 
  
 Hier zwischen $TAG (ersetzen!) und HEAD: Hier zwischen $TAG (ersetzen!) und HEAD:
Zeile 215: Zeile 330:
  
 -> auf branch master beschränken: <nowiki>--</nowiki>first-parent master (Einschränkung: funktioniert nicht für fast-forward-merges, siehe [[https://stackoverflow.com/a/15878581|git log to return only the commits made to the master branch?]]. -> auf branch master beschränken: <nowiki>--</nowiki>first-parent master (Einschränkung: funktioniert nicht für fast-forward-merges, siehe [[https://stackoverflow.com/a/15878581|git log to return only the commits made to the master branch?]].
 +
 +
 +==== Leere Verzeichnisse einchecken ====
 +
 +Leere Verzeichnisse werden standardmäßig nicht benutzt, ein verbreiteter work-around ist eine Datei .gitkeep in das Verzeichnis zu legen.
 +
 +<code bash>find . -type d -empty -not -path "./.git/*" -exec touch {}/.gitkeep \;</code>
 +
  
  
Zeile 305: Zeile 428:
       * zuerst zurück in master wechseln: <code>git checkout master</code>       * zuerst zurück in master wechseln: <code>git checkout master</code>
       * Änderung aus BRANCH_NAME in master mergen: <code>git pull . BRANCH_NAME</code>       * Änderung aus BRANCH_NAME in master mergen: <code>git pull . BRANCH_NAME</code>
-    * neuen Branch auch in entfernten Repos anlegen: <code>git push -u origin BRANCH_NAMEg</code>+    * neuen Branch auch in entfernten Repos anlegen: <code>git push -u origin BRANCH_NAME</code>
     * Branch **lokal löschen**: <code>git branch -d BRANCH_NAME</code> ((forcen wenn nicht alles committed wurde: <code>git branch -D BRANCH_NAME</code>))     * Branch **lokal löschen**: <code>git branch -d BRANCH_NAME</code> ((forcen wenn nicht alles committed wurde: <code>git branch -D BRANCH_NAME</code>))
     * Branch **auf Server löschen**: <code>git push REMOTE_NAME :SERVER_BRANCH_NAME</code>     * Branch **auf Server löschen**: <code>git push REMOTE_NAME :SERVER_BRANCH_NAME</code>