Skip to content

Instantly share code, notes, and snippets.

@konitter
Last active December 17, 2015 01:39
Show Gist options
  • Save konitter/5529950 to your computer and use it in GitHub Desktop.
Save konitter/5529950 to your computer and use it in GitHub Desktop.
Git Study Note

Git Study Note

ファイル

ファイル自体は残してインデックスから消す

$ 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 <ファイル>

commit

変更内容を確認しながらコミットする

$ 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

stash

コミットしていない変更を一時的に退避

$ 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

log

これまでコミットしたメッセージをすべて表示

$ 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>

リモートリポジトリ

pull

  • リモートリポジトリの内容を自動的にマージ → マージしたくないときはfetch
  • 競合がなければ、単にfast-forwardマージ
  • 競合があれば、それを解決してから自分でコミットする
  • pullは、内部でfetch + mergeをしている
$ git pull

fetch

  • 単にリモートリポジトリの内容を確認したいだけ(マージしない)に
  • 取得したコミットは、名前の無いブランチ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するときは、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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment