Git

NOTE

[ ] means that it can be omitted.

Setup

git config --global user.name "my name"
git config --global user.email "my-address@goes.here"
git config --global core.editor "notepad++"
git config --list

git config --global -e # to use specific editor

cat ~/.gitconfig

4 Areas

  • Working Directory
  • Staging Area
  • Repository (.git folder)
  • Remote

Basics

Words

  • HEAD means last commit.

Add

git add . # all files under current directory
git add -A # all files
git add -u # all files except new files (u = update)

git add . --dry-run # pre test

Commit

git commit -m "commit message"
git commit -am "commit message" # add & commit at same time

List tracked files

git ls-files

Unstage

git reset [HEAD]
git reset [HEAD] somefile.txt

Discard changes

git checkout [--] somefile.txt

Move files

git mv file1.txt file2.txt

the difference between mv andgit move is that git mv automatically stages files.

Delete files

git rm file1.txt

Show logs

git log --all --oneline --graph --decorate
git log f8vk34...1ffai8
git log somefile.txt
git log --follow somefile.txt # follow rename

git show fi8vd2

Alias

git config --global alias.h "log --oneline"
git h # => equiv with "git log --oneline"

or edit .gitconfig directly.

Merge & Diff tools

git config --global merge.tool p4merge
git config --global mergetool.p4merge.path "C:/Program Files/Perforce/p4merge.exe"

git config --global diff.tool p4merge
git config --global difftool.p4merge.path "C:/Program Files/Perforce/p4merge.exe"

Compare

All followning diffs can be replaced with difftool

HEAD vs Working directory

git diff

HEAD vs Staging area

git diff --staged
#or
git diff --cached

HEAD vs All changes(staged & unstaged)

git diff HEAD

HEAD vs Specific commit

git diff fj38v87 [HEAD]
git diff HEAD^ [HEAD]

Note that args should be lined old commit first. Otherwise result will be opposite.

Between specific commits

git diff fj38v87 ow8vjq3

Between branches

git diff mainbranch topicbranch

Local vs Remote

git diff origin/remoteBranchName localBranchName

Branch & Marge

Show branch

git branch -a # show remote & local branch

Create branch

git branch somename
git checkout -b somename # create branch & checkout

Rename branch

git branch -m some_name some_new_name

Delete branch

git branch -d somename
git branch -D somename # delete unmerged branch

Merge branch (Fast-Forward)

git merge somebranch

Merge branch (Non Fast-Forward)

git merge --no-ff somebranch
git merge --no-ff somebranch -m "commit message"

Resolving conflicts

git merge somebranch
git mergetool
git commit -m "this is merge commit message"

.orig file (backup file) may be created when resolving conflicts. remove or ignore it.

Remote Branch

# ローカルブランチをリモートにプッシュ
git push origin some_localbranch:remote_branch
git push -u origin some_localbranch:remote_branch # 設定を記憶しておく

git branch -v # ブランチ一覧
git branch -vv # ブランチ一覧(リモートとの対応つき)

Rebase

from local branch

git checkout -b myfeature
git rebase master
git mergetool # if there is conflicts, fix it
git rebase --continue
git rebase --abort # cancel rebasing

from remote branch

git fetch origin/master
git checkout master
git rebase origin/master

# or

git pull --rebase origin master

Stash

git stash [save "this is stash message"]
git stash -u # include new file (u = untracked)
git stash list
git stash show [stash@{0}]
git stash apply [stash@{0}]
git stash drop # delete most recent stash
git stash drop [stash@{0}]
git stash clear # delete all stash
git stash pop [stash@{0}] # apply & drop at a time

git stash branch newbranchname
# Create a new branch with name `newbranchname`
# Checkout to new branch
# Apply & drop a stash

Tag

Tags can be used as params.

git diff mytag HEAD

Lightweight tag

git tag mytag
git tag mytag 870f3c
git tag mytag 870f3c -f # force to move tag point
git tag --list
git tag --delete mytag

Annotated tag

Annotated tag has Tagger(author), date&time, tag message. Rest is same as lightweight tag.

git tag -a v-1.0
git show v-1.0

push tags to remote

git push origin master --tags # transfer all tag
git push origin :mytag # delete tag

Reflog

git reflog
git reset 357vef9 # back to this reflog

submodule

  • 親リポジトリ内で、別のリポジトリを子として管理するときに使う
  • .gitmodulesに、submodule の一覧が記録される
  • submodule のバージョンはコミットハッシュ(特定のバージョン)で管理されている。
  • 親リポジトリをcheckoutした際など submodule の参照先コミットハッシュが変わったときは、submodule を手動でアップデートする必要がある。
git submodule add ${REPO_URL} ${TARGET_DIR}

# submoduleが参照しているコミットハッシュの一覧を表示する
git submodule

# submoduleが参照しているコミットハッシュが変わったときは
# 手動でsubmoduleを更新する必要がある
git submodule update

参考資料