Gitコマンドメモ

# Gitのコマンドメモ
「独習 Git」の内容がよくまとまっていて分かりやすかったので、備忘録として一覧化。

## Gitメモ
* コミットされる順番
    * 作業エリア→ステージングエリア→コミット履歴
* ローカルとリモート
    * ローカルに別フォルダを作成しその場所をリモートとすることも可能。
    * ベアレポジトリには作業エリアがない。通常はベアレポジトリをクローンして使う。
    * `HEAD`:現在のブランチを指しているポインタ。通常は最後のコミットを指すが、別のコミットポイントを指すことも可能。
    * `master`:デフォルトのブランチ名。嫌なら消してしまうことも可能
    * `origin`:レポジトリが指しているリモートの呼び名。嫌なら別の名前に変更可能。


## 全体操作、最初にやること
|コマンド|内容|補足|
|:-------|:---|:---|
| git config --global alias.ll "log --graph..." |git llという別名定義
| git init | ディレクトリをGitのレポジトリとする |


## 基本の作業
|コマンド|内容|補足|
|:-------|:---|:---|
| git status | レポジトリの状態チェック|
| git add ファイル | ファイルをステージングエリアに登録|
| git add --dry-run . |どう動くか試す|
| git commit -m "commit message" | レポジトリに登録されたファイルをコミット |

## レポジトリの調査
|コマンド|内容|補足|
|:-------|:---|:---|
| git ls-files | レポジトリに入っているファイルのリスト
## 履歴の調査

|コマンド|内容|補足|
|:--|:--|:--|
| git log | コミット履歴の表示||
| git log --oneline | １行でヒストリ表示 |
| git log --oneline ファイル | 特定のファイルのヒストリ表示|
| git log --shortstat --oneline | 変更になったファイル数の情報のみ。履歴をコミット毎に１行表示|
| git log --parents --abbrev-commit | 親コミットSHA IDの短縮表示|
| git log --patch | 個々のコミットの差分表示 |
| git log --stat | 個々のコミットの間で変更されたファイルの概要表示 |
| git log -1 | git log -n 1 と同じ。最新のコミットだけを表示
| git log --merges | マージの結果であるコミットのリストを表示
| git log --grep=STRING | コミットメッセージがSTRINGを含んでいるコミットのリストを表示
| git log --graph --decorate --pretty=oneline -all --abbrev-commit | レポジトリの履歴を全てのブランチ含めてグラフィカルに表示|
| git log --stat HEAD^..HEAD | 現在のコミットと、その親の間にあるコミット（と、そのファイル）のリスト
| git log --patch HEAD^..HEAD | 現在のコミットと、その親の間にあるコミット（と、テキストの変更）のリスト



## 差分調査

|コマンド|内容|補足|
|:-------|:---|:---|
| git diff | 作業エリアとステージングの差分|新規作成だと表示されないらしい
| git diff --staged |コミット履歴とステージングエリアの差分|
| git grep STRING | STRINGを含む、全てのファイルを探し出す

## ファイルの変更・削除

|コマンド|内容|補足|
|:-------|:---|:---|
| git rm ファイル | ファイルを**ステージングエリア**から削除|
| git mv ファイル1 ファイル2 | **ステージングエリア**のファイル名変更|
| git reset ファイル | **ステージングエリア**をリセット。作業エリアは変更なし。ファイルをコミット予定から外す。
| git checkout -- ファイル |最後に`コミットしたバージョン`をレポジトリから取り出し作業エリアに入れる。作業エリアの変更を廃止する。|ステージングエリアに登録済みの場合は無効|


## タグ・ブランチの操作
Git2.23から`git branch`の代わりに`git switch`と`git restore`が使える。

|コマンド|内容|補足|
|:--|:--|:--|
| git tag | タグのリスト出力
| git branch | ブランチのリスト表示
| git branch BRANCH | BRANCHというブランチを作成|このブランチはHEADと同じコミットを指す
| git rev-parse HEAD| ブランチのHEADをSHA1_IDに変換する |
| git tag | タグの一覧を表示
| git show TAG_NAME | TAG_NAMEというタグ名の情報表示
| git tag TAG_NAME -m "message" YOUR_SHA1_ID | YOUR_SHA1_IDにTAG_NAMEを割り当てる|
| git checkout BRANCH_NAME | 作業エリアをBRANCHE_NAMEに変更する|
| git checkout YOUR_SHA1_ID |SHA1IDで指定したバージョンを作業エリアにチェックアウトする|
| git branch -d master | masterという名前のブランチを削除する|
| git branch -v |全てのブランチのリストをSHA1 IDを付与して表示|
| git branch YOUR_BRANCH_NAME YOUR_SHA1_ID |YOUR_SHA1_IDを開始地点として、ブランチYOUR_BRANCH_NAMEを作成する
| git reflog |これまでに(git checkoutによって）行ったブランチ切り替えの全ての記録を表示

## Stash操作

|コマンド|内容|補足|
|:--|:--|:--|
| git stash | 作業中の作業エリア（WIP)をスタッシュに入れgit checkoutを可能とする
| git stash list |スタッシュに対比させたWIPのリストを表示
| git stash pop | 最後にスタッシュに入れた内容を作業エリアに反映させスタッシュから消去する

## ブランチのマージ

|コマンド|内容|補足|
|:--|:--|:--|
| git diff BRANCH1...BRANCH2 | BRANCH1とBRANCH2の差分表示|
| git merge BRANCH2 | BRANCH2を現在の（カレント）ブランチにマージする
| git merge --abort | ２つの競合するブランチ間のマージを中止する
| git merge-base BRANCH1 BRANCH2 | BRANCH1とBRANCH2に共通するベースコミットを表示|

## クローン作成

|コマンド|内容|補足|
|:--|:--|:--|
| git clone SRC DEST_DIR | SRCにあるGitリポジトリのクローンをDEST_DIRに作る
| git log --oneline --all | 全てのブランチからすべてのコミットログエントリを表示する|通常のgit logは、カレントブランチからのエントリだけを表示
| git branch --all |ローカルブランチだけでなく、リモート追跡ブランチも表示する
| git clone --bare SRC DEST_DIR | SRCにあるGitリポジトリのクローンをDEST_DIRにベアリポジトリとして作る| DEST_DIRは、規約に従って.gitで終わるようにするのがベター|
| git ls-tree HEAD | HEAD(カレントブランチ）の全てのファイルを表示|

## リモートとの共同作業

|コマンド|内容|補足|
|:--|:--|:--|
| git init --bare remote.git | remote.gitという名前のベアリポジトリを作成
| git checkout -f master | masterブランチをチェックアウト。現在のブランチに変更がある場合は破棄
| git remote | 現在のリポジトリにあるリモートを表示
| git remote -v show | リモートの名前を、対応する利ノートURLと一緒に表示
| git remote add hoge ../test.hoge | hogeという名前のリモートを追加する。そのリモートは、ローカルリポジトリ../test.hogeを指し示す|よくわからん。。。
| git ls-remote REMOTE | ローカルリポジトリREMOTEのリファレンスを表示。
| GIT_TRACE_PACKET=1 get ls-remote REMOTE | リモートとのネットワーク通信の内容を表示

## 変更をプッシュ

|コマンド|内容|補足|
|:--|:--|:--|
| git push origin master | masterブランチをoriginという名前のリモートにプッシュする
| git push | 現在のブランチを、デフォルトのリモート追跡ブランチにプッシュする。デフォルトはgit checkoutまたはgit push --set-upstreamにより設定される。
| git push --set-upstream origin new_branch | originという名前のリモートにあるnew_branchへのリモート追跡ブランチを作成する | 意味不明
| git config --get-regexp branch | 名前にbranchという言葉が含まれているGit構成設定のリストを表示
| git branch -d localbranch |localbranchという名前のローカルブランチを削除する
| git push origin :remotebranch | remotebranchという名前のリモートブランチを、originという名前のリモートから削除する | 削除するの？
| git tag -a TAG_NAME -m TAG_MESSAGE SHA1_ID | SHA1_IDにタグをつける。タグ名にTAG_NAME、メッセージはTAG_MESSAGE
| git push origin TAGNAME | TAGNAMEという名前のタグを、originという名前のリモートにプッシュする
| git push --tags | 全てのタグをデフォルトのリモートにプッシュする
| git push origin :TAGNAME | originという名前のリモートから、TAGNAMEという名前のタグを削除する
| git tag -d TAGNAME| ローカルリポジトリから、TAGNAMEという名前のタグを削除する

## 同期を保つ（プル）

|コマンド|内容|補足|
|:--|:--|:--|
| git pull | リポジトリを複製元（上流リポジトリ）と同期 | get fetchとgit mergeの２つで構成
| git fetch | リモートリポジトリから新しいコミットが取り込まれ、リモート追跡ブランチが更新される
| git merge FETCH_HEAD | FETCH_HEADからの新しいコミットを、カレントブランチにマージする
| git pull --ff-only | --ff-onlyスイッチを指定すると、FETCH_HEADがカレントブランチの子孫である場合に限り、マージが許可される（fast-forwardマージ)

## git rebaseの理解
|コマンド|内容|補足|
|:--|:--|:--|
| git log --oneline master..new_feature | masterブランチの先で、new_featureブランチまでにあるコミットを表示
| git rebase master | masterの最新コミットをカレントブランチにリベースする
| git reflog | reflog(HEADの変更をすべて記録した内部履歴）を表示
| git reset --hard HEAD@{n} | HEAD@{n}によって表現されるSHA1　IDを指し示すように、HEADをリセット。１ーーはrdスイッチは、ステージングエリアと作業ディレクトリの両方をリセットする。
| git rebase --interactive master | masterの最新コミットをカレントブランチに対話処理でリベースする。エディタが開き、どのコミットをリベースに含めるかの取捨選択が可能となる。
| git cherry-pick SHA1ID | 指定のコミットをカレントブランチにコピーする

## GitHub(やその仲間たち)との連携

|コマンド|内容|補足|
|:--|:--|:--|
| git remoet add mygit https://[URL]/sample.git |GitHubにあるリポジトリ(sample.git)を指すmygitという名前のリモートを追加する。
| git push -u mygit master |masterブランチをmygitリポジトリにプッシュする。-uをつけると次回以降もそれを上流とする。|
| git clone https://[URL]/sample.git |GitHubにあるsampleという名前のリポジトリを複製する

## GitのConfig色々

|コマンド|内容|補足|
|:--|:--|:--|
| git config --local --list | ローカル（リポジトリ固有の）Git構成をリストで表示
| git config --global --list | グローバル（ユーザ固有の）Git構成をリストで表示
| git config --system --list | システム（サーバ全体の）Git構成をリストで表示
| git config --local --edit | ローカル（リポジトリ）Git構成を編集する
| git config --global --edit | グリーバル（ユーザ）Git構成を編集する
| git config --system --edit | システム（サーバ）Git構成を編集する