A worked walkthrough of the core git workflow — init, add, commit, diff, reset, gitignore, and push to a remote. If you’re new to git or want to understand what’s actually happening at each step, this goes through the full local-to-remote cycle with actual output at each command.
-
Assuming git is installed on your machine, else please install it from here Git Scm
-
Please open git-bash
-
Let us start with an empty directory
1
2
| $ mkdir git_tutorial
$ cd git_tutorial
|
- Add a file in that directory
1
2
3
| $ touch a_file
$ ls
a_file
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| $ git init
Initialized empty Git repository in /Users/rahul.chandna/git_tutorial/.git/
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
a_file
nothing added to commit but untracked files present (use "git add" to track)
|
- Add which means to “Stage” files locally
1
2
3
4
5
6
7
8
9
10
| $ git add a_file
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: a_file
|
1
2
3
4
5
6
7
8
| $ # staged
$ git commit -m "initial commit"
[master (root-commit) 002d6e8] initial commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a_file
$ git status
On branch master
nothing to commit, working tree clean
|
- add changes to file locally
1
2
3
4
5
6
7
8
9
10
| $ echo "first line" > a_file
$ git status
On branch master
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: a_file
no changes added to commit (use "git add" and/or "git commit -a")
|
- view changes in file and add/stage it locally
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $ git diff a_file
$ git add a_file
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a_file
$ git commit -m "added first line to the file"
[master d71d315] added first line to the file
1 file changed, 1 insertion(+)
$ git status
On branch master
nothing to commit, working tree clean
|
- view the git history of commits
- add more changes to file locally, view difference and commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| $ echo "second line" >> a_file
$ git status
On branch master
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: a_file
no changes added to commit (use "git add" and/or "git commit -a")
$ git diff a_file
$ git add a_file
$ git commit -m "added second line to the file"
[master 3be860e] added second line to the file
1 file changed, 1 insertion(+)
$ git status
On branch master
nothing to commit, working tree clean
|
- add a temporary file which we do not want to add to git
1
2
3
4
5
6
7
8
9
| $ touch temp_file
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
temp_file
nothing added to commit but untracked files present (use "git add" to track)
|
- Use concept of .gitignore to automatically ignore the temp file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| $ touch .gitignore
$ echo "temp_file" > .gitignore
# now git will automatically ignore the temp_file
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
nothing added to commit but untracked files present (use "git add" to track)
$ git add .gitignore
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: .gitignore
$ git commit -m "added git ignore file to skip adding of temp files"
[master d692bef] added git ignore file to skip adding of temp files
1 file changed, 1 insertion(+)
create mode 100644 .gitignore
$ git status
On branch master
nothing to commit, working tree clean
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| $ touch b_file
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
b_file
nothing added to commit but untracked files present (use "git add" to track)
$ git add b_file
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: b_file
|
- add a new file called c_file which we do not want to stage but we will do that to show how to fix the issue
1
2
3
4
5
6
7
8
9
| $ touch c_file
$ git add c_file
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: b_file
new file: c_file
|
- use git reset to remove c_file from staged commits
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| $ git reset HEAD c_file
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: b_file
Untracked files:
(use "git add <file>..." to include in what will be committed)
c_file
$ git commit -m "added b_file"
[master a05a255] added b_file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 b_file
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
c_file
nothing added to commit but untracked files present (use "git add" to track)
|
- add a new file called c_file which we do not want to stage or commit, but this time we will add and commit do that to show how to fix the issue
1
2
3
4
5
6
7
8
9
| $ git add c_file
$ git commit -m "adding c_file to commit by mistake"
[master d65f80c] adding c_file to commit by mistake
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 c_file
$ git status
On branch master
nothing to commit, working tree clean
|
- Use git log to get the commit hash for the file comitted before c_file, use that to revert to the last “correct” commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| $ git log
# Use the commit hash that happened before c_file was added and revert to that version
$ git reset --soft a05a25501e0fae3f35d30bb7d3a9ff4bd27d1169
$ git log
# git status will show that c_file is staged but not comitted
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: c_file
|
- Now unstage c_file so that it is not added to git any more, thereby reversing the git add and commit process.
1
2
3
4
5
6
7
8
9
| $ git reset HEAD c_file
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
c_file
nothing added to commit but untracked files present (use "git add" to track)
|
- Now goto git hub or gitlab and create an empty repository, the repository will show you it URl, copy that and link your local repository to remote repository
1
| $ git remote add origin ssh://git@<YOUR_SERVER OR GITHUB>/Rahul.Chandna/git-training.git
|
- Now push all locally comitted changes to remote repository
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| $ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
c_file
nothing added to commit but untracked files present (use "git add" to track)
$ git push -u origin master
Enumerating objects: 14, done.
Counting objects: 100% (14/14), done.
Delta compression using up to 8 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (14/14), 1.16 KiB | 595.00 KiB/s, done.
Total 14 (delta 1), reused 0 (delta 0)
To ssh://<YOUR_SERVER OR GITHUB>/Rahul.Chandna/git-training.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
c_file
nothing added to commit but untracked files present (use "git add" to track)
|
- Now go back to the remote reposity and add a file there using the web interface
This is to mimick colaborative work where your collegeue could have edited existing files or added a new file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| $ # Now add a file direclty on remote via browser
$ # Now let us use git fetch to see what all changes have been done on remote so far
$ git fetch
$ # Once done use the below command to see the name of local and remote
$ git branch -a
$ # use the output of above command to see differences between local and remote
$ git diff master..remotes/origin/master
$ # once happy pull changes from remote to local
$ git pull
Updating a05a255..6a71596
Fast-forward
bla | 1 +
1 file changed, 1 insertion(+)
create mode 100644 bla
$ # since all changes are on local you will see running the command again will not show any differences
$ git diff master..remotes/origin/master
|