Git Basics In Nutshell
Tags: github, git
Published: 2022-05-22 12:22:12


# What is Git ?

- Git is a version control system (VCS). It **runs locally** in the environment.

- A **free of cost ASSISTANT**, to manage and solve the problem that we discussed.

- It **tracks the changes** that we make to our files. 

- It **takes a snapshot of the moment** when we make changes to our file(s), which can be recalled at any time.

- Online Hosting Platforms: GitHub, GitLab, BitBucket, etc.

## Git Installation

In order to understand Git first, you need to install it.

Best way is to search "Install Git" on Google and follow the first link to download it.

![download-git.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653209152482/EfHpbU2wa.png)

Choose your Operating System and download accordingly and then proceed with the installation.


![download-OS-specific-GIT.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653209161225/LboXy6nZS.png)

Once you have successfully downloaded it, two of these options should be available to you:

![options_git-bash-git-gui.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653209173259/gL1tB6tFR.png)



1. **Git Bash**
   
    Git Bash is CLI (Command Line Interface).

2. **Git GUI**

    Git GUI is, as the name suggests, Graphical User Interface.

Note: This is the example of Windows 10. For MAC or Linux, options would be different but you should be easily able to find them out with little research.


## Git - Initial Configuration
Once you have installed the Git, you need to configure your username and email into it. This is an important step because whenever you take a *snapshot* of your files or I can say, whenever you commit changes to your files, your name and email are bound to those changes as we will see those changes in the logs in the article.

### Configuration Syntax

`git config --global user.name <username>`

`git config --global user.email <email>`

### Configuration Example
`git config --global user.name 'Shameel Uddin'`

`git config --global user.email 'shameel@hasabtech.com'`

### Checking Configuration
`git config --get user.name`

`git config --get user.email`

`git config --list`

## Git - Initialization 

Please note that, at this stage, consider 'folder', 'directory' and 'repository' the name to the same thing.

Right now, you can understand that Folders are used in Windows, Directories are used in Linux and the name for the same thing is used as Repository in Git.

### Git Bash (CLI) 

Open Git Bash in the folder/directory you are present in and enter following command:

`git init`

You will get the following output:

`Initialized empty Git repository in <folder/directory>`


### Git GUI
Open Git GUI in the folder/directory you are present in and perform following operations:

![git-gui-initialization.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653209253052/77yS1dp22.png)


### .git
In both cases, you should see a folder/directory like this:

![.git.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653209260297/XuY0K8VSt.png)

## Working Directory

Consider 'working directory' the place where you are working right now.

There is one more concept of 'branch' in Git but you don't have to worry much about it.

Just remember that branch exists; you are always in a branch when you are working.

Default branch is 'main'; your default branch is your default working directory.


## States of Files in Working Directory

Every file in the working directory has 2 states:
- Untracked
- Tracked
  - Unmodified
  - Modified
  - Staged

Git only cares about Tracked files and leave untracked files out of its jurisdictions.

Unmodified means that the files are not changed at all.
Modified file means that the files have been changed
Staged means that the files are ready for the 'snapshot' to be taken. OR, the files are ready for next commit.

Following image should help you understand the relation in a better way:

![tracked-files-states.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653209409222/KrrqoDI2A.png)


## Complete Workflow


![complete-workflow.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653209280263/ZXQF_i3a2.png)

As per the diagram above, unmodified and modified files exists in working directory.

You can "SELECT" which of the files you want in your staging area with `git add`.

In order to take a snapshot, or to commit it, you can execute `git commit`.

When you execute `git commit` so the changes are committed and stored in `.git` repository.

## Adding and Removing Files from Staging Area

### Adding Files
`git add`

To add single file, run `git add <filename>`
To add all files, run `git add .`

If you are aware of wildcard masks, then you can use to select multiple files of your choice.

### Removing Files
`git reset HEAD --`

To remove single file, run:

`git reset HEAD -- <filename>`


To remove all files, run 

`git reset HEAD -- .`

If you are aware of wildcard masks, then you can use to select multiple files of your choice.

## Status of Files
`git status`

This command shows the current state of the working directory and staging area. 

It tells which changes have been staged, which haven’t, which files are yet to be committed, and which files are not being tracked by git. 


## Committing Changes
`git commit`

This command is used to save the changes you made to a file to .git folder. 

It’s like a checkpoint, which you can go back to if needed.  

This is like a 'save' option in a game where you can choose to go back whenever you want.

Simple command is this:

`git commit –m “message in quotes” `

However, it is advised to write detailed commit messages for better understanding in future.

if you write:
`git commit`
then a text editor, by default **VIM** is opened where you can make changes.

## Changing Default Editor

VIM is difficult for beginners to use, especially, if you do not have any Linux/Unix exposure.

So, it is better to change it to some other editor, like VScode.

Following command changes the editor to VScode:

`git config --global core.editor "code --wait"`


## Checking Logs
`git log`

It shows the logs and history of all of your commits that you make throughout your journey.


![git-log.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653209397879/claN9GpD-.png)


The history works in reverse order with latest to oldest commit.

As you can see, your **username** and **email** that you configured initially are bound to your commits.

Try out the following commands:

`git log --<after/before/since/until>=<date>`

`git log --<author>="Author Name"`


# Git Commands in a Nutshell

### Configuring username and email

`git config --global user.name ‘Shameel Uddin’`

`git config --global user.email ‘shameel@hasabtech.com’`

`git log --oneline`

### Initializing Repository

`git init`


### Adding Files in Staging Area

`git add`

### Removing Files in Staging Area

`git reset HEAD --`

### Committing

`git commit`

### Checking Current Status

`git status`

### Checking Logs

`git log`


>** Next we will be discussing about GitHub. Stay tuned. :)**