You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							782 lines
						
					
					
						
							33 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							782 lines
						
					
					
						
							33 KiB
						
					
					
				
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸         ╻ ╻┏━┓┏━┓╻┏ ┏━┓╻ ╻┏━┓┏━┓
							 | 
						|
								              ┃╺┓┃ ┃    ╺━╸   ┃╻┃┃ ┃┣┳┛┣┻┓┗━┓┣━┫┃ ┃┣━┛
							 | 
						|
								              ┗━┛╹ ╹          ┗┻┛┗━┛╹┗╸╹ ╹┗━┛╹ ╹┗━┛╹  
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								                        27. September 2022
							 | 
						|
								                          Pranger Stefan
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━┓┏━┓┏━┓╺┳┓┏┳┓┏━┓┏━┓   
							 | 
						|
								              ┣┳┛┃ ┃┣━┫ ┃┃┃┃┃┣━┫┣━┛   
							 | 
						|
								              ╹┗╸┗━┛╹ ╹╺┻┛╹ ╹╹ ╹╹     
							 | 
						|
								              
							 | 
						|
								              
							 | 
						|
								
							 | 
						|
								            - git basics, what is git capable of
							 | 
						|
								            - what do to in what situations
							 | 
						|
								            - project management
							 | 
						|
								              - pull requests and feature branches
							 | 
						|
								              - bug tracking
							 | 
						|
								              - continuous integration
							 | 
						|
								            - git gadgets (grep, bisect, etc.)  
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏┳┓┏━┓╻┏┓╻   ┏━┓┏━┓╻┏┓╻╺┳╸┏━┓
							 | 
						|
								              ┃┃┃┣━┫┃┃┗┫   ┣━┛┃ ┃┃┃┗┫ ┃ ┗━┓
							 | 
						|
								              ╹ ╹╹ ╹╹╹ ╹   ╹  ┗━┛╹╹ ╹ ╹ ┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - Staging Area and 
							 | 
						|
								            - Interactive Rebasing for well crafted commits,
							 | 
						|
								
							 | 
						|
								            - Merging and Rebasing,
							 | 
						|
								
							 | 
						|
								            - Pull Request workflow and
							 | 
						|
								             
							 | 
						|
								            - Git as inspection tool.
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸   ┏┓ ┏━┓┏━┓╻┏━╸┏━┓
							 | 
						|
								              ┃╺┓┃ ┃    ┣┻┓┣━┫┗━┓┃┃  ┗━┓
							 | 
						|
								              ┗━┛╹ ╹    ┗━┛╹ ╹┗━┛╹┗━╸┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - _distributed_ version control
							 | 
						|
								            - staging area
							 | 
						|
								              - git add, git reset, etc. instead of only commiting
							 | 
						|
								            - branching
							 | 
						|
								              - "killer feature"
							 | 
						|
								            - content-addressable filesystem
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸   ╻┏┓╻╻╺┳╸
							 | 
						|
								              ┃╺┓┃ ┃    ┃┃┗┫┃ ┃ 
							 | 
						|
								              ┗━┛╹ ╹    ╹╹ ╹╹ ╹ 
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Create or clone a repository via
							 | 
						|
								            - $ git init
							 | 
						|
								            - $ git clone
							 | 
						|
								
							 | 
						|
								            Basic configuration:
							 | 
						|
								            - $ git config --global user.name "Foo Bar"
							 | 
						|
								            - $ git config --global user.email foobar@example.com
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━┓╺┳╸┏━┓┏━╸╻┏┓╻┏━╸   ┏━┓┏━┓┏━╸┏━┓
							 | 
						|
								              ┗━┓ ┃ ┣━┫┃╺┓┃┃┗┫┃╺┓   ┣━┫┣┳┛┣╸ ┣━┫
							 | 
						|
								              ┗━┛ ╹ ╹ ╹┗━┛╹╹ ╹┗━┛   ╹ ╹╹┗╸┗━╸╹ ╹
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - first main difference to SVN
							 | 
						|
								            - advantage of git
							 | 
						|
								
							 | 
						|
								            Files can be: 
							 | 
						|
								
							 | 
						|
								           ┌─────────┐   ┌──────────┐   ┌────────┐   ┌──────┐   ┌────────┐
							 | 
						|
								           │Untracked│   │Unmodified│   │Modified│   │Staged│   │Commited│
							 | 
						|
								           └─────────┘   └──────────┘   └────────┘   └──────┘   └────────┘
							 | 
						|
								
							 | 
						|
								            Git manages these states as:
							 | 
						|
								
							 | 
						|
								                       ┌─────────────────┐           ┌─────┐      ┌────┐
							 | 
						|
								                       │Working Directory│           │Index│      │HEAD│
							 | 
						|
								                       └─────────────────┘           └─────┘      └────┘
							 | 
						|
								                         Your Sandbox               The proposed  The next 
							 | 
						|
								                                                    next commit   parent  
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━┓╺┳╸┏━┓┏━╸╻┏┓╻┏━╸   ┏━┓┏━┓┏━╸┏━┓
							 | 
						|
								              ┗━┓ ┃ ┣━┫┃╺┓┃┃┗┫┃╺┓   ┣━┫┣┳┛┣╸ ┣━┫
							 | 
						|
								              ┗━┛ ╹ ╹ ╹┗━┛╹╹ ╹┗━┛   ╹ ╹╹┗╸┗━╸╹ ╹
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - git add
							 | 
						|
								            - git add --patch (-p) 
							 | 
						|
								             - add individual lines (hunks) to commits
							 | 
						|
								             - "interactive staging"
							 | 
						|
								             - very useful to craft commits that are easy to understand
							 | 
						|
								            - git restore --staged/--worktree
							 | 
						|
								            - git reset --soft/--mixed/--hard
							 | 
						|
								            - git rm --cached 
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━┓╺┳╸┏━┓┏━╸╻┏┓╻┏━╸   ┏━┓┏━┓┏━╸┏━┓
							 | 
						|
								              ┗━┓ ┃ ┣━┫┃╺┓┃┃┗┫┃╺┓   ┣━┫┣┳┛┣╸ ┣━┫
							 | 
						|
								              ┗━┛ ╹ ╹ ╹┗━┛╹╹ ╹┗━┛   ╹ ╹╹┗╸┗━╸╹ ╹
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Check your modifications or what you are about to commit
							 | 
						|
								            - git diff / git diff --staged
							 | 
						|
								
							 | 
						|
								            Should help to have a clean process of commiting changes
							 | 
						|
								            Finalizing step: git commit
							 | 
						|
								
							 | 
						|
								            What if I messed up my current commit?
							 | 
						|
								            - $ git commit --amend
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸   ┏━┓┏┓  ┏┓┏━╸┏━╸╺┳╸┏━┓
							 | 
						|
								              ┃╺┓┃ ┃    ┃ ┃┣┻┓  ┃┣╸ ┃   ┃ ┗━┓
							 | 
						|
								              ┗━┛╹ ╹    ┗━┛┗━┛┗━┛┗━╸┗━╸ ╹ ┗━┛
							 | 
						|
								
							 | 
						|
								        ┌────────────────┐    ┌──────────────────────┐main.c┌────┐
							 | 
						|
								        │commit (b3aacfe)│───>│tree (think directory)│─────>│blob│ 
							 | 
						|
								        └────────────────┘    └──────────────────────┘      └────┘
							 | 
						|
								                | parent                              \
							 | 
						|
								                v                                      \
							 | 
						|
								        ┌────────────────┐    ┌──────────────────────┐  \
							 | 
						|
								    ┌──>│commit (a21fh1a)│───>│         tree         │   \
							 | 
						|
								    |   └────────────────┘    └──────────────────────┘    \
							 | 
						|
								 ┌───┐                            /       |        \       \
							 | 
						|
								 │tag│                        main.c    config.h  main.h    \
							 | 
						|
								 └───┘                          /         |          \       \
							 | 
						|
								                             ┌────┐     ┌────┐      ┌────┐<--° 
							 | 
						|
								                             │blob│     │blob│<-┐   │blob│   | 
							 | 
						|
								                             └────┘     └────┘   \  └────┘   |
							 | 
						|
								                                                 └───────────┘
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━┓┏━╸╻ ╻╻┏━┓╻┏━┓┏┓╻   ┏━┓┏━╸╻  ┏━╸┏━╸╺┳╸╻┏━┓┏┓╻
							 | 
						|
								              ┣┳┛┣╸ ┃┏┛┃┗━┓┃┃ ┃┃┗┫   ┗━┓┣╸ ┃  ┣╸ ┃   ┃ ┃┃ ┃┃┗┫
							 | 
						|
								              ╹┗╸┗━╸┗┛ ╹┗━┛╹┗━┛╹ ╹   ┗━┛┗━╸┗━╸┗━╸┗━╸ ╹ ╹┗━┛╹ ╹
							 | 
						|
								
							 | 
						|
								        ┌────────────────┐ 
							 | 
						|
								        │commit (b3aacfe)│
							 | 
						|
								        └────────────────┘ 
							 | 
						|
								
							 | 
						|
								            - $ git show <commit-ish> -- <glob-pattern>
							 | 
						|
								
							 | 
						|
								            - commits are referencable via
							 | 
						|
								              - their SHA1
							 | 
						|
								              - HEAD
							 | 
						|
								              - tags/branchnames
							 | 
						|
								            
							 | 
						|
								            - Syntax:
							 | 
						|
								              - HEAD~<n> // select the n-th ancestor of HEAD
							 | 
						|
								              - <commit-ish>..<commit-ish>
							 | 
						|
								
							 | 
						|
								            - HEAD-history:
							 | 
						|
								              - HEAD@{<n>}
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏┓ ┏━┓┏━┓┏┓╻┏━╸╻ ╻╻┏┓╻┏━╸
							 | 
						|
								              ┣┻┓┣┳┛┣━┫┃┗┫┃  ┣━┫┃┃┗┫┃╺┓
							 | 
						|
								              ┗━┛╹┗╸╹ ╹╹ ╹┗━╸╹ ╹╹╹ ╹┗━┛
							 | 
						|
								              
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - git's "killer feature" 
							 | 
						|
								
							 | 
						|
								            - A new branch is essentially just opening a new history
							 | 
						|
								              (i.e. no copying involved!)
							 | 
						|
								
							 | 
						|
								            - Highly encouraged to use many (shortlived) branches 
							 | 
						|
								
							 | 
						|
								            Create a new branch with 
							 | 
						|
								            - $ git switch --create/-c <branch-name>
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏┓ ┏━┓┏━┓┏┓╻┏━╸╻ ╻╻┏┓╻┏━╸
							 | 
						|
								              ┣┻┓┣┳┛┣━┫┃┗┫┃  ┣━┫┃┃┗┫┃╺┓
							 | 
						|
								              ┗━┛╹┗╸╹ ╹╹ ╹┗━╸╹ ╹╹╹ ╹┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Switching between branches with
							 | 
						|
								            - $ git switch <branch-name>
							 | 
						|
								            - $ git switch - 
							 | 
						|
								
							 | 
						|
								            Cannot switch if that would overwrite modifications
							 | 
						|
								
							 | 
						|
								            Untracked files will simply "move along"
							 | 
						|
								           
							 | 
						|
								            Delete or rename a branch: 
							 | 
						|
								            - $ git branch -d <branch-name>
							 | 
						|
								            - $ git branch -m <oldbranch> <newbranch>
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸   ┏━┓╺┳╸┏━┓┏━┓╻ ╻
							 | 
						|
								              ┃╺┓┃ ┃    ┗━┓ ┃ ┣━┫┗━┓┣━┫
							 | 
						|
								              ┗━┛╹ ╹    ┗━┛ ╹ ╹ ╹┗━┛╹ ╹
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Very helpful to quickly safe modifications 
							 | 
						|
								
							 | 
						|
								            - $ git stash push --message/-m "..."
							 | 
						|
								            - $ git stash list 
							 | 
						|
								            - $ git stash apply/pop
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸   ┏━┓╺┳╸┏━┓┏━┓╻ ╻
							 | 
						|
								              ┃╺┓┃ ┃    ┗━┓ ┃ ┣━┫┗━┓┣━┫
							 | 
						|
								              ┗━┛╹ ╹    ┗━┛ ╹ ╹ ╹┗━┛╹ ╹
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              $ git stash push -m "WIP some frontend feature"
							 | 
						|
								              $ git switch stable
							 | 
						|
								              ...
							 | 
						|
								              $ git commit
							 | 
						|
								              $ git switch frontend_feature
							 | 
						|
								              $ git stash pop
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ╻┏┓╻╺┳╸┏━╸┏━┓┏━┓┏━╸╺┳╸╻╻ ╻┏━╸   ┏━┓┏━╸┏┓ ┏━┓┏━┓╻┏┓╻┏━╸
							 | 
						|
								              ┃┃┗┫ ┃ ┣╸ ┣┳┛┣━┫┃   ┃ ┃┃┏┛┣╸    ┣┳┛┣╸ ┣┻┓┣━┫┗━┓┃┃┗┫┃╺┓
							 | 
						|
								              ╹╹ ╹ ╹ ┗━╸╹┗╸╹ ╹┗━╸ ╹ ╹┗┛ ┗━╸   ╹┗╸┗━╸┗━┛╹ ╹┗━┛╹╹ ╹┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - $ git rebase -i <commit-ish>
							 | 
						|
								
							 | 
						|
								            Can be used to cleanup commit history
							 | 
						|
								            
							 | 
						|
								            - allows to basically change the history of your commits
							 | 
						|
								            - each project should have a guideline
							 | 
						|
								              - small feature may for example be _squashed_ together 
							 | 
						|
								              - WIP- or unnecessary commits can be removed 
							 | 
						|
								              - remove _checkpoint commits_
							 | 
						|
								               -> $ git rebase -i my_current_feature@{24.hours.ago}~1
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ╻┏┓╻╺┳╸┏━╸┏━┓┏━┓┏━╸╺┳╸╻╻ ╻┏━╸   ┏━┓┏━╸┏┓ ┏━┓┏━┓╻┏┓╻┏━╸   
							 | 
						|
								              ┃┃┗┫ ┃ ┣╸ ┣┳┛┣━┫┃   ┃ ┃┃┏┛┣╸    ┣┳┛┣╸ ┣┻┓┣━┫┗━┓┃┃┗┫┃╺┓   
							 | 
						|
								              ╹╹ ╹ ╹ ┗━╸╹┗╸╹ ╹┗━╸ ╹ ╹┗┛ ┗━╸   ╹┗╸┗━╸┗━┛╹ ╹┗━┛╹╹ ╹┗━┛   
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            
							 | 
						|
								            # Commands:
							 | 
						|
								            # p, pick <commit> = use commit
							 | 
						|
								            # r, reword <commit> = use commit, but edit the commit message
							 | 
						|
								            # e, edit <commit> = use commit, but stop for amending
							 | 
						|
								            # s, squash <commit> = use commit, but meld into previous commit
							 | 
						|
								            # f, fixup <commit> = like "squash", but discard this commit's log message
							 | 
						|
								            ...
							 | 
						|
								            #
							 | 
						|
								            # These lines can be re-ordered; they are executed from top to bottom.
							 | 
						|
								            #
							 | 
						|
								            # If you remove a line here THAT COMMIT WILL BE LOST.
							 | 
						|
								            
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━┓┏━╸┏┳┓┏━┓╺┳╸┏━╸┏━┓
							 | 
						|
								              ┣┳┛┣╸ ┃┃┃┃ ┃ ┃ ┣╸ ┗━┓
							 | 
						|
								              ╹┗╸┗━╸╹ ╹┗━┛ ╹ ┗━╸┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Remote server to share code base
							 | 
						|
								
							 | 
						|
								            - Gets setup with $ git clone 
							 | 
						|
								            - $ git remote add <name> <url>
							 | 
						|
								
							 | 
						|
								            - $ git fetch
							 | 
						|
								            - $ git pull <remote> <branch>
							 | 
						|
								            - $ git push <remote> <branch>
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏┳┓┏━╸┏━┓┏━╸╻┏┓╻┏━╸
							 | 
						|
								              ┃┃┃┣╸ ┣┳┛┃╺┓┃┃┗┫┃╺┓
							 | 
						|
								              ╹ ╹┗━╸╹┗╸┗━┛╹╹ ╹┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Multiple parallel workflows are encouraged 
							 | 
						|
								             -> unavoidable conflicts 
							 | 
						|
								 
							 | 
						|
								            - Project guideline on how to handle conflicts
							 | 
						|
								           
							 | 
						|
								            - For more advanced usage:
							 | 
						|
								              - $ git rerere
							 | 
						|
								              - different merging strategies
							 | 
						|
														 
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏┳┓┏━╸┏━┓┏━╸╻┏┓╻┏━╸         ┏━╸┏━╸
							 | 
						|
								              ┃┃┃┣╸ ┣┳┛┃╺┓┃┃┗┫┃╺┓   ╺━╸   ┣╸ ┣╸ 
							 | 
						|
								              ╹ ╹┗━╸╹┗╸┗━┛╹╹ ╹┗━┛         ╹  ╹  
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - _fast-forward_ merge possible if HEAD direct ancestor
							 | 
						|
								            - This allows for a clean, linear history on stable branches
							 | 
						|
								              - helps with git blame, git bisect, git rebase -i
							 | 
						|
								
							 | 
						|
								            ┌─────────────────────────────────────────────────────────────┐
							 | 
						|
								            │[spranger@gitWorkshop/stagingArea] git merge more_int_changes│
							 | 
						|
								            │Updating eff74ed..a2c365a                                    │
							 | 
						|
								            │Fast-forward                                                 │
							 | 
						|
								            │ testfile1 | 4 ++--                                          │
							 | 
						|
								            │  1 file changed, 2 insertions(+), 2 deletions(-)            │
							 | 
						|
								            └─────────────────────────────────────────────────────────────┘
							 | 
						|
								
							 | 
						|
								            - --ff, --no-ff, --ff-only
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━┓┏━╸┏┓ ┏━┓┏━┓╻┏┓╻┏━╸   
							 | 
						|
								              ┣┳┛┣╸ ┣┻┓┣━┫┗━┓┃┃┗┫┃╺┓   
							 | 
						|
								              ╹┗╸┗━╸┗━┛╹ ╹┗━┛╹╹ ╹┗━┛   
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Allows to move bases of branches (and more)
							 | 
						|
								            
							 | 
						|
								            - Most common usage: Update the base of your branch if outdated
							 | 
						|
								            - Common strategy to _always_ ensure fast-forward merges
							 | 
						|
								            - Very helpful in complicated branching settings
							 | 
						|
								
							 | 
						|
								            Important Note:
							 | 
						|
								              ┌─────────────────────────────────────────────────────────┐
							 | 
						|
								              │Do not rebase commits that exist outside your repository │
							 | 
						|
								              │             and that people (may) have based work on.   │
							 | 
						|
								              └─────────────────────────────────────────────────────────┘
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸┏━┓┏┓╻┏━╸╻  ╻┏━╸╺┳╸┏━┓
							 | 
						|
								              ┃  ┃ ┃┃┗┫┣╸ ┃  ┃┃   ┃ ┗━┓
							 | 
						|
								              ┗━╸┗━┛╹ ╹╹  ┗━╸╹┗━╸ ╹ ┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Git tracks (per hunk-) conflicts over three files:
							 | 
						|
								              - base/common
							 | 
						|
								              - ours
							 | 
						|
								              - theirs
							 | 
						|
								
							 | 
						|
								            - $ git config --global merge.conflictstyle diff3
							 | 
						|
								              - Often helpful to have common state 
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
															┏━╸┏━┓┏┓╻┏━╸╻  ╻┏━╸╺┳╸┏━┓
							 | 
						|
															┃  ┃ ┃┃┗┫┣╸ ┃  ┃┃   ┃ ┗━┓
							 | 
						|
															┗━╸┗━┛╹ ╹╹  ┗━╸╹┗━╸ ╹ ┗━┛
							 | 
						|
								
							 | 
						|
								            ┌────────────────────────┐ ┌────────────────────────┐
							 | 
						|
								            │ #include <algorithms>  │ │ int main() {           │  				 
							 | 
						|
								            │ <<<<<<< HEAD           │ │   int a = 5;           │   				 
							 | 
						|
								            │  #include <sstream>    │ │ <<<<<<< HEAD           │   				 
							 | 
						|
								            │ ||||||| 9275968        │ │   int b = 4;           │  				 
							 | 
						|
								            │ =======                │ │ ||||||| 9275968        │ 				 
							 | 
						|
								            │ #include <string>      │ │   int b = 8;           │ 				 
							 | 
						|
								            │>>>>>>> new_feature     │ │ =======                │                                
							 | 
						|
								            └────────────────────────┘ │   int b = 9;           │ 
							 | 
						|
								                                       │ >>>>>>> new_feature    │
							 | 
						|
								                                       └────────────────────────┘
							 | 
						|
														- Conflict markers appear in the file itself
							 | 
						|
														- Simplest way to handle: 
							 | 
						|
															-> directly modify the file	
							 | 
						|
								            - Git difftool for visual conflict resolving
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ╺┳╸┏━╸┏━┓┏┳┓   ╻ ╻┏━┓┏━┓╻┏ ┏━╸╻  ┏━┓╻ ╻┏━┓
							 | 
						|
								               ┃ ┣╸ ┣━┫┃┃┃   ┃╻┃┃ ┃┣┳┛┣┻┓┣╸ ┃  ┃ ┃┃╻┃┗━┓
							 | 
						|
								               ╹ ┗━╸╹ ╹╹ ╹   ┗┻┛┗━┛╹┗╸╹ ╹╹  ┗━╸┗━┛┗┻┛┗━┛
							 | 
						|
								
							 | 
						|
								            
							 | 
						|
								
							 | 
						|
								            Team Workflows:
							 | 
						|
								            - Merge vs. Rebase
							 | 
						|
								              - Only fast-forward?
							 | 
						|
								              - Keep merge commits?
							 | 
						|
								           
							 | 
						|
								            Branching Strategies: 
							 | 
						|
								            - Main - Development - Feature branches - Stable branches
							 | 
						|
								            - Main - Feature branches
							 | 
						|
								            - etc.
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸┏━┓╻  ╻  ┏━┓┏┓ ┏━┓┏━┓┏━┓╺┳╸╻┏━┓┏┓╻
							 | 
						|
								              ┃  ┃ ┃┃  ┃  ┣━┫┣┻┓┃ ┃┣┳┛┣━┫ ┃ ┃┃ ┃┃┗┫
							 | 
						|
								              ┗━╸┗━┛┗━╸┗━╸╹ ╹┗━┛┗━┛╹┗╸╹ ╹ ╹ ╹┗━┛╹ ╹
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Git usage in the bigger picture.
							 | 
						|
								
							 | 
						|
								            - Issue tracking,
							 | 
						|
								            - Pull Request handling,
							 | 
						|
								            - Assigning work,
							 | 
						|
								            - Milestones, Projects, etc.
							 | 
						|
								
							 | 
						|
								            Example frontends:
							 | 
						|
								            - GitHub
							 | 
						|
								            - Gitlab
							 | 
						|
								            - Gitea
							 | 
						|
								            - Gogs
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ╻┏━┓┏━┓╻ ╻┏━╸   ╺┳╸┏━┓┏━┓┏━╸╻┏ ┏━╸┏━┓
							 | 
						|
								              ┃┗━┓┗━┓┃ ┃┣╸     ┃ ┣┳┛┣━┫┃  ┣┻┓┣╸ ┣┳┛
							 | 
						|
								              ╹┗━┛┗━┛┗━┛┗━╸    ╹ ╹┗╸╹ ╹┗━╸╹ ╹┗━╸╹┗╸
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - Note-tacking,
							 | 
						|
								            - feature requests,
							 | 
						|
								            - track bug reports from clients.
							 | 
						|
								
							 | 
						|
								            - Use labels to categorize 
							 | 
						|
								              - bug, good-first-issue, enhancement, etc.
							 | 
						|
								            - Associate milestones and assignees
							 | 
						|
								
							 | 
						|
								            An issue should eventually be turned into a pull request (PR).
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━┓╻ ╻╻  ╻     ┏━┓┏━╸┏━┓╻ ╻┏━╸┏━┓╺┳╸┏━┓
							 | 
						|
								              ┣━┛┃ ┃┃  ┃     ┣┳┛┣╸ ┃┓┃┃ ┃┣╸ ┗━┓ ┃ ┗━┓
							 | 
						|
								              ╹  ┗━┛┗━╸┗━╸   ╹┗╸┗━╸┗┻┛┗━┛┗━╸┗━┛ ╹ ┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            At the heart of your team's workflow
							 | 
						|
								
							 | 
						|
								            - Accompanies a branch
							 | 
						|
								            - Gives the team
							 | 
						|
								              - a plattform to discuss progress,
							 | 
						|
								              - the branches history and
							 | 
						|
								              - a list of all introduces changes.
							 | 
						|
								
							 | 
						|
								            Project lead can review and ask for changes one a line-by-line basis
							 | 
						|
								
							 | 
						|
								            Basis for Continuous Integration 
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸┏━┓┏┓╻╻ ╻┏━╸┏┓╻╺┳╸╻┏━┓┏┓╻┏━┓╻     ┏━╸┏━┓┏┳┓┏┳┓╻╺┳╸┏━┓
							 | 
						|
								              ┃  ┃ ┃┃┗┫┃┏┛┣╸ ┃┗┫ ┃ ┃┃ ┃┃┗┫┣━┫┃     ┃  ┃ ┃┃┃┃┃┃┃┃ ┃ ┗━┓
							 | 
						|
								              ┗━╸┗━┛╹ ╹┗┛ ┗━╸╹ ╹ ╹ ╹┗━┛╹ ╹╹ ╹┗━╸   ┗━╸┗━┛╹ ╹╹ ╹╹ ╹ ┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Syntax:
							 | 
						|
								              ┌─────────────────────────────────────┐
							 | 
						|
								              │<type>[optional scope]: <description>│
							 | 
						|
								              │                                     │
							 | 
						|
								              │[optional body]                      │
							 | 
						|
								              │                                     │
							 | 
						|
								              │[optional footer(s)]                 │
							 | 
						|
								              └─────────────────────────────────────┘
							 | 
						|
								
							 | 
						|
								            - They enable
							 | 
						|
								              - automated CHANGELOGs and, 
							 | 
						|
								              - automated semantic version bump and
							 | 
						|
								            - greatly help with readability.
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸┏━┓┏┓╻╻ ╻┏━╸┏┓╻╺┳╸╻┏━┓┏┓╻┏━┓╻     ┏━╸┏━┓┏┳┓┏┳┓╻╺┳╸┏━┓
							 | 
						|
								              ┃  ┃ ┃┃┗┫┃┏┛┣╸ ┃┗┫ ┃ ┃┃ ┃┃┗┫┣━┫┃     ┃  ┃ ┃┃┃┃┃┃┃┃ ┃ ┗━┓
							 | 
						|
								              ┗━╸┗━┛╹ ╹┗┛ ┗━╸╹ ╹ ╹ ╹┗━┛╹ ╹╹ ╹┗━╸   ┗━╸┗━┛╹ ╹╹ ╹╹ ╹ ┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            ┌──────────────────────────────────────────────────────────┐
							 | 
						|
								            │feat: allow provided config object to extend other configs│
							 | 
						|
								            │                                                          │
							 | 
						|
								            │BREAKING CHANGE: `extends` key in config file is now      │
							 | 
						|
								            │used for extending other config files                     │
							 | 
						|
								            └──────────────────────────────────────────────────────────┘
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏┳┓╻┏━┓┏━╸┏━╸╻  ╻  ┏━┓┏┓╻┏━╸┏━┓╻ ╻┏━┓
							 | 
						|
								              ┃┃┃┃┗━┓┃  ┣╸ ┃  ┃  ┣━┫┃┗┫┣╸ ┃ ┃┃ ┃┗━┓
							 | 
						|
								              ╹ ╹╹┗━┛┗━╸┗━╸┗━╸┗━╸╹ ╹╹ ╹┗━╸┗━┛┗━┛┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - Protect master branch
							 | 
						|
								            - Repository setting for PRs help with team workflow
							 | 
						|
								              - e.g. can be set to create merge commits.
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━┓┏┓╻┏━┓╻  ╻ ╻┏━┓╻┏━┓         ╻┏┓╻┏━┓┏━┓┏━╸┏━╸╺┳╸╻┏━┓┏┓╻
							 | 
						|
								              ┣━┫┃┗┫┣━┫┃  ┗┳┛┗━┓┃┗━┓   ╺━╸   ┃┃┗┫┗━┓┣━┛┣╸ ┃   ┃ ┃┃ ┃┃┗┫
							 | 
						|
								              ╹ ╹╹ ╹╹ ╹┗━╸ ╹ ┗━┛╹┗━┛         ╹╹ ╹┗━┛╹  ┗━╸┗━╸ ╹ ╹┗━┛╹ ╹
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - Search through: code, modifications, commits or commit messages.
							 | 
						|
								            - Look at history of lines of code
							 | 
						|
								            - Binary search for bugs
							 | 
						|
								            - List of most recent changes
							 | 
						|
								
							 | 
						|
								            
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸   ╻  ┏━┓┏━╸
							 | 
						|
								              ┃╺┓┃ ┃    ┃  ┃ ┃┃╺┓
							 | 
						|
								              ┗━┛╹ ╹    ┗━╸┗━┛┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - $ git log
							 | 
						|
								              - --patch, --after, --since, --before, --committer
							 | 
						|
								              - -S"<search-pattern>"           // code
							 | 
						|
								              - -L <start>,<end>:<filename>    // history of lines of code
							 | 
						|
								              - -L :<function-name>:<filename> // history of a function
							 | 
						|
								              - --grep "<search-pattern>"      // commit messages
							 | 
						|
								
							 | 
						|
								            - $ git log --oneline
							 | 
						|
								            - $ git log --graph
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸   ┏┓ ╻  ┏━┓┏┳┓┏━╸
							 | 
						|
								              ┃╺┓┃ ┃    ┣┻┓┃  ┣━┫┃┃┃┣╸ 
							 | 
						|
								              ┗━┛╹ ╹    ┗━┛┗━╸╹ ╹╹ ╹┗━╸
							 | 
						|
								
							 | 
						|
														
							 | 
						|
														
							 | 
						|
														- $ git blame <filename>
							 | 
						|
								            ┌────────────────────────────────────────────────────────────────┐
							 | 
						|
								            │[spranger@gitWorkshop/stagingArea] git blame testfile1          │
							 | 
						|
								            │2 days ago      Stefan  ^3b4a655│  1 │ #include <stdio.h>       │
							 | 
						|
								            │                                │  2 │ #include <algorithms>    │
							 | 
						|
								            │a day ago       Stefan  08b88afb│  3 │ #include <sstream>       │
							 | 
						|
								            │2 days ago      Stefan  ^3b4a655│  4 │                          │
							 | 
						|
								            │                                │  5 │ int main() {             │
							 | 
						|
								            │3 hours ago     Stefan  a2c365ad│  6 │   int a = 1;             │
							 | 
						|
								            │                                │  7 │   int b = 2;             │
							 | 
						|
								            │2 days ago      Stefan  ^3b4a655│  8 │                          │
							 | 
						|
								            │2 days ago      Stefan  a0bd6d8c│  9 │                          │
							 | 
						|
								            │                                │ 10 │   return a+b;            │
							 | 
						|
								            │2 days ago      Stefan  ^3b4a655│ 11 │ }                        │
							 | 
						|
								            └────────────────────────────────────────────────────────────────┘
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸   ┏━╸┏━┓┏━╸┏━┓
							 | 
						|
								              ┃╺┓┃ ┃    ┃╺┓┣┳┛┣╸ ┣━┛
							 | 
						|
								              ┗━┛╹ ╹    ┗━┛╹┗╸┗━╸╹  
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Powerful tool to search for code snippets
							 | 
						|
								
							 | 
						|
								            - $ git grep "<search-pattern>"
							 | 
						|
								              - -A <n>, -B <n>, -C <n>
							 | 
						|
								              - --show-function/-p
							 | 
						|
								              - --function-context/-W
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸   ┏┓ ╻┏━┓┏━╸┏━╸╺┳╸
							 | 
						|
								              ┃╺┓┃ ┃    ┣┻┓┃┗━┓┣╸ ┃   ┃ 
							 | 
						|
								              ┗━┛╹ ╹    ┗━┛╹┗━┛┗━╸┗━╸ ╹ 
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Binary search to find commit that introduced a bug.
							 | 
						|
								
							 | 
						|
								            ┌──────────────────────────────────────────┐
							 | 
						|
								            │$ git bisect start                        │ 
							 | 
						|
								            │$ git bisect bad <commit-ish>             │
							 | 
						|
								            │$ git bisect good <commit-ish>            │
							 | 
						|
								            └──────────────────────────────────────────┘
							 | 
						|
								            
							 | 
						|
								            ┌──────────────────────────────────────────┐
							 | 
						|
								            │$ git bisect start HEAD HEAD~10 --        │
							 | 
						|
								            │$ git bisect run make test                │
							 | 
						|
								            │$ git bisect reset                        │
							 | 
						|
								            └──────────────────────────────────────────┘
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━┓┏━┓╺┳╸┏━╸╻ ╻╻┏┓╻┏━╸
							 | 
						|
								              ┣━┛┣━┫ ┃ ┃  ┣━┫┃┃┗┫┃╺┓
							 | 
						|
								              ╹  ╹ ╹ ╹ ┗━╸╹ ╹╹╹ ╹┗━┛
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            
							 | 
						|
								            - Revert already commited changes
							 | 
						|
								            - Pick a range of commits from different branches
							 | 
						|
								            - Turn a commit into a git-readable file
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸   ┏━┓┏━╸╻ ╻┏━╸┏━┓╺┳╸
							 | 
						|
								              ┃╺┓┃ ┃    ┣┳┛┣╸ ┃┏┛┣╸ ┣┳┛ ┃ 
							 | 
						|
								              ┗━┛╹ ╹    ╹┗╸┗━╸┗┛ ┗━╸╹┗╸ ╹ 
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Revert commits via new commits
							 | 
						|
								
							 | 
						|
								            - Should be used when the commits are already public 
							 | 
						|
								
							 | 
						|
								            - $ git revert <commit-ish>.. 
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸╻╺┳╸   ┏━╸╻ ╻┏━╸┏━┓┏━┓╻ ╻   ┏━┓╻┏━╸╻┏ 
							 | 
						|
								              ┃╺┓┃ ┃    ┃  ┣━┫┣╸ ┣┳┛┣┳┛┗┳┛╺━╸┣━┛┃┃  ┣┻┓
							 | 
						|
								              ┗━┛╹ ╹    ┗━╸╹ ╹┗━╸╹┗╸╹┗╸ ╹    ╹  ╹┗━╸╹ ╹
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            Specify commits and apply them onto your HEAD
							 | 
						|
								
							 | 
						|
								            - $ git cherry-pick <commit-ish>..
							 | 
						|
								
							 | 
						|
								            - $ git cherry-pick ..master
							 | 
						|
								              - essentially the same as $ git rebase master
							 | 
						|
								
							 | 
						|
								            - Useful if e.g. a hotfix has been pushed to a stable branch
							 | 
						|
								            - Might need to clean such commits before merging
							 | 
						|
								            
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏━╸┏━┓┏━┓┏┳┓┏━┓╺┳╸   ┏━┓┏━┓╺┳╸┏━╸╻ ╻   ┏┓     ┏━┓┏━┓┏━┓╻  ╻ ╻
							 | 
						|
								              ┣╸ ┃ ┃┣┳┛┃┃┃┣━┫ ┃ ╺━╸┣━┛┣━┫ ┃ ┃  ┣━┫   ┃╺╋╸   ┣━┫┣━┛┣━┛┃  ┗┳┛
							 | 
						|
								              ╹  ┗━┛╹┗╸╹ ╹╹ ╹ ╹    ╹  ╹ ╹ ╹ ┗━╸╹ ╹   ┗━┛    ╹ ╹╹  ╹  ┗━╸ ╹ 
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            In certain situations it might be sensible to send commits per mail
							 | 
						|
								
							 | 
						|
								            - $ git format-patch -1 <commit-ish>
							 | 
						|
								            - colleague does not need to checkout your branch
							 | 
						|
								
							 | 
						|
								            - $ git apply <filename>
							 | 
						|
								################################################################################
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								              ┏┳┓┏━┓┏━┓┏━╸   ┏━┓┏┓╻╺┳┓   ┏┳┓┏━┓┏━┓┏━╸
							 | 
						|
								              ┃┃┃┃ ┃┣┳┛┣╸    ┣━┫┃┗┫ ┃┃   ┃┃┃┃ ┃┣┳┛┣╸ 
							 | 
						|
								              ╹ ╹┗━┛╹┗╸┗━╸   ╹ ╹╹ ╹╺┻┛   ╹ ╹┗━┛╹┗╸┗━╸
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            - git notes,
							 | 
						|
								            - commit signing,
							 | 
						|
								            - merge strategies,
							 | 
						|
								            - git worktree,
							 | 
						|
								            - refs,
							 | 
						|
								            - git reflog,
							 | 
						|
								            - porcelain commands and scripting,
							 | 
						|
								            - the power of .gitconfig,
							 | 
						|
								            - hooks on the server,
							 | 
						|
								            - multiple remotes,
							 | 
						|
								            - etc.
							 | 
						|
								
							 | 
						|
								
							 |