# Git Usage

Summary of common Git commands and syntax, documentation, and recommended reading to gain a general understanding of Git usage.

## 0. Common commands and syntax:

[**INIT**](https://git-scm.com/docs/git-init)ialize a new empty local repository \[in the `<target-directory>`\], and add the [**REMOTE**](https://git-scm.com/docs/git-remote) tracked repository:
- `git init [<target-directory>]`
- `git remote add <remote-name> <remote-repository>`

Or [**CLONE**](https://git-scm.com/docs/git-clone) a `<remote-repository>` \[checking out a specific `<branch>` other than `master`\] \[into the `<target-directory>`\]:
- `git clone [-b <branch>] <remote-repository> [<target-directory>]`

[**CONFIG**](https://git-scm.com/docs/git-config)ure a name and email address:
- `git config [--local|--global] user.name "UserName"`
- `git config [--local|--global] user.email "00000000+UserName@users.noreply.github.com"`

List existing [**BRANCH**](https://git-scm.com/docs/git-branch)es, \[including those in the remote repository\]:
- `git branch [-a]`

[**CHECKOUT**](https://git-scm.com/docs/git-checkout) or switch the working copy to a `<branch>`:
- `git checkout <branch>`

List existing [**REMOTE**](https://git-scm.com/docs/git-remote) tracked repositories:
- `git remote`

[**FETCH**](https://git-scm.com/docs/git-fetch) updates to the current branch from the remote repository, without merging:
- `git fetch`

[**PULL**](https://git-scm.com/docs/git-pull) updates to the current branch from the remote repository, merging new commits into the working copy:
- `git pull`

[**ADD**](https://git-scm.com/docs/git-add) all new/modified files and stage them to be committed:
- `git add -A`

[**ADD**](https://git-scm.com/docs/git-add) specific new/modified files and stage them to be committed:
- `git add <file> [<file>...]`

[**MOVE**](https://git-scm.com/docs/git-mv) (or rename) a `<file>` to a `<new-file>`:
- `git mv <file> <new-file>`

[**REMOVE**](https://git-scm.com/docs/git-rm) (delete) a `<file>`:
- `git rm <file>`

Recursively [**REMOVE**](https://git-scm.com/docs/git-rm) (delete) a `<directory>`:
- `git rm -r <directory>`

Check the [**STATUS**](https://git-scm.com/docs/git-status) of the working copy:
- `git status`

[**DIFF**](https://git-scm.com/docs/git-diff) \[staged\] changes \[to a specific `<file>`\]:
- `git diff [--staged] [<file>]`

[**COMMIT**](https://git-scm.com/docs/git-commit) staged changes:
- `git commit -m "summary" [-m "details"]`

Show commit [**LOG**](https://git-scm.com/docs/git-log)s:

- `git log`

[**TAG**](https://git-scm.com/docs/git-tag) the working copy, using the specified `<tag-name>`:
- `git tag -a <tag-name> -m "message"`

[**PUSH**](https://git-scm.com/docs/git-push) commits on the current branch to the remote repository:
- `git push`

Create a [**BRANCH**](https://git-scm.com/docs/git-checkout) of the working copy, using the specified `<branch-name>`:
- `git branch <branch-name>`
- `git checkout <branch-name>`
- `git push --set-upstream origin <branch-name>`

[**MERGE**](https://git-scm.com/docs/git-merge) the `<source-branch>` into the `<destination-branch>`:
- `git checkout <source-branch>`
- `git pull`
- `git checkout <destination-branch>`
- `git merge --no-commit <source-branch>`
- `git commit -m "message"`
- `git push`

## 1. Version control basics: [About Version Control](https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control)

## 2. Git basics: [Git Basics](https://git-scm.com/book/en/v2/Getting-Started-Git-Basics)

## 3. [Getting a Git Repository](https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository)

### Initialize a new empty repository (https://git-scm.com/docs/git-init):
```
git init [<target-directory>]
```

### Clone an existing remote repository to work on it locally (https://git-scm.com/docs/git-clone):
```
git clone [--verbose] [--branch <branch-name>] <remote-repository-url> [<target-directory>]
git clone [-v]        [-b       <branch-name>] <remote-repository-url> [<target-directory>]
```
- If `--branch` is omitted and `--no-checkout|-n` is not specified, the default branch (typically `master`) will be checked out automatically.
- If no `--origin` is specified, the remote repository will be tracked using the default name of `origin`.
- If `<target-directory>` is omitted, a new directory with the name of the remote repository will be created within the current working directory.

### Configure a username and email address (https://git-scm.com/docs/git-config):
```
git config [--local|--global] user.name "UserName"
git config [--local|--global] user.email "00000000+UserName@users.noreply.github.com"
```
- Tip: use `--global` to use the same account on all your repositories, or `--local` to use a specific account on just this repository.

### List available branches in the repository (https://git-scm.com/docs/git-branch):
```
git branch [--verbose [--verbose]] [--list] [--all]
git branch [-v|-vv]                         [-a]
```
- If `--all` is omitted, only local branches will be shown.

### Check out a branch to work on locally (https://git-scm.com/docs/git-checkout):
```
git checkout <branch-name>
```

## 4. Pulling and pushing remote repositories: [Working with Remotes](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes)

### Show remote tracked repositories (https://git-scm.com/docs/git-remote):
```
git remote [--verbose] [show]
git remote [-v]        [show]
```

### Add a remote tracked repository (https://git-scm.com/docs/git-remote):
```
git remote add <remote-name> <remote-repository>
```
- The remote repository will be tracked using the specified `<remote-name>` (typically `origin`).

### Fetch updates from the remote repository without merging them into your local working copy (https://git-scm.com/docs/git-fetch):
```
git fetch [--verbose] [<remote-repository> [<branch>]]
git fetch [-v]        [<remote-repository> [<branch>]]
```
- If `<branch>` is omitted, the currently-checked-out branch will be fetched.
- If `<remote-repository>` is omitted, the currently-configured remote repository (usually tracked by the name `origin`) will be pulled from.

### Pull updates from the remote repository and merge them into your local working copy (https://git-scm.com/docs/git-pull):
```
git pull [--verbose] [<remote-repository> [<branch>]]
git pull [-v]
```
- If `<branch>` is omitted, the currently-checked-out branch will be pulled and merged.
- If `<remote-repository>` is omitted, the currently-configured remote repository (usually tracked by the name `origin`) will be pulled from.

### Push committed changes on the current branch from your local working copy to the remote repository (https://git-scm.com/docs/git-push):
```
git push [--verbose] [<remote-repository> [<branch>]]
git push [-v]
```
- If `<branch>` is omitted, the currently-checked-out branch will be pushed.
- If `<remote-repository>` is omitted, the currently-configured remote repository (usually tracked by the name `origin`) will be pushed to.

## 5. Adding, moving, removing, ignoring, diffing, staging and committing files in your local repository: [Recording Changes to the Repository](https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository)

### Ignore files (https://git-scm.com/docs/gitignore):
Add path-specs to `.gitignore` file.

### Stage new/changed files to be committed (https://git-scm.com/docs/git-add):
```
git add [--verbose] <path-spec> [<path-spec>...]
git add [-v]        <path-spec> [<path-spec>...]
```

### Stage *all* new/changed files within the repository directory and subdirectories (https://git-scm.com/docs/git-add):
```
git add [--verbose] --all
git add [-v]        -A
```

### Move/rename a file (https://git-scm.com/docs/git-mv):
```
git mv [--verbose] <source-file> <destination-file>
git mv [-v]        <source-file> <destination-file>
```

### Remove/delete a file (https://git-scm.com/docs/git-rm):
```
git rm <file>
```

### Recursively remove/delete a directory (https://git-scm.com/docs/git-rm):
```
git rm -r <directory>
```

### Show the current status of added/modified/moved/renamed/removed/staged files (https://git-scm.com/docs/git-status):
```
git status
```
- If the `--verbose` or `-v` option is added, it will show a diff of staged files.

### Show modifications to files (https://git-scm.com/docs/git-diff):
```
git diff [--staged|--cached] [<file>]
```
- If `--staged` and `--cached` are omitted, only the differences for un-staged files will be shown.
- If `--staged` or `--cached` is specified, only the differences for staged files will be shown.
- If `<file>` is omitted, the differences for *all* files will be shown (according to whether `--staged|cached` is specified).

### Commit staged files to the local repository (https://git-scm.com/docs/git-commit):
```
git commit [--verbose] --message="summary" [--message="details"]
git commit [-v]        -m "summary"        [-m "details]
```

### Show commit logs (https://git-scm.com/docs/git-log):

```
git log
```

## 6. [Tagging](https://git-scm.com/book/en/v2/Git-Basics-Tagging)

### Create a tag of the current code in the currently-checked-out branch (https://git-scm.com/docs/git-tag):
```
git tag [--annotate] <tagname> [<checksum>] [--message="tag message"]
git tag [-a]         <tagname> [<checksum>] [-m "tag message"]
```

- Specify part of the checksum to tag a specific previous commit.
- Omit both `-a` and `-m` to create a *lightweight* tag instead of an *annotated* tag.

## 7. Branching: [Branches in a Nutshell](https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell)

### Create a branch from the current code in the currently-checked-out branch (https://git-scm.com/docs/git-branch):
```
git branch [--verbose [--verbose]] <branch-name>
git branch [-v|-vv]                <branch-name>
```

### List available branches in the repository (https://git-scm.com/docs/git-branch):
```
git branch [--verbose [--verbose]] [--list] [--all]
git branch [-v|-vv]                         [-a]
```
- If `--all` is omitted, only local branches will be shown.

### Check out a branch to work on locally (https://git-scm.com/docs/git-checkout):
```
git checkout <branch-name>
```

## 8. Merging: [Basic Branching and Merging](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging)

### Check out the *source* branch (https://git-scm.com/docs/git-checkout):
**NOTE:** The source branch must exist *locally*, so the simplest way to do that is to check it out.
```
git checkout <source-branch>
```

### Make sure the source branch is up to date (https://git-scm.com/docs/git-pull):
```
git pull [--verbose] [<remote-repository> [<branch>]]
git pull [-v]
```
- If `<branch>` is omitted, the currently-checked-out branch will be pulled and merged.
- If `<remote-repository>` is omitted, the currently-configured remote repository (usually tracked by the name `origin`) will be pulled from.

### Check out the *destination* branch, into which the merge will be made (https://git-scm.com/docs/git-checkout):
```
git checkout <destination-branch>
```

### Merge the source branch into the currently-checked-out working code (https://git-scm.com/docs/git-merge):
```
git merge [--verbose] [--no-commit|-m "message"] <source-branch>
git merge [-v]        [--no-commit|-m "message"] <source-branch>
```
- If `--no-commit` is omitted, the merge will be automatically committed if successful.

### Show the current status of added/modified/moved/renamed/removed/staged files (https://git-scm.com/docs/git-status):
```
git status
```
- If the `--verbose|-v` option is added, it will show a diff of staged files.

### Show modifications to files (https://git-scm.com/docs/git-diff):
```
git diff [--staged|cached] [<file>]
```
- If `--staged` and `--cached` are omitted, only the differences for un-staged files will be shown.
- If `--staged` or `--cached` is specified, only the differences for staged files will be shown.
- If `<file>` is omitted, the differences for *all* files will be shown (according to whether `--staged|cached` is specified).

### Commit staged files to the local repository (https://git-scm.com/docs/git-commit):
```
git commit [--verbose] --message="commit message"
git commit [-v]        -m "commit message"
```

### Push committed changes on the current branch from your local working copy to the remote repository (https://git-scm.com/docs/git-push):
```
git push [--verbose] [<remote-repository> [<destination-branch>]]
git push [-v]
```
- If `<destination-branch>` is omitted, the currently-checked-out branch will be pushed.
- If `<remote-repository>` is omitted, the currently-configured remote repository (usually tracked by the name `origin`) will be pushed to.