gitのcommandをまとめてみた。

## リポジトリと
データを共有するリモートリポジトリと、各自が作業するローカルリポジトリが存在します。
![スクリーンショット 2022-08-27 5.57.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/e7d31a37-5366-c1a2-b582-36fc5c93f1e7.png)
ローカルリポジトリは、作業するワーキングエリア、作業した内容を一時保存するステージングエリアがあり、ステージングしたものをcommitすることでローカルのリポジトリに保存することができます。その変更を共有リポジトリに反映することで、自分が修正した変更を別の人が共有リポジトリのデータを更新し、使用することが可能になります。git pushで使用するoriginは、共有リポジトリを指しています。

## ブランチとは
一つのプロジェクトから派生させた開発を行える機能で、現行のプロジェクトから派生させて作業をする。
派生させて作業し、変更点を管理することで下記のようなメリットがある。
・現行のプロジェクトに影響を与えない。
・現行と派生し作業したプログラムの差分ができる。
・複数人で作業ができる。

### ブランチ操作
```bash
// ブランチの一覧、現在のブランチの確認
git branch

// リモートブランチの一覧表示
$ git branch -a

// ブランチの作成
$ git branch <branch_name> 

// ブランチ名の変更
$ git branch -m <old_branch> <new_branch>

// ブランチの削除(マージ済)
$ git branch -d <branch_name> 

// ブランチの削除(マージの有無を問わず)
$ git branch -D <branch_name> 

// ブランチを切り替える
$ git checkout <branch_name>

// ブランチを作成して切り替える
$ git branch -b <new_branch> <old_branch>

// 特定のコミットからブランチを作成する
$ git checkout <commit ID> -b <branch name>
```

### ファイル操作
#### 修正したファイルを元に戻す
```bash
// 作業ツリー上のファイルをcommitした時の状態に戻す
$ git checkout <ファイル名>

// 作業ツリー上の全てのファイルをcommitした時の状態に戻す
$ git checkout .
```

#### 現在の作業の一時保存(stash)
stashは、ステージングエリアに保存するのではなく、作業しているbranchの情報の修正を別のbranchに反映したいときに使用します。
```bash
// 変更の退避
git stash

// 一時保存したリストの確認
git stash list

// 一時保存した内容の確認
git stash show

// 一時保存した内容の取り消し
git stash pop 

// 退避したstashを今いるブランチに適応する。
git stash apply

//N番目のスタッシュを適応し、残す
$ git stash apply stash{N} // bash の場合
$ git stash apply stash¥{¥N} //csh の場合
```

### ファイル管理(リポジトリ操作)
```bash
// リポジトリの複製
$ git clone [リモートリポジトリ]

// リモートリポジトリ最新の状態をローカルリポジトリへ反映(origin/ローカルはマージしない)
$ git fetch

// リモートリポジトリ最新の状態をローカルリポジトリへ反映(origin/ローカルはマージする)
$ git version

// working directoryからindexへ保存(working directory => index) 
// ※より詳細なファイルの登録は、「git add -u と git add -A と git add . の違い 」を参照してください。
$ git add .

// バージョン管理しているファイルを削除し、対象外とする。
$ git rm <ファイル名>

// ファイルのリネーム、移動。(バージョン管理は、commitも必要)
$ git mv <ファイル名>

// indexに登録したファイルの一つを元に戻す
$ git reset --hard HEAD^

// コミットの内容を打ち消すコミットを作成する。(index => working directory)
$ git reset <ファイル名>

// ひとつ前のコミットを丸ごと消す。
$ git reset --hard HEAD^

// ステージングしたファイルの取り消し
$ git reset <ファイル名>

// ステージしたものを消す。
$ git reset --mixed HEAD

// 直前のコミットを修正する
$ git reset --soft HEAD^

// 最新のコミットを指定し、編集内容を取り消す。
$ git checkout HEAD [file name]

// １つ前のコミット指定し、編集内容を取り消す。
$ git checkout HEAD^ [file name]

// 現在のブランチ先頭を、<commit>した状態まで戻す
$ git reset --hard <commit>

// local repositoryへ反映し、コメントをつける(index => local repository)
$ git commit -m ‘コメント’

// remote repositoryへ反映する。(index => local repository)
$ git push origin master

// remote repositoryへ反映がうまくいかない場合。
$ git push origin main
```

### status,logの確認
```bash
// 現在の状態確認
$ git status

// commitの確認
$ git log

// 最新10件分のコミットを１行づつの形式で表示
$ git log -10 --oneline

// コミットの差分・ファイルの内容を表示
$ git show <commit>

// いまのブランチのすべてのコミット歴史を表示
$ git reflog

// 特定ファイルの編集履歴の表示
$ git log -p <file名>

// ローカルリポジトリ内のブラインチの更新日を表示する
git for-each-ref refs/heads/ --sort='committerdate' --format='%(committerdate:short),%(refname:short)' "refs/heads"" | head
```

### Tag操作
```bash
// コメント（注釈）付きの場合
$ git tag -a タグ -m 'タグのコメント'

// リモートリポジトリへ反映
$ git push origin タグ名

// tagの一覧表示
$ git tag

// tagの一覧表示(一致するものを検索)
$ git tag "v.*"
```

### diff
```bash
// ワーキングエリアでの比較
$ git diff

// ステージング上での比較
$ git diff --cached
```

### submodule
```bash
// ワーキングエリアでの比較
$ git submodule status

// ステージング上での比較
$ git submodule update
```

### worktree
1つのリポジトリに複数のワークツリーを持つことができる。
[git worktree についてのメモ](https://www.webdelog.info/entry/2018/07/16/git-worktree)
[git worktreeを使ってみる](https://qiita.com/yoichi22/items/8f92110f24690ca8966f)
[git worktree コマンドを使って複数ブランチを並行して操作する](https://kakakakakku.hatenablog.com/entry/2021/04/15/092256)
[git-worktree - Manage multiple working trees](https://git-scm.com/docs/git-worktree)
[複数ブランチの同時並行作業にはGit Worktreeを](https://lab.astamuse.co.jp/entry/git-worktree)


```bash
//作業フォルダを別名にする
git worktree add <作業ディレクトリ> <ブランチ名>

// worktreeの一覧を表示する
git worktree list

// 特定の worktree を削除する
worktree remove [-f] <worktree>

//すべての worktree を削除する
git worktree prune
```


## 追跡管理しないファイルを設定する。
`.gitignore`のファイルを作成し、エディタで開いて、追跡管理から除外するファイル名を記述します。最後に、設定するファイルも記述することでこのファイル自体もgitの管理対象から外れます。自分の使うレベルでは、`.gitignore`に書かれている情報は不要なのであげないことにしました。
`.gitignore`ファイルは、使い方によっては上げた方がいい場合もあると思います。コンパイルしてファイルが生成するようなプログラムを使ったり、データをweb上などから引っ張ってくるときに生成したファイルをリポジトリに反映したくないときなどに使えそうかなと思います。

```bash
hoge/hoge (追跡管理しないファイル)
.gitignore
```

## gitのversion確認、updateをする。
```c
//gitのversionを確認する。
$ git --version

//gitのupdateをする。
$ git update-git-for-windows
```
#### ○作業メモ
##### case1.デバックで変更しない箇所のテストを省略したい場合。(commitするまでもない状態で操作したい)
1.全体に変更を加える。
2.git addでステージング上にファイルを置く。
3.変更しないテストをコメントアウトし、テストする。

<font color="MediumBlue">※ git checkoutを使用すれば、ステージング上に置いた状態に戻すことができます。</font>


# その他
・現在の作業を一時的に退避する。[link](https://www.granfairs.com/blog/staff/git-stash)
・gitのmergeとrebaseの違い [link](https://nullnote.com/web/git/merge_rebase/)
・チートシート [link](https://www.jrebel.com/blog/git-cheat-sheet)
・git flow [link1](https://backlog.com/ja/git-tutorial/stepup/05/) [link2](https://atmarkit.itmedia.co.jp/ait/articles/1708/01/news015.html)
・git reset について [link](https://www.r-staffing.co.jp/engineer/entry/20191129_1)
・git diff について [link](https://www.r-staffing.co.jp/engineer/entry/20200228_1) 
・git add -u と git add -A と git add . の違い [link](https://note.nkmk.me/git-add-u-a-period/)
・git commit を取り消して元に戻す方法、徹底まとめ[link](https://www-creators.com/archives/1116)
・忘れやすい人のための git diff チートシート[link](https://qiita.com/shibukk/items/8c9362a5bd399b9c56be)