Git: Difference between revisions

From Wiki
Line 193: Line 193:
=== rebase branch onto latest master ===
=== rebase branch onto latest master ===
<pre class="bash">
<pre class="bash">
# master has proceeded. Rebase pulls the "old" branch up to the latest master position
git checkout master                        # go to master
git checkout <branch>                 
git pull                                  # check if new updates in origin
git rebase master                      
                                          # ...master has proceeded...
git checkout <branch>                      # go to <branch>
git rebase master                          # Rebase pulls the "old" branch up to the latest master position
                                          # now proceed with merge or rebase to get the code onto master
</pre>
</pre>



Revision as of 13:15, 7 April 2021

Quick Cheat Sheet
git config credential.helper store

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

git log --graph --oneline

Command Overview

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

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

git pull                           # (= git fetch && git merge)
git fetch                          # get updates from remote, safe operation
git fetch --all                    # 
git fetch upstream
git merge                          # merges those updates into working dir

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 log

git add .
git add -A                         # all

git commit -m "Commit message"
git commit -a                      # includes add (modified and deleted files, but not new files)
git commit -am "msg"
git commit --amend -m "Fixed"      # only do, if not pushed. Amend commit over last wrong commit

git reset --soft
git reset (--mixed)
git reset --hard
git reset --hard origin/master
git clean -df

git push
git push origin master             
git push origin --delete <branch>  # delete branch from origin
git push -f origin                 # force push

git checkout master
git checkout file.txt

git log
git log --all --decorate --oneline --graph

git branch                         # list branches
git branch -a                      # list local & remote branches
git branch --merged                # list branches that have been merged
git branch <branch>                # create new branch
git branch -d <branch>             # delete

git merge <branch>                 # to be executed on the branch that stays (usually master)
git merge <branch> --no-ff         # no fast forward, always keep branch in history
git merge upstream/master          # merge upstream master into own fork
git merge --abort

git rebase master                  # to be executed on the branch that is to be rebased (e.g. feature)
git rebase --continue
git rebase --abort
git rebase -i                      # interactive
git rebase -i HEAD~3               # interactive mode for 3 most recent commits

git revert <hash>                  # revert commit (changes from <hash> will be removed)

git config --list                  # show current git config
git remote -v                      # show remote urls
git remote set-url origin https..  # set origin url
git remote add upstream https://.. # add upstream remote url
# Merge
	  A---B---C topic	   A---B---C topic
	 /	                  /         \
    D---E---F---G master     D---E---F---G---H master

# Rebase
          A---B---C topic                  A'--B'--C' topic
         /                                /
    D---E---F---G master     D---E---F---G master

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

git checkout master                        # go to master
git pull                                   # check if new updates in origin
                                           # ...master has proceeded...
git checkout <branch>                      # go to <branch>
git rebase master                          # Rebase pulls the "old" branch up to the latest master position
                                           # now proceed with merge or rebase to get the code onto 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