Git is a version control system that tracks changes in a set of files, which is used by developers to coordinate work done for various projects. Here are some useful git commands that can help with your workflow:
General Commands
git status
to see what changes have been made locallygit add .
to commit all locally edited files in the repogit add <file>
to add a file to the next commitgit rm <file>
to delete a file in the next commitgit mv <file>
to rename a file in the next commitgit add -p
is useful if you’ve done too much work for one commit,?
is a useful command to print allgit cat-file -p <sha>
prints the contents of blobs (sha refers to the SHA or hash that git assigns to each commit)cat .git/HEAD
to see what HEAD is pointing to
Stashing
Stashing your work is useful if you’re moving between branches when you’re in the middle of work. It’s a safe, non-destructive way to save your work.
git stash
to save uncommitted workgit stash list
to view the current stashes that are availablegit stash apply
applies the last stashgit stash apply stash@{0}
to apply a specific stash (in place of the0
you can add the number associated with the stash from yourgit stash list
that you’d like to apply)git stash --include-untracked
to keep untracked files in your stashgit stash save "WIP: working on recent bug fix"
in place of the text in the quotes here, you can add a name for easy references when viewing the list of your stashes and figuring out which stash to apply on your current branchgit checkout <stash name> -- <filename>
grabs a single file form a stashgit stash show stash@{2}
to show the files changed
Keeping Your Stash Clean
git stash drop
to remove the last stashgit stash clear
to remove all stashes
Logging
git log
to view an overview of the most recent git commitsgit log --since="yesterday"
to view commits from a specific time period. You can also pass arguments likegit log --since="2 weeks ago"
git log --name-status --follow -- <file>
to log files that have been moved or renamedgit log --diff-filter=R --find-renames
to find files that have been renamedgit show <commit>
to show commit and its contentsgit show <commit> --stat
show files changed in commitgit show <commit>:<file>
look at a file from another commit
Fixing Mistakes
git checkout -- <file-path>
overwrites the working area file with the staging area version from the last commit (this operation overwrites without warning so use with caution)git clean
will clear your working area by deleting untracked files (this operation cannot be undone). Use the--dry-run
flag to see what will get removedgit reset
moves the HEAD pointer, modifies files for commits (can change history)git revert <commit>
is the safe reset (creates a new commit that introduces the opposite changes from the specified commit, the original commit stays in the repo)git reset --hard HEAD
use this command if your staging area has gotten really messed up and you want to blow away all of your local workgit commit --amend
if you need to amend your latest commit- RERERE (Reuse Recorded Resolution) is a tool that remembers a previously used solution for a merge conflict. Set
git config rerere.enabled true
within a project to have access to this tool. You can also set it globally withgit config --global rerere.enabled true
Rebasing
Rebasing your feature branch with main
will help keep your development work up-to-date with the latest changes that have been committed to the repo. This will help make merge conflicts more manageable whenever it’s time to merge in your feature work.
git rebase main
makes history of current branch cleaner and makes managing merge conflicts easiergit rebase -i <commit to fix>
addressing specific commits
Working with GitHub
git clone <project reference
to clone a GitHub repo locallygit pull
performs agit fetch && git merge
to ensure the latest version of a branch has been updated on your machinegit push origin <name-of-branch>
to push any changes to the remote repogit pull --rebase
will fetch, update your local branch to a copy of the upstream branch, then replay any commits you made via rebase (this doesn’t work well on branches with local merge commits, it works best when branching off master and working on a feature)
Local Destructive Operations
When performing a destructive operation, make sure you properly stash your work so you don’t accidentally delete any of your work in progress. Use git stash --include-untracked
to include working area changes in your stash.
git checkout --<file>
if file is presnt in staging, it will be overwrittengit reset --hard
overwrite changes that are staged and in working arearebase
,amend
, andreset
can rewrite history (if your code is hosted or shared, never rungit push -f
which forces a push of your changes)
Configuring Your Editor
To customize which editor git opens when you run a commit
with no -m
flag, a merge, or rebase, run the following command:
git config --global core.editor <your_editor>
In the place of <your_editor>
, add the command associated with your editor of choice:
- atom:
atom --wait
- emacs:
emacs
- sublime:
subl -n -w
- vi:
vi
orvim
- vscode:
code --wait