Git basics: workflow, pull request, rebasing, …

When I started using git (several years ago) I use only git command line. After a few years I decided to start using SourceTree. I regret this decision to this day :). The problem is that  you can’t do a lot of things. Another big problem is that when you change your develop environment where you can’t install SourceTree (e.g. remote via SSH) you are “lost”. Because there aren’t that many git command (that you should be using on a daily basis) there is no good reason that you should’t learn them.

So here are some git commands that I use frequently.

 

git checkout LOCAL_OR_REMOTE_BRANCH #  switches to local or remote branch
// "UNDO" COMMANDS
git reset # undo add files
git checkout . # discard all changes
git checkout dir/file # discard changes in dir or specific file
git clean -f # delete all untracked files

// COMMIT COMMANDS:
git commit --amend # append commit changes to the last commit. This is VERY useful. e.g. you forgot to add some file or did some minor  mistake.
git rebase -i HEAD~6 # this will get last 6 commits and you will be able to modify the commits

// LIST COMMANDS
git branch  # list of local branches
git remote -v # list remotes

// DIFF commands
git diff --name-status master..BRANCH  # shows a list of files that were changed
git diff --stat --color master..BRANCH # shows a list of files that were changed. More detailed view
git diff master..BRANCH  # you can cycle through changes
git diff commit_id HEAD # shows difference between current version and `commit_id` version

If you are working on some branch but the master is several commits ahead you can use rebase to add local changes on top. Here is detailed workflow:

git fetch origin  # get fresh version of origin master
git rebase origin/master  #  merge origin/master into your curr branch and add local changes on top
# IF CONFLICTS:
# reslove conflicts & git add
git rebase --continue

Git general workflow:

git pull
git checkout -b BRANCH_NAME
// do your work...
git commit
git checkout master
git merge BRANCH_NAME
git push

“Github” workflow (i.e. creating pull-request):

git pull
git checkout -b BRANCH_NAME
// do your work...
git commit
git push origin BRANCH_NAME

The main difference between general git workflow and github workflow is that on github you (should) always create pull-request. So after you push your branch to remote origin (line 5) you go to this github repository select your new branch and click on that green button “New pull request” (see Image 1).

Image 1: Creating pull request
Image 1: Creating pull request

 

Very useful command is also `revert`. If you already merged your branch into master (which is protected) and you wish to “undo” you can do the folowing.

git revert SHA

SHA is the branch ID that you wish to undo. You can read more about undoing, fixing, etc here: link

NOTE: there are probably a lot more things you should know so I strongly suggest that you use “uncle Google” 🙂 (also there are several great YouTube videos you can watch if you are an absolute beginner).

 

Reset tree to original commit and use rebase not merge:

git reset --hard d27dce5129715f3c32aed376eeca348d142f5398 # initial commit
git fetch -p
git rebase origin/master
# fix merge conflicts (this is not merge, wording is a bit confusing)
git rebase --continue
git cherry-pick dac0848faf4219058b59dce8deb80084ade74828 # Update alembic script down_revision. fix merge conflicts (this is not merge, wording is a bit confusing) etc 
git push...

 

Force “git pull” to overwrite local files:

git fetch --all
git reset --hard origin/<branch_name>

git fetch fetch downloads the latest from remote without trying to merge or rebase anything.

Then the git reset  resets the master branch to what you just fetched. The  --hard option changes all the files in your working tree to match the files in origin/master (Source: link)

 

Changing the timestamp of a previous Git commit:

git filter-branch --env-filter \
"if test \$GIT_COMMIT = '06387f3c078f9f36dc4074d90550eb0b11013607'
then
    export GIT_AUTHOR_DATE='Thu Apr 5 19:54:26 2018 +0200'
    export GIT_COMMITTER_DATE='Thu Apr 5 19:54:26 2018 +0200'
fi" && rm -fr "$(git rev-parse --git-dir)/refs/original/"

 

Some additional reading:

  • A really good post about git rebase: link

Leave a Reply

Your email address will not be published. Required fields are marked *