# Git version Control

## Basic and Git Configuration

* version : `git --version`
* git directory \[ Linux ] : `which git`

### Setting your user name and email :

* You need to set who you are _before_ creating any commit. That will allow commits to have the right author name and email associated to them.

```
$ git config --global user.name "Your Name"
$ git config --global user.email mail@example.com
```

* Remove a global identity :

```
$ git config --global --remove-section user.name
$ git config --global --remove-section user.email
```

### Basic Commands

* Create an empty Git repository:
  * `git init` . This creates a hidden folder, .git , which contains the plumbing needed for Git to work.
* Check status : `git status`
* Adding files to staging area :
  * `git add <directory/filename>` \[ for single file ]
  * `git add .` **or** `git add --all` \[ for all changed files ]
* Commit all files :
  * `git commit` \[this opens your Git's default code editor]
* To commit files with short message :
  * `git commit -m "commit msg"`
* To add the remote location of git :
  * `git remote add origin https://<your-git-service-address>/owner/repository.git`
* Cloning a Repo :
  * `git clone https://github.com/username/projectname.git`
* To specify a different name of the directory, example `MyFolder` :
  * `git clone https://github.com/username/projectname.git MyFolder`
* To clone in current directory :
  * `git clone https://github.com/username/projectname.git .`
* To push your code to upstream :
  * `git push --set-upstream origin main` or `git push origin`
* Check the remote names:
  * `git remote -v`
* To get help about any command :
  * `git <command> --help`
* Create alias commands :
  * `git config --global alias.mylog "log --decorate --oneline --graph"`
  * To run : `git mylog`

**To see the last two commit, becoz revert doesnt delete the faulty commit, it roles back head while keeping the fault.**

## Logging

* To view log :
  * `git log`
  * `git log --stat` \[ for detailed view ]
* To view log more beautifully :
  * `git log --decorate --oneline --graph`
* To see commit using commit id
  * `git show <commit id>`

## Working with Remote Repositories

* List remote location :
  * `git remote -v`
* If a remote branch has been deleted, your local repository has to be told to prune the reference to it
  * `git fetch [remote-name] --prune`
* Updating from Upstream Repository

```
git fetch remote-name
git merge remote-name/branch-name
```

* The pull command combines a fetch and a merge : `git pull`
* `git pull --rebase remote-name branch-name`
* Syntax for pushing to a remote branch :
  * `git push <remote_name> <branch_name>`
* Rename remote :
  * `git remote rename origin destination`

## Diff & Patch

![Git cheat sheet](https://473782116-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MlTUR0kU-pvc2XyvuDJ%2Fsync%2Ff2336d43102febec63267cfc29ee33aa949a5959.png?generation=1633672991708574\&alt=media)

### Patch

* In order to patch the changes
  * `patch code1.js < change.diff`

### Logging details about commits

* To commit all files without going through git add
  * `git commit -a -m "commit message"`
* To get more details about the project
  * `git log -p`
* to see patch file to another commit, we use commit id
  * `git show b09ddf8a0000055f50386f1aa938f4b8a7b43b0c`
* to get stats about your commits
  * `git log --stat`
* to see details while adding
  * `git add -p`
* to see details on last n commit (example of 2)
  * `git log -p -2`

## File Management

* to rename file that is being tracked by git
  * `git mv old_file_name new_file_name`
* to delete a file use :
  * `git rm file_to_be_delete`
* to revert change of a file, use :
* `git checkout file_name`
* to remove a file from being tracked by git, use :
  * `git reset HEAD file_name`
* to change the commit msg/ or to overwrite last commit:
  * `git commit --amend`
* to revert HEAD :
  * `git revert HEAD`
* to see details on last n commit (example of 2)
  * `git log -p -2`

## Rebase

Rebase is a way in which you put all commits of a branch and add in on top of another branch ( assuming no conflicts ).

* Command, execute this from branch to which is added on top, specify the brach on which in the command
  * `git rebase [branch name to rebase onto]`

<figure><img src="https://473782116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlTUR0kU-pvc2XyvuDJ%2Fuploads%2FSKq9vRJjEj5QGjv1dtQr%2Fgit%20rebase.png?alt=media&#x26;token=2cb6a8e6-dd2c-4d7b-b776-728c042f1f98" alt=""><figcaption><p>git rebase diagram</p></figcaption></figure>

## Stash

* to save to stash
  * `git stash save "stash message"`
* to list stashes
  * `git stash list`
* to bring back to stash
  * `git stash apply stash@{0}`
* to remove the top stash
  * `git stash pop`

## Cherry Pick

<figure><img src="https://473782116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlTUR0kU-pvc2XyvuDJ%2Fuploads%2Fn9CR0Ze0h2BtiUeTD12c%2Fgit%20cherry%20pick.jpg?alt=media&#x26;token=f5105482-780f-4880-ab56-66c7aeac368a" alt=""><figcaption><p>git cherry pick</p></figcaption></figure>

To pick one commit from another branch and then place it on top of another branch

```
# to cherry pick
$ git cherry-pick @commit-id

# to cherry pick but without commiting the changes
$ git cherry-pick @commit-id -n
```
