Git
Basics
git config # Set user-specific configuration values like email, username, editor, etc
git clone # Clone a repository into a new directory
git init # Create an empty Git repository
git add # Add files for staging
git rm # Remove files from the working tree and from the index
git status # Show changes staged for next commit
git diff # Show changes between commits, commit and working tree, etc
git show # Show information about any git object
git log # Show commit logs
git bisect # Use binary search to find the commit that introduced a bug
git commit # Record changes to the repository
git branch # List, create, or delete branches
git checkout # Switch to another branch
git merge # Join two or more branches together
git rebase # Reapply commits on top of another base tip
git reset # Reset current HEAD to the specified state
git stash # Stash the changes in a dirty working directory away
git tag # Create, list, delete or verify a tag object signed with GPG
git remote # View all remote
git fetch # Fetch all objects from the remote repository that donβt currently reside in the local working directory
git pull # Merge all the changes present in the remote repository to the local working directory
git push # Update remote with committed changes
Useful options
git log --oneline # Display single commit information per line
git rev-list HEAD --count # Total number of commits
git shortlog # Summarize `git log` output
git commit --amend -m "New commit message" # Edit the last commit message
Miscellaneous
Remove a file from history
$ git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \
--prune-empty --tag-name-filter cat -- --allGet a list of the deleted files in history
## without commit hashes
git log --diff-filter=D --summary | grep delete
## with commit hashes
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'Amend older or multiple commit messages
Display a list of the last n commits in the default text editor
git rebase -i HEAD~n
Replace
pick
withreword
before each commit message you want to change, save and close the commit list file.In each resulting commit file, type the new commit message, save the file, and close it.
Push the amended commits.
git push --force
Amend the very first commit message [*]
git rebase -i --root
Squash all previous commits into one [*]
git reset $(git commit-tree HEAD^{tree} -m "A new start")
See the diff for a commit [*]
git show <commit> # or one of these
git show --color --pretty=format:%b <commit>
git diff-tree -p <commit>Print a leaderboard of authors based on number of commits in a repository
git log --format='%aN' | sort | uniq -c | sort -nr
git log --format='%aN' | sort -u # Print all contributors in alphabetical orderWorking with multiple GitHub accounts with SSH [*]
Create a new SSH key and add it to GitHub account #2. Save the private key file as something like
id_rsa_2
.Update the SSH config:
.ssh/config# Default GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
# GitHub account #2
Host github-alt
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_2When pushing to GitHub account #2, change the remote to reflect the new host:
# git remote add origin git@github.com:username/repository.git
git remote add origin git@github-alt:username/repository.git
git push origin main