Git チートシート　初心者向け

## 対象者
Git初心者
GitHub初心者

## お願い
Git初心者が実務や本で学んだgitコマンドのチートシートです。
間違いやコメントがございましたら、ご指摘・コメントいただけますと幸いです。
また、記事の内容の正確性には、責任を負いません。コマンドを実行する際は自己責任で実行してください。


## gitでやってはいけないこと(禁止事項)
### リモートリポジトリにpushしたcommitを修正してはいけない
もしそのようなことをするとリモートの履歴と、ローカルの履歴が別のものになってしまい、
今後リモートの変更を取り込もうとしても不可能になってしまう。
もしすでにpushした内容を書き換えたい場合は、再度打ち消しのcommitを行う。

### git pullする際にブランチを合わせないこと
例えばリモートのtestブランチを、ローカルの現ブランチがmainブランチの場合、ローカルのmainブランチにリモートtestブランチの内容が統合されることになってしまう。

### 複数人で同一ファイルを同時に変更しない
コンフリクトを起こさないため
なお、他に注意することとして、pullやmerge前に、commitやstashをして、変更中のファイルをなくす
※pull や mergeができなくなるからです。

### GitHubにpushしたコミットをrebaseしてはいけない
git pushできなくなるので。履歴がおかしくなってしまう。
git push -fは使っちゃダメ。絶対ダメ。GitHubが上書きされる。

## ローカルリポジトリでの基本の操作

### git init
ローカルで.git フォルダが作成される

### git clone
他の人の作成したリポジトリを作成する
.gitディレクトリとワークツリーが複製される

### git add
変更をステージに追加する
git add . だと全ての変更を追加する
git add ファイル名・ディレクトリ　を指定できる

### git status
現在の"変更状況"を確認する
git commit前に確認するのに使うとよい

### git diff
"変更差分"を確認する.具体的にどのような変更が加わったかを確認する。
git addする前の変更差分は　git diff
git addした後は git diff --staged


### git commit
変更の記録を行う
git commit -m　"メッセージ"
git commit -v ファイル変更がわかる

### git log
変更履歴を確認する
git log --oneline 一行で表示できる
git log -n <表示したいコミット数>　表示するコミット数を絞る
git log -p 変更したファイルの中身も確認
git log --decorate ブランチも表示する

### git remote add origin GitHubのリモートリポジトリのURL
push前に実行する。originにGitHubのリモートリポジトリのURLを設定している

### git push <リモート名>　<ブランチ名>
例) git push origin master
先にGitHubでリモートリポジトリを作成している必要がある

## 操作を取り消したい場合
### ワークツリーで変更した内容を戻したい時(add前)
git checkout .
git checkout -- ファイル名　/ -- ディレクトリ名
ワークツリーにステージの状態を反映させる

### ステージした変更を取り消したい場合(add後、commit前)
git reset HEAD 全ての変更を取り消す
git reset HEAD ファイル名/ ディレクトリ名
※ステージから、変更した内容を取り消すだけで、ワークツリーに影響はない。
※ステージに、リポジトリの最新のコミットの情報を反映させる（上書きする）
※HEADは現ブランチの最新のコミットを指すポインタである

### 直前のコミットを修正したい(commit後)
git commit --amend

※リモートリポジトリにpushした場合は、コミットをやり直してはいけない
※コミットに修正内容が漏れていたり、コミットメッセージを修正したい場合など
※原理としては、現在のステージの状態をもとに、直前のコミットを上書きする。

## リモートリポジトリとのやりとりの操作
### リモートリポジトリから情報を取得する（fetch）
git fetch リモート名
git fetch origin
※ローカルリポジトリにリモートリポジトリの内容が反映されるが、ワークツリーには反映されない。
※ローカルの情報をワークツリーに反映させるにはgit mergeする。
※詳しくいうと、fetchすると、ローカルリポジトリに、リモートリポジトリのブランチ（ポインタ）がorigin/ブランチ名として保存されることになる
git merge origin(リモートリポジトリ名)/main(ブランチ名)

### リモートリポジトリから情報を取得する(pull)
git pull リモート名　ブランチ名
git pull origin master (git pull でもOK)
※pull = fetch + merge
※注意しないといけない点：今自分がいるブランチにpullした内容が反映されるので、ブランチを同じにしないと危険。

### リモートの情報を詳しく確認したい
git remote show リモート名
例)　git remote show origin

## ブランチ関連のコマンド
### 基本的な考え方
※ブランチはコミットを指し示したポインタ
※HEAD作業中のブランチを指し示したポインタ

### 新しいブランチを追加する
git branch ブランチ名
※ブランチの切り替えは行われない

### ブランチの一覧を確認する
git branch
git branch -a リモートブランチを含め全てのブランチを確認する

### ブランチを切り替える
git checkout ブランチ名
※ブランチを新規作成して、かつブランチをの切り替えを行いたいときは
git checkout -b 新ブランチ名

### ブランチ間の変更をマージする
git merge ブランチ名
git merge リモート名/ブランチ名
※Auto merge の場合は、マージコミットが行われる、マージコミットは親コミットが2つある（普通のコミットは親コミットは1つ）。

### コンフリクトを解消する
どのファイルでコンフリクトが起きているか確認するのにはgit statusが使える。
コンフリクトが起きているファイルを直接変更する
その後git add コンフリクトが起きているファイル
※同じファイルかつ同じ行について変更したときにコンフリクトが起きる

## PR関連のコマンド
git push origin ブランチ名
をすると、PRが作成される（GitHubのPull requestsの画面で確認できる）
baseとcompareブランチを設定する



## 特定の状況
### ファイルの削除を記録したい
git rm ファイル名　ファイルごと削除する場合（リポジトリとワークツリー両方から削除される）
（削除をもとに戻す場合はgit reset HEAD ファイル名してから、git checkout ファイル名）
※git reset HEAD ファイル名→addしたファイルの変更を取り消す。
※git checkout ファイル名→指定したファイルを最新commitの状態に戻す

git rm --cached ファイル名　ファイルをgitの記録から消したいが、ワークツリーには残したい場合
(もし削除をもとに戻す場合はgit reset HEAD ファイル名)

### ファイルの移動を記録したい
git mv <旧ファイル名> <新ファイル名>

### コマンドにエイリアスをつけたい
例) git config --global alias.st status

### バージョン管理したくないファイルを無視したい
cacheやパスワードの入っているファイルを無視したい場合
.gitignoreファイルに記載する

### 設定されているリモートについて確認したい
git remote
git remote -v こちらだとリモートリポジトリのURLが確認できる

### リモートリポジトリの追加をしたい
git remote add リモート名　リモートのURL
※リモートリポジトリは複数追加できる

### リモートを変更したり削除したい場合
git remote rename 旧リモート名　新リモート名
git remote rm リモート名

### ブランチ名を変更する場合
git branch -m 新ブランチ名

### ブランチを削除したい場合
git branch -d 消したいブランチ名(-D　にすると強制削除）

### mergeの際にファストフォワードを禁止したい場合
git config --global merge.ff false
※禁止することで履歴を残すことができる(ブランチをいつ取り込んだかがわかるようになる)

## リベースについて
git rebase ブランチ名
マージ以外で変更を取り込む方法。
※親コミットが変更になる

### 複数のコミットを修正したい場合
git rebase -i コミットID
git rebase -i HEAD~4

pick→editと変更してコミットエディタを終了する
全て修正したらgit commit --amend
git rebase --continueで次のコミットに進む

## スタッシュについて
コミットはしないが一時的に変更を非難する（ワークツリー、ステージのどちらの変更も非難出来る）
git stash

### スタッシュした変更を確認する
git stash list

### スタッシュした変更を復元する
git stash apply
※この場合ステージの変更は復元されないため、ステージの変更を復元させたいときは、
git stash apply -iindex
※復元したい作業を限定する場合
git stash apply stash@{1} //1は例

### スタッシュした変更を廃棄する
git stash drop //最新のスタッシュ内容を削除
git stash drop stash@{1} //1は例