Common Git Command Line Operation
Tags: git, shell
Published: 2022-12-31 11:07:24

This article record the specific usage method of some common git command line operation
<!-- more -->

### [git clone](https://git-scm.com/docs/git-clone)

- `git clone REPOSITORY_URL`
  Clone repository, and use the name of repository as local folder name

- `git clone REPOSITORY_URL FOLDER`
  Clone repository, and use FOLDER as local folder name

### [git fetch](http://git-scm.com/docs/git-fetch)

- `git fetch origin`
  Update all the remote branch

- `git fetch origin BRACH`
  Update designated remote branch 

### [git pull](http://git-scm.com/docs/git-pull)

- `git pull origin`
  Equivalent to `fetch` + `merge` coresponding upstream branch

- `git pull origin BRACH`
  Pull designated branch to current branch

- `git pull origin --rebase master`
  Make local branch rebase remote master branch

### [git push](http://git-scm.com/docs/git-push)

- `git push origin`
  Push branch to coresponding remote upstream branch

- `git push origin BRANCH`
  Push branch to remote designated branch

- `git push --set-upstream origin BRANCH`
  Push branch to remote designated branch, and make it as upstream branch (generally need to be used for pushing branch of your own for the first time)

- `git push -f origin`
  Force push branch to corresponding remote upstream branch (will override remote branch, need to be used carefully)

- `git push origin -d BRANCH`
  Delete remote branch

### [git branch](http://git-scm.com/docs/git-branch)

- `git branch`
  List all local branch

- `git branch -a`
  List all local and remote branch

- `git branch -m NEW_BRANCH`
  Rename current branch

- `git branch -d BRANCH`
  Delete merged branch

- `git branch -D BRANCH`
  Force delete branch (even if not be merged yet)

### [git checkout](http://git-scm.com/docs/git-checkout)

- `git checkout BRANCH`
  Switch to designated branch

- `git checkout -b NEW_BRANCH`
  Create new branch

- `git checkout -b NEW_BRANCH BRANCH`
  Create new branch based on BRANCH

- `git checkout SHA-1`
  Switch to a commit, or use HEAD~N (N as 1, 2, 3...) to switch to previous Nth commit

- `git checkout SHA-1 /PATH/TO/FILE`
  Restore file to designated commit version

- `git checkout --theirs /PATH/TO/FILE`
  Use theirs' file version in case of conflict

- `git checkout --ours /PATH/TO/FILE`
  Use ours' file version in case of conflict

- `git checkout -`
  Switch to previous branch, suitable for switching frequently between two branches

### [git add](http://git-scm.com/docs/git-add)

- `git add .`
  Mark all added / modified / deleted files as to-be-committed

- `git add /PATH/TO/FILE`
  Mark a single file as to-be-committed, suitable for situation when there're other modified files which don't need to be committed

### [git commit](http://git-scm.com/docs/git-commit)

- `git commit`
  Commit files marked by `git add`

- `git commit -a`
  Commit modified / deleted files (if there's newly added file, need to use `git add` to mark firstly)

- `git commit -am "MESSAGE"`
  Commit modified / deleted files and assign comment (suitable for temporary or simple comment content)

- `git commit --amend`
  Update last commit, can add `-a` or run `git add` firstly to append updated files

- `git commit --amend --reset-author`
  Default updating commit won't change author, can explicitly config if necessary

### [git cherry-pick](http://git-scm.com/docs/git-cherry-pick)

- `git cherry-pick SHA-1`
  Apply a commit to current branch

### [git status](http://git-scm.com/docs/git-status)

- `git status`
  Check current status

### [git diff](http://git-scm.com/docs/git-diff)

- `git diff`
  Updating contents of current modified files which has not been marked as to-be-committed

- `git diff --cache`
  Updating contents of current modified files which has been marked as to-be-committed

- `git diff /PATH/TO/FILE`
  Updating contents of designated file, and can also be distinguished with `--cache`

### [git log](http://git-scm.com/docs/git-log)

- `git log`
  Show all logs in detail

- `git log -n 10`
  Show latest 10 logs

- `git log --oneline`
  Show all logs briefly

- `git log --oneline master ^BRANCH | wc -l`
  Compute how much commit differences between BRANCH and master

### [git stash](http://git-scm.com/docs/git-stash)

- `git stash`
  Stash modified / deleted files, and the added files marked as to-be-committed

- `git stash -u`
  Stash modified / deleted / added files, which means the added files is included without using `git add`

- `git stash pop`
  Pop the stashed files

### [git revert](http://git-scm.com/docs/git-revert)

- `git revert SHA-1`
  Cancel a commit by forming a new commit 

- `git revert SHA-1 -m 1`
  If the to-be-reverted commit is a merged one, need to designate which parent commit to be reverted to
  For example, if the merged commit is merging from BRANCH_2 to BRANCH_1, and you want to revert to BRANCH_1, then m should be 1 (it's the most cases)

### [git reset](http://git-scm.com/docs/git-reset)

- `git reset`
  Cancel marking for to-be-committed files (equivalent to withdrawing `git add`)

- `git reset --hard`
  Cancel updating for modified / deleted files and added files marked as to-be-committed

- `git reset SHA-1`
  Cancel all the commits after SHA-1, but retain updates of the committed files
  If want to just cancel last commit, SHA-1 can be set as `HEAD^`

- `git reset --hard SHA-1`
  Cancel all the commits after SHA-1, and don't retain updates of the committed files

### [git rebase](http://git-scm.com/docs/git-rebase)

- `git rebase BRANCH`
  Make current branch rebase BRANCH

- `git rebase -i SHA-1`
  Update commits after SHA-1, can `pick/p`, `edit/e`, `drop/d`, `squash/s` corresponding commits
  If the first commit used with `p`, and the following commit used with `s`, then multiple commits will join into a single commit

### [git merge](http://git-scm.com/docs/git-merge)

- `git merge BRANCH`
  Merge BRANCH into current branch, try not to form merged commit

- `git merge --no-ff BRANCH`
  Merge BRANCH into current branch, and make sure to form merged commit

- `git merge --squash BRANCH`
  Make the differences between BRANCH and the current branch as to-be-committed contents, need to run `git commit` to complete merging with only one commit

### [git update-index](http://git-scm.com/docs/git-update-index)

- `git update-index --assume-unchanged /PATH/TO/FILE`
  When a file is modified temporary, but don't want to be committed, and not suitable to be added to `.gitignore`, can use this command to make `git` don't recognize it as modified
  Cannot use this command if the file is newly added, but can add the file path to `.git/info/exclude`

- `git update-index --no-assume-unchanged /PATH/TO/FILE`
  Recover modified recognition for the designated file