Cheat Sheet

init

% cd /path/to/git/project
% git init

% ls -a
. .. .git

config

% git config user.name "Foo Bar"
% git config user.email "foo@example.net"
% git config -l
...

add

% touch a.txt
% touch b.txt
% git add .
% git status -s
A  a.txt
A  b.txt

% touch c.txt
% rm a.txt
% git status -s
AD a.txt
A  b.txt
?? c.txt

The -u option removes as well as modifies index entries to match the working tree, but adds no new files.

% git add -u .
% git status -s
A  b.txt
?? c.txt

To add, modifiy and remove them, use the -A option.

% rm b.txt
% git add -A .
% git status -s
A  c.txt

rm

% git rm /path/to/file
% git rm -r /path/to/dir/

The following is an one-liner to remove index entries that start with ^.D as tracking status. (i.e. Each file tracked by the index entries has already been removed without using git-rm.)

% git status -s | grep ^'.D' | awk '{print $2}' | xargs git rm

remote

% git remote -v
origin  ssh://gitolite-server/foo.git (fetch)
origin  ssh://gitolite-server/foo.git (push)

% git remote set-url origin ssh://gitolite-server/bar.git
% git remote -v
origin  ssh://gitolite-server/bar.git (fetch)
origin  ssh://gitolite-server/bar.git (push)

% git remote remove origin
% git remote add origin ssh://codecommit-user/v1/repos/sandbox

commit

# コミット候補を追加
% git add a.txt
# add 時点の状態でコミットされる
% git commit

% vi a.txt
....
# 更新をコミットする場合も add してコミット候補に含める
% git add a.txt
% git commit

# -a オプションで作業ファイルの状態でコミットできる
# 全ての追跡対象ファイルを add したのち commit することと同義
% git commit -a

# reset author
% git config user.name "Foo Bar"
% git config user.email "foo@example.net"
% git commit --amend --reset-author

# commit with empty message
% git commit -a --allow-empty-message -m ''

clean

カレントディレクトリ以下の追跡対象外のファイルを削除します。

# 未追跡ファイル/ディレクトリを確認
% git clean -nd
# 未追跡ファイル/ディレクトリを削除
% git clean -fd
# x オプションで .gitignore 対象も含めることができます
% git clean -ndx
% git clean -fdx

tag

バージョンのタグについては -a オプションで注釈つきでタグをつける方法を推奨します。

 % git tag -a v1.0 -m "version 1.0"

コミットへのポインタのみのタグを作成することもできます。作業時など単に特定リビジョンをマークしたい場合に便利です。

% git tag 20120123-01

リモートリポジトリにはタグは送信されません。タグを push する必要があります。

# タグ v1.0 をリモート origin に送信
% git push origin v1.0

# ローカルリポジトリの全てのタグを origin に送信
% git push origin --tags

log

ログのフォーマットを指定することができます。

% git log --pretty="format:%h %s"

# フォーマットについての詳細はマニュアルを参照
% man git-log

show

git show (リビジョン):(ファイル名) で特定リビジョンのファイルを表示できます。

# ひとつ前のコミットの ./README.md を表示
% git show HEAD^:./README.md
# コミット deadbeef.... の ./README.md を表示
% git show deadbeef:./README.md

diff

git diff 作業ファイルと索引の差分 = コミットされない差分。ステージし忘れている差分を確認
git diff --cached 索引とHEADの差分 = コミットされる差分。コミットし忘れている差分を確認
git diff HEAD 作業ファイルとHEADの差分。`git commit -a` でコミットされる差分を確認

fetch

To download objects and references from another repository, use the command git fetch <remote>.

% git fetch origin

# The remote "origin" will be used, when no remote is specified.
% git fetch

By default, the command won’t remove any references that no longer exist on the remote. To prune them, use the -p --prune option.

% git fetch -p

branch

# 現在のブランチを確認
% git branch
    * master

# current ブランチを作成
% git branch current
% git branch
  current
    * master

# current ブランチに切替
% git checkout current
% git branch
    * current
  master

....

# master ブランチにマージされていないブランチを確認
% git checkout master
% git branch --no-merge
  current
# master / current ブランチの差分を確認
% git diff master..curent
....
# master ブランチに current ブランチをマージ
% git merge current
....
# master ブランチにマージされているブランチを確認
% git branch --merged
  current
    * master

# current ブランチを削除
% git branch -d current

Working with Remote Repositories

# List remote-tracking repositories with the verbose option.
% git remote -v
origin  git@github.com:foo/bar.git (fetch)
origin  git@github.com:foo/bar.git (push)

# List both remote-tracking branches and local branches.
% git branch -a
    * master
  remotes/origin/master

#
# リモートブランチの更新を、作業ブランチへ反映
#
#  1. リモート origin の変更を取得
#
#     git fetch
#     git fetch (リモート名)
#
% git fetch origin
....
#  2. fetch したリモート origin の最新と比較
% git diff FETCH_HEAD
....
#  3. リモート origin の master ブランチを、作業ブランチにマージ
% git merge origin/master
....
#  4. pull で fetch + merge をまとめて行うこともできる
% git pull

#
# 作業ブランチの更新を、リモートブランチへ反映
#
#  1. 作業ブランチの変更を commit
....
% git commit
....
#
#  2. master ブランチをリモート origin へ反映
#
#      git push (リモート名) (ブランチ名)
#      git push (リモート名) (ローカルブランチ名):(リモートブランチ名)
#
% git push origin master

# リモート origin/development をローカルブランチ development としてチェックアウト
% git checkout -b development origin/development

# リモートブランチ origin/development を削除
# 空のローカルブランチでリモートブランチ development を更新と考えると覚えやすい
% git push origin :development

History

To reset authorship information, use git-rebase with the option -i. The following is an example to modify last 2 commits.

% git rebase -i HEAD~2
pick b234567  Do something
pick a123456  Do something at last

# Rebase ....
#
# Commands:
#  p, pick = use commit
...
#  e, edit = use commit, but stop for amending
...

Replace pick at each line with edit and then quit the editor.

edit b234567  Do something
edit a123456  Do something at last
...
:q

You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

Repeat running the commands commit --amend --reset-author and rebase --continue alternately.

% git commit --amend --reset-author
% git rebase --continue
% git commit --amend --reset-author
% git rebase --continue
Successfully rebased and updated refs/heads/...

You can also use filter-branch to reset all commits.

% git filter-branch --commit-filter '
GIT_AUTHOR_NAME="Foo Bar"
GIT_AUTHOR_EMAIL="foo@example.net"
git commit-tree "$@"
' HEAD

Merging a Pull Request Manually

# Fork the repository "sandbox" made by Alice
% git remote add upstream http://github.com/alice/sandbox.git
% git pull upstream master
% git checkout -b hotfix
% git commit
% git push origin hotfix

# Merge the pull request sent by Bob
% git remote add bob http://github.com/bob/sandbox.git
% git fetch bob
% git checkout -b bob-hotfix bob/hotfix
% git checkout master
% git merge --no-ff hotfix
% git push origin master