Git in Production
Pretty and concise logs
add an alias
nano ~/.gitconfig
[alias]
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --branches
You can now use git lg
to see better logs
Change commit message of last commit
git commit --amend
It’ll open the editor and you’ll be able to update the last commit message. Only do this for unpushed code
Add a file i forgot in last commit
git commit --amend
When you run the command it’ll automatically include the newly modified files. Only do this for unpushed code
Update feature
with latest changes from master
Get changes from the main development branch.
# switch to master and get latest changes
git checkout master
git pull
# switch to feature and pull changes from master
git checkout feature
# merge is good when you have other devs working on the code
# and the changes have been committed and pushed
git merge master
# rebase is ok if you're the only dev and as long as you haven't pushed yet
# beware of rebase changing commit hashes
git rebase
git merge
is recommended when you have a shared branch and other developers are working on it as wellgit rebase
will get all changes frommaster
and merge it on top of your feature branch. Doing so will change the commit hashes.git rebase
will rewind head and replay our work on top of it.
Move accidental commits from master
to another branch
# Changes haven't been pushed yet, and NOT synced with remote
# otherwise you'll mess up commit history
# create a new branch from master
# since you have pushed your changes to master the new branch will have those changes
git checkout master
git checkout -b newBranch
# go back to master and remove those accidental changes by going back
# to the point where those commits weren't added
git checkout master
git reset --hard XXXXX
Combine multiple commits into one
git rebase -i XXX
# select the actions you want to take for every commit, close editor and continue
You’ll get a summary of all the commits from XXX
onwards
-i
is for inetractiveXXX
is the commit from where you want to start and update commits that came after this point
See the changes in local commits (with diff
)
git diff # unstaged changes
git diff --staged # staged changes
git diff HEAD # both staged+unstaged changes
git diff --stat # summary of what files changed, no. of line +/- etc.
git diff --check # check for merge conflicts
Create empty branches
Create the Git branch as an orphan. That means it’ll have no ‘parent’, hence no code. All the code that is there can be removed with git rm --cahced -r .
git checkout --orphan FOO
# multiple ways of removing files..
git rm -r --cached .
git reset --hard
git clean -fd
Save dirty copy of your work in progress
git add . # capture all 'Work In Progress' files
git stash # put it away
# la la la, go to other branches, make changes, commit etc.
# go back to the branch you were working in
git stash pop # get it back, remove it from stash
git stash list
git stash apply # get it back, keep the stashed copy as well
git stash apply X # apply the number 'X' stash from your list (e.g. stash@{1})
git stash save 'wip: fancy feature' # stash it with a name
pop
will take the stash out ofgit stash list
,apply
would not.- by default
apply
will get back the the most recent stash
See changes between your file and remote file (with diff
)
git diff HEAD myFile.js
compare two different commits
git diff XXXX YYYY
Wipe a commit from local
git reset --hard XXXX
- will jump back to the
XXXX
commit discarding all the ones that came after it - make sure you’re getting rid of only local commits and that the cahnges haven’t already been pushed
Delete a commit from remote
# find your commit
git log --oneline
# reset will checkout the specified commit and remove everything that came after it
git reset --hard XXX
# push your changesto remote
git push --force
# git push origin +develop
- keep in mind that
--hard
throws away all your uncommitted changes. to use--hard
first make sure the output ofgit status
is clean
Undo commits that have already been pushed to remote (with revert
)
git revert XXXX
reset
andamend
will change the commit hash, which we don’t want, as it’ll cause conflicts since the code has already been pushed to remote and other people may have pulledit already.revert
does not change the commit hash, which is why it is a good command for getting rid of changes that have already been pushed to remote
See only local unpushed changes in current branch
git log origin/master..HEAD
# you can view diff using the same syntax
git diff origin/master..HEAD
See all local merge conflicts
git status
Squash all commits into one and merge to master
git checkout master
git merge --squash fooBranch