Git

From Wiki
Revision as of 11:26, 7 April 2021 by Marcluer (talk | contribs)
Quick Cheat Sheet
git config credential.helper store

git config user.email "email@example.com"
git config user.name "username"

git log --graph --oneline
git log --stat

Commands

Basics

Create repository

git init             # standard 
git init --bare      # bare (server) repo without working directory

Initial checkout of remote repository

git clone https://gerrit.wikimedia.org/r/p/mediawiki/core.git
git clone ssh://user@server/srv/git/git-repo.git

Get latest updates from server

git pull             # (= git fetch && git merge)

git fetch            # get updates from remote, safe operation
git merge            # merges those updates into working dir

Change files and commit

  • show changed files
git status                     # show changed files (working dir & staging area)
git diff                       # show changes in working dir
git diff --cached              # show changes in staging area
git diff --cached --name-only
git diff --name-status
  • add files
git add .
git add -A    # all
  • commit changes
git commit -m "Commit message"
git commit -a                      # includes add
git commit -am.
  • send changes to server
git push

.gitignore files

*.log
filename.txt
subfolder/*

Staging

       <------------------------ checkout ---------------------
Working Directory   -stage->   Staging Area   -commit->   Repository
git add .      # add all files to staging area
git status     # show staged & unstaged(untracked) files
git reset      # unstage all files

Branches

git branch                     # list local branches
git branch -a                  # list local & remote branches
git branch --merged            # list branches that have been merged

git branch <new-branch-name>   # create new branch (from the current commit)

hard reset to specific branch

git fetch --all
git reset --hard origin/branchname

switch to branch

git switch <new-branch-name>
git commit ... some-stuff
git switch master

merge feature branch into master

git checkout master
git merge <new-branch-name> (--no-ff)   # no fast forward: create merge commit
git diff
git commit -a

rebase branch onto latest master

# master has proceeded. Rebase pulls the "old" branch up to the latest master position
git checkout <branch>                   
git rebase master                       

delete branch

git branch -d <branch-name>            # local
git push origin --delete <branch-name> # remote

https://stackoverflow.com/questions/9069061/what-is-the-difference-between-git-merge-and-git-merge-no-ff

Repositories

move repo to new server

git remote -v                                            # show remote location
git remote set-url origin <URL to my NEW repo location>  # change remote url
git push -f origin                                       # push to remote url
git remote -v

sparse clone (only specific folder)

mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>
git config core.sparseCheckout true
echo "some/dir/" >> .git/info/sparse-checkout
git pull origin master

Forks

Syncing fork

git clone https://your-fork.git
git remote -v                         # should show your fork 
git remote add upstream https         # adding upstream repo
git remote -v                         # should show your fork as origin and upstream
git fetch upstream                    # get changes from upstream
git checkout master (or fork-branch)
git merge upstream/master
git add .
git commit -m "sync with upstream"
git push origin master

Undo mistakes

replace file with commited version

git checkout file.txt     # file gets replaced by repo version

fix commit message or files

git commit -m "Wrong message"
git commit --amend -m "Fixed message"    # only do this if you never pushed the wrong commit

move commit from master to branch

git log                               # get hash from commit you want to cherry pick
git checkout <branch>                
git cherry-pick <hash-of-commit>      # add commit to branch

git checkout master                   # if not pushed to remote, 
git log                               # get hash of previous commit
git reset --soft <hash>               # resets commit to previous hash, but will keep changes in staging area
git reset (--mixed) <hash>            # resets commit to previous hash, will keep changes only in working dir
git reset --hard <hash>               # resets commit to previous hash, will delete changes (untracked files will stay)
git clean -df                         # deletes untracked files from working dir 

undo commit after push

git log                               # get hash of bad commit
git revert <hash>                     # adds a revert-commit 

Configuration

Show config

git config --list

Store credentials

git config credential.helper store

Set username and email

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

Windows - remove old credentials

rundll32.exe keymgr.dll,KRShowKeyMgr

post-receive hook

  • execute script on main git server, after receiving push: hooks/post-receive
#!/bin/bash
# unset GIT_INDEX_FILE # not needed for post-receive?
git --work-tree=/srv/targetfolder --git-dir=/home/demo/proj/.git checkout -f
or
#!/bin/bash
while read oldrev newrev ref
do
    if [[ $ref =~ .*/master$ ]];
    then
        echo "Master ref received.  Deploying master branch to production..."
        git --work-tree=/var/www/html --git-dir=/home/demo/proj checkout -f
    else
        echo "Ref $ref successfully received.  Doing nothing: only the master branch may be deployed on this server."
    fi
done
  • make executable
chmod +x post-receive

Speed-up

# alias 'acp' = add+commit+push
git config --global alias.acp '!f() { git add . && git commit -m "$@" && git push; }; f'         
git acp "this is my commit comment"

Links

Other

Special features

  • auto-commit when file changes
inotifywait -q -m -e CLOSE_WRITE --format="git commit -a -m 'autocommit on change' %w" file.txt | sh
or
while true; do
  inotifywait -qq -e CLOSE_WRITE ~/.calendar/calendar
  cd ~/.calendar; git commit -a -m 'autocommit on change'
done
# inotify "-r"  for recursive
or