What is Git?
Title Text
which means...
(almost) everything is local
everything is fast
every clone is a backup
work offline
How Git works?
Snapshot 1
Commit
Takes snapshot of your current work state
Snapshot 1
Commit
Commit
Snapshot 2
Snapshot 1
Commit 1
cd3 - sha
Snapshot 2
Commit 2
bc9 - sha
Uniquely Identify a work state
Install Git
$ sudo apt-get install git
Boom! You are ready to go
git init
- Initializes a git repository at current directory
- Starting point of git history and version control
- Creates and fills .git folder
Next Steps
Set config
Set name
$ git config --global user.name "Ankur Garg"
Set email
$ git config --global core.editor "vim"
Set editor
$ git config --global user.email "ankurgarg101@gmail.com"
Check config
$ git config --global --edit
Check status
$ git status
git add
Add a file to staging area
$ git add .
Adds all file in repo to staging area
$ git add filename
Adds mentioned file to staging area
The path to commit
git commit
Creates a snapshot of staged files
$ git commit -m 'Describe what you changed here, this is called commit message'
Amend commit
Change the previous commit description or content if changes are not pushed
$ git commit --amend
git diff
Shows modifications made with respect to previous snapshot/commit
$ git diff
git log
Shows summary of previous snapshots
$ git log
HEAD
HEAD refers to the current snapshot/commit
So HEAD is a pointer that points to snapshot we are at in repository
HEAD^
Refers to previous commit
HEAD~n
n is an integer and this refers to nth last commit
$ git log
commit 19f2a02d7caa83824dd774133e301a516cd0cd24
Author: Ankur Garg <ankurgarg101@gmail.com>
Date: Wed Jan 28 14:16:40 2015 +0530
Edits config
commit 51cd5f0a7cd9183a7b56958b1e400b495f103ffc
Author: Ankur Garg <ankurgarg101@gmail.com>
Date: Wed Jan 28 14:16:15 2015 +0530
Add main helper
commit 00d06580e52a54376c68440fbbfce5e09e35e81c
Author: Ankur Garg <ankurgarg101@gmail.com>
Date: Wed Jan 28 13:47:33 2015 +0530
Add index.md
Edits config - HEAD
Add main helper - HEAD^
Add index.md - HEAD~2
git reset
Dangerous!
$ git reset --mixed HEAD
Restores current state of project to a desired state
Unstage files from index and reset pointer to HEAD
$ git reset --soft HEAD
Moves HEAD to specified commit reference, index and staging are untouched
$ git reset --hard HEAD
Removes all changes and reset pointer to HEAD
git reset
$ git status -s
M README
M hello.rb
$ git add .
$ git status -s
M README
M hello.rb
$ git reset HEAD -- hello.rb
Unstaged changes after reset:
M hello.rb
$ git status -s
M README
M hello.rb
git reset --soft
$ git status -s
M hello.rb
$ git commit -am 'hello with a flower'
[master 5857ac1] hello with a flower
1 files changed, 3 insertions(+), 1 deletions(-)
$ git status
# On branch master
nothing to commit (working directory clean)
$ git reset --soft HEAD~
$ git status -s
M hello.rb
git reset --hard
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: README
#
$ git reset --hard HEAD
HEAD is now at 5857ac1 hello with a flower
$ git status
# On branch master
nothing to commit (working directory clean)
git branch
Shows the list of branches
master is the default branch in a new repo
git branch branchname
Creates a branch with specified branchname
git checkout branchname
Shifts to specified branch
git checkout -b branchname
Creates and checkouts a branch
git merge
Merges two branches into each other
git rebase
Forwards commits of a branch to head?
$ git checkout master
$ git rebase branchname
Suppose there were 3 commits originally A, B and C:
Then developer Santa created commit D, and developer Banta created commit E:
Obviously, this conflict should be resolved somehow. For this, there are 2 ways:
Merge
Rebase
We create commit R, in which actual file content is identical to that of merge commit M above. But, we get rid of commit E, like it never existed. So simply HEAD is moved forward to include E in R
When do you need branches?
-
Try out an idea
-
Issue fixes
-
Adding a feature
-
Collaborating with others
Remotes
These are copies of a repo somewhere on internet
Remotes
Default remote is named as origin by git
git clone
Used to get a local copy of repository from a remote
$ git clone git@github.com:sdsmdg/cognizance.git
$ git clone http://github.com/sdsmdg/cognizance.git
Can use various protocols like SSH, HTTP to clone
git fetch
Gets latest commits from a remote
(Default to origin)
$ git fetch
$ git fetch remote_name
Can use various protocols like SSH, HTTP to clone
git pull
Get latest commits from a remote and merge them into current branch
(Defaults to origin)
$ git pull
Updating 853a38b..30eb5d8
Fast-forward
config/config.php | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
$ git pull remote_name
git push
Push your commits to a remote. Commits must be in straight line from the latest commit at server
(Defaults to origin and current branch)
$ git push
Counting objects: 25, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (25/25), done.
Writing objects: 100% (25/25), 2.43 KiB, done.
Total 25 (delta 4), reused 0 (delta 0)
To git@github.com:ankurgarg101/muzi-android.git
* master -> master
$ git push remote_name branch_name
push rejections
Sometimes when your local repo is not in sync with remote, remote will reject your push. So always pull before push and solve any merge conflicts
$ git push origin master
To git@git.sdslabs.co.in:muzi.git
! [rejected] origin/master -> origin/master (non-fast-forward)
error: failed to push some refs to 'git@git.sdslabs.co.in:muzi.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
$ git pull
Updating 853a38b..30eb5d8
Fast-forward
config/config.php | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
$ git push
Updated origin/master -> origin/master
git remote
Used to handle various remotes
$ git remote -v
$ git remote add remotename some_url_here
List all remotes
Adds a remote
$ git clone git@git.sdslabs.co.in:muzi
Cloning into 'muzi'...
remote: Counting objects: 10058, done.
remote: Compressing objects: 100% (4088/4088), done.
remote: Total 10058 (delta 6184), reused 9482 (delta 5739)
Receiving objects: 100% (10058/10058), 28.49 MiB | 3.04 MiB/s, done.
Resolving deltas: 100% (6184/6184), done.
Checking connectivity... done.
$ ls
muzi
$ cd muzi
$ ls
admin ajax api.php chrome config css docs favicon.ico Gruntfile.js images js layout.html node_modules
package.json readme.mkd requests.php schema social stats swf tests vendor widget zune
$ git remote -v
origin git@git.sdslabs.co.in:muzi (fetch)
origin git@git.sdslabs.co.in:muzi (push)
$ git remote add gh git@github.com:apsdehal/muzi.git
$ git remote -v
gh git@github.com:apsdehal/muzi.git (fetch)
gh git@github.com:apsdehal/muzi.git (push)
origin git@git.sdslabs.co.in:muzi (fetch)
origin git@git.sdslabs.co.in:muzi (push)
Resources
git init
git clone
git add
git commit
git branch
git checkout
git remote
git merge
git rebase
git fetch
git pull
git log
git diff
git push
14
Git lecture
By Ankur Garg
Git lecture
- 1,057