ファイル自体は残してインデックスから消す
$ git rm --cached <file_name>
ファイルも消す
$ git rm <file_name>
新規作成・編集ファイルをaddする(削除ファイルはaddされない)
$ git add .
編集ファイルのみaddする
$ git add -u
新規・編集・削除すべてaddする
$ git add -A [--all]
変更箇所単位でaddする(コミットとして分割できるものを一度にやっちゃった時などに)
- addするものはy
- addしないものはn
$ git add -p <ファイル>
変更内容を確認しながらコミットする
$ git commit -v
同じブランチの直前のコミットを修正する
- 直前のコミット漏れしたファイルを後から追加するときに
- 直前のコミットメッセージを修正するときに
$ git commit --amend
or
$ git add <ファイル名>
$ git commit -v
$ git rebase -i HEAD~ // pick → fixup
ワーキングツリーはそのままでインデックスとコミットをリセット(デフォルト: mixed
)
- インデックスを元に戻したい(
add
とコミットをなかったことにしたい)とき - 結果:
add
した内容が消える → それが困るなら--soft
を付ける!
$ git reset <[HEAD | HEAD^]>
ワーキングツリーもインデックスもそのままでコミットだけリセット
- コミットだけをなかったことにしたいとき
- 結果: コミットの位置が変わる → それが困るなら戻す先
HEAD
にする!
$ git reset --soft <[HEAD | HEAD^]>
ワーキングツリー、インデックス、コミットの全てをリセット
- ファイルの変更自体を完全になかったことにしたいとき
- 結果: ファイルの中身が戻る → それが困るならやらない!
$ git reset --hard <[HEAD | HEAD^]>
reset
前の状態に戻す
$ git reset [option] ORIG_HEAD
コミットしていない変更を一時的に退避
$ git stash save
or
$ git add <ファイル名>
$ git commit -v
$ git reset --hard HEAD~ // 戻す時のためにcommit_idをメモっておく
stashした作業の一覧を見る
$ git stash list
stashしたファイルの一覧を見る
$ git stash show <stash名>
変更内容付きで一覧を見る
$ git stash show <stash名> -p
stashを戻す→コンフリクトが発生したら直す
$ git stash apply <stash名>
or
$ git rebase -i HEAD~ // pick <resetしたcommit_id>
stashした一覧から消す
$ git stash drop <消したいstash名>
戻すと削除を同時に行う→コンフリクトが発生したら直す
$ git stash pop <stash名>
復活した変更を取り消す
$ git stash show <適用したstash名> -p | git apply -R
これまでコミットしたメッセージをすべて表示
$ git log
--stat
各コミットエントリに続けて、変更されたファイルの一覧・ファイル数、追加削除された行数が表示される
--shortstat
--statのうち、変更/追加/削除の業のみ表示
--name-only
ファイル名のみ
ログ出力形式を設定する
$ git log --pretty=oneline
--pretty
ログ出力形式を設定
=oneline → 各コミットを一行で表示
$ git log --pretty=format:"%h - %an, %ar : %s"
=format → 独自のログ出力フォーマットを指定
$ git log --pretty=format:"%h %s" --graph --since=2.week
--graph --author=hoge
グラフの表示
--since, --until, -before, -after
ログ出力対象期間を設定
="2008-01-15"
絶対日時指定
=2 years 1 day 3 minutes ago
相対日時指定
これまでコミットしたメッセージと変更点をすべて表示
$ git log -p
これまでコミットしたメッセージを最近の10件まで表示
$ git log -10
コミットの書き換え、入れ替え、削除、統合
push
する前にコミットメッセージをきれいに書き直すときに- 意味的に同じ内容のコミットをわかりやすいように一つにまとめるときに
- コミット漏れしたファイルを後から追加するときに
$ git rebase -i <commit_id>
rebase
でコミットをまとめる
$ git rebase -i <[HEAD^ | HEAD^^]>
↓
指定した範囲のコミットがエディタで開く
↓
まとめたいコミットの``pick``を``squash``に変更して保存
rebase
でコミットを修正する
$ git rebase -i <[HEAD^ | HEAD^^]>
↓
指定した範囲のコミットがエディタで開く
↓
修正したいコミットの``pick``を``edit``に変更して保存
↓
ファイルを変更
↓
$ git commit -a --amend
↓
$ git rebase --continue
↓
修正したコミット以降のコミットと競合が発生する場合は、ファイルを修正
↓
$ git add . // コミットはしちゃダメ!!
$ git rebase --continue
rebase
の作業をなかったことにして中止する
$ git rebase --abort
別のブランチのコミットをコピーして現在のブランチに取り込む
- ブランチを間違えて追加したコミットを正しい場所に移すときに
- 別のブランチのコミットを現在のブランチにも追加するときに
rebase
だと都合が悪いときに
$ git cherry-pick <commit_id>
↓
競合が発生する場合は、ファイルを修正
↓
$ git commit -a
or
$ git rebase -i HEAD~ // pick <commit_id> を追加
cherry-pick
をキャンセルする
$ git cherry-pick --abort
過去の状態の復元(ハードリセットで操作を消しちゃったときに)
$ git reflog
zzzzzz HEAD@{0}: reset: moving to <commit>
yyyyyy HEAD@{1}: foo
xxxxxx HEAD@{2}: hoge
$ git reset --hard HEAD@{1}
コミットを打ち消すコミットを追加する
- 過去に公開したコミット(つまり
master
マージ後)をバグ発生などで打ち消したいときに - 打ち消したいコミットは消えずに残る
$ git revert <[HEAD | HEAD^]>
ブランチの作成
$ git branch <branch_name>
ブランチの一覧を表示
$ git branch
リモートのブランチも表示
$ git branch -a
ブランチのチェックアウト(切り替え)
$ git checkout <branch_name>
ブランチの作成とチェックアウトを同時に
$ git checkout -b <branch_name>
マージ先のブランチにチェックアウトしてからマージ
$ git checkout master
$ git merge <from_merge>
「分岐」してないブランチをマージ(HEADの位置が先に進むだけのマージ)では、Fast-fowardになる。Fast-fowardではマージコミットが作られない。Fast-fowardしたくない(マージコミットを作る)場合:
$ git merge --no-ff <from_merge>
マージでの衝突(コンフリクト)を回避
$ git merge <from_merge>
Auto-merging <file_name>
CONFLICT (content): Merge conflict in <file_name>
Automatic merge failed; fix conflicts and then commit the result.
↓
該当ファイルを修正
↓
$ git add .
$ git commit
履歴を一本化(リベース)してマージ
$ git checkout <from_merge>
Switched to branch '<from_merge>'
$ git rebase master
...
...
↓
該当ファイルを修正
↓
$ git rebase --continue
Applying: [commit message]
$ git checkout master
$ git merge <from_merge>
別のブランチのコミットを一つにまとめてマージ
$ git checkout master
Switched to branch 'master'
$ git merge --squash <from_branch>
↓
競合が発生する場合は、該当ファイルを修正
↓
$ git add <file_name>
$ git commit
ブランチの名称変更
$ git branch -m <old_branch> <new_branch>
ブランチの削除
$ git branch -d <branch_name>
リモートブランチのリセット
$ git push -f <repo> <commit>:<branch>
リモートブランチの削除
$ git push <repo> :<branch>
- リモートリポジトリの内容を自動的にマージ → マージしたくないときは
fetch
- 競合がなければ、単にfast-forwardマージ
- 競合があれば、それを解決してから自分でコミットする
pull
は、内部でfetch
+merge
をしている
$ git pull
- 単にリモートリポジトリの内容を確認したいだけ(マージしない)に
- 取得したコミットは、名前の無いブランチ
FETCH_HEAD
として取り込まれる - リモートリポジトリの内容をローカルリポジトリに統合する場合は、
FETCH_HEAD
をマージするか、改めてpull
を実行 pull
は、内部でfetch
+merge
をしている
$ git fetch
リモートリポジトリ名指定でコミットを取得
$ git fetch <repo_name>
すべてのリモートリポジトリからコミットを取得
$ git fetch --all
リモートリポジトリのブランチ名指定でローカルブランチ名を付けて取得
$ git fetch git://example.com/rep.git <remote_branch>:<local_branch>
- ローカルからリモートに
push
するときは、push
したブランチがfast-forwardマージされるようにしておく - 競合が発生する場合は、
push
が拒否される
$ git push <remote_branch> <local_branch>
リモートリポジトリをローカルに複製
- gitがoriginという名前でリモートリポジトリを登録してくれる
$ git clone <repo_url>
リモートリポジトリを追加
$ git remote add <repo_name (eg: origin)> <repo_url>
登録されているリモートリポジトリの確認
$ git remote -v
リモートリポジトリURLの編集
$ git remote set-url <repo_name (eg: origin)> <repo_url>
リモートリポジトリの削除
$ git remote rm <repo_name (eg: origin)>
リモートリポジトリに存在するブランチやコミットをローカルに複製する
$ git fetch <repo_name (eg: origin)>
リモートリポジトリに存在するブランチはgit clone
したときに「リモートブランチ」としてコピーされる。リモートブランチに直接コミットはできないため、リモートブランチを追跡するブランチを作成する。
- あるリモートブランチを追跡するブランチを新たに作成する
$ git branch <branch (eg: develop)> <remote_branch (eg: origin/develop)>
- すでに存在するブランチでリモートブランチを追跡する
$ git branch --set-upstream-to=<remote_branch (eg: origin/develop)> <branch (eg: develop)>
- コミットを参照しやすくするために、分かりやすい名前をつけるもの
- 一度付けたタグは固定、移動したい場合は一度削除してから改めて付ける
ローカルで一時的に使用する使い捨てなどに
- 名前が付けられる
$ git tag <tag_name>
リリース(バージョン)タグなどに
- 名前が付けられる
- コメントが付けられる
- 署名が付けられる
$ git tag -am "<comment>" <tag_name>
タグの削除
$ git tag -d <tag_name>
タグの一覧を見る
$ git tag
タグの一覧とコメントを見る
$ git tag -n
タグ情報を含めてログを見る
$ git log --decorate