Github

This is a collection of important notes gathered throughout working on various projects and contributing to Open-Source repositories.

Git #

Squashing multiple commits into one. #

When you have multiple commits in a branch, you can 'squash' them into a single one.

1. Use git rebase to generate a new commit, for example (if you have 2 previous commits)

git rebase --interactive HEAD\~2

This opens up the last 2 commits in your editor (probably vim)

2. In the editor, replace 'pick' with 'squash' for all except the first commits. (At this point you will have a commit with a long commit message)

3. Change commit message with the following command.

git commit --amend

This opens up vim again, where you can update the commit message

Reference: [link](https://www.internalpointers.com/post/squash-commits-into-one-git)

Making local master exactly same as origin #

git fetch origin
git reset --hard origin/master

However DO NOT hard reset when on a separate branch. If so, do a reflog to view the commit before the 'reset', and hard reset into that commit.

git reflog

Then find the commit hash and reset.

git reset --hard <commit-hash>

Or, better way to update local master, rebase:

git fetch
git pull --rebase origin master

or

git fetch
git rebase origin/master

Git rebase vs Git merge #

Git rebase, carries all the commits of a feature branch and puts it infront of master when you use the commands:

git checkout feature-branch
git rebase master

puts all the commits in the feature branch infront of master.

While when you merge a master branch like so:

git checkout feature-branch
git merge master

You are adding changes from the master branch to the feature branch, and you will need a new commit for the merged changes.

Keep in mind that, merge is a non-destructive command while rebase is a destructive command.

More info on this link(https://www.atlassian.com/git/tutorials/merging-vs-rebasing)

What is origin/master? #

origin/master is the local copy of branch 'master' on remote named 'origin'

Example:

git fetch origin master

Or

git fetch

This command copies the 'master' branch from 'origin' and the local copy will be named origin/master

So git fetch basically updates local copy (in this case origin/master).

If you need to force push a sub-module/sub-repository into your own git #

git rm -rf --cached path/to/submodule 
git add path/to/submodule/. 

Source: https://stackoverflow.com/questions/40921904/force-adding-submodule-contents-in-git