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

################################################################################
┏━╸╻╺┳╸ ╻ ╻┏━┓┏━┓╻┏ ┏━┓╻ ╻┏━┓┏━┓
┃╺┓┃ ┃ ╺━╸ ┃╻┃┃ ┃┣┳┛┣┻┓┗━┓┣━┫┃ ┃┣━┛
┗━┛╹ ╹ ┗┻┛┗━┛╹┗╸╹ ╹┗━┛╹ ╹┗━┛╹
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.