git操作チュートリアル


# この記事はなにか
gitをとりあえず使えるようになるチュートリアルを目指してます。書き途中。
SES系IT戦士ということもあり、各所でGitの操作を教えるの資料起こすの面倒になったのでQiitaに。
基本的にはsouceTreeを使うことを想定しています。できたらコマンドも併記していきたい気持ち。

# 準備
gitで開発を行うための準備の手順

1. git設定変更
必要であれば。windowsだと改行が自動変換される設定がonになってる場合がある。
    ```git config --global autocrlf false```

1. clone
ローカルにリモートのdevelopをclone。
タブの+ボタン → メニューの[Clone]

    ```git clone -b develop https://リポジトリのアドレス```

1. ブランチの確認
今のブランチがdevelopであることを確認。
左側のブランチ一覧の中の"develop"の左に○が付いていて太字になっていることを確認。

    ```git branch -vv```

1. ブランチの作成
developから個人用のdevelopブランチdevelop-xxxを作成。(xxxは自分の名前)※developを壊さないための仮のdevelop
メニューの[ブランチ]　→ 新規ブランチに「develop-xxx」を入力 → [ブランチを作成]
左側のブランチ一覧の中の"develop-xxx"の左に○が付いていて太字になっていることを確認。

    ```git branch develop-xxx```

1. checkout
個人用のdevelopブランチに切り替え。
左側のブランチ一覧の中のブランチ名ダブルクリックで切り替え。(作成の時点でチェックアウトにチェックが入ってればすでに切り替わっている)

    ```git checkout develop-xxx```

# ソースの新規作成
新しいソースをgitに加えるための手順

1. ブランチの作成
developブランチから「feature-xxx/0001」を作成する。※準備の手順を読み替えて実施。

1. checkout
feature-xxx/0001に切り替え。

1. ファイルを新規作成

    ```bash:counts_string_length.sh
#/bin/bash
bs=("bbb" "bbbb" "bb" "bb" "bbbbb")
echo "bbb is 3 char";
echo "bbbb is 4 char";
echo "bb is 2 char";
echo "bb is 2 char";
echo "bbbbb is 5 char";
```

1. ソースを実行してみる。
以後ソースを修正したら1度は実行してからcommitする。

    ```bash counts_string_length.sh```

1. track対象に追加
作成したファイルをコミットの対象にする。
下部のタブの[ファイルステータス] → 対象ファイルを選択 → 中央あたりの[選択をインデックスに追加]

    ```git add counts_string_length.sh```

1. commit　※
コミットコメントを記載してコミットを行う。これでローカルのgitにソースが入る。
下部のテキストエリアにメッセージを追加する。(ルールがある場合にはそれに従う。) → [コミット]

1. push　※
ローカルのブランチをリモートにpush。
メニューの[プッシュ] → pushしたいブランチにチェックを付ける → [プッシュ]

1. PR/MR作成　※
GitHub/GitLabでの操作。ブラウザ操作。
マージしてほしいブランチのリクエストを作成する。(コメントやアサインにルールがある場合にはそれに従う。)

1. PR/MR確認　※
GitHub/GitLabでの操作。ブラウザ操作。
マージ可能な状態になっていることを確認。(コンフリクトしていないこと。)
リクエストを作った際には他人のコミットが含まれていないことや、自分の修正していない差分がないことをブラウザで確認してからレビュー依頼を行うこと。

1. PR/MRマージ　※
リーダーやメンターの人に内容を確認してもらいマージしてもらう。

# ソースの修正
すでにあるソースを修正するための手順

1. ブランチの作成
develop-xxxブランチから「feature-xxx/0002」を作成する。

1. checkout
feature-xxx/0002ブランチに切り替え。
左側のブランチ一覧の中のブランチ名ダブルクリックで切り替え。(作成の時点でチェックアウトにチェックが入ってればすでに切り替わっている)

1. ソースの修正を行う。
counts_string_length.shをforを使うように直す。

    ```bash:counts_string_length.sh
#/bin/bash
bs=("bbb" "bbbb" "bb" "bb" "bbbbb")
for a in ${bs[@]};
do
  echo "$a is `echo -n $a | wc -c` char";
done
```

1. commit
※と同様

1. push
※と同様

1. PR/MR作成
※と同様

1. PR/MR確認
※と同様

1. PR/MRマージ
※と同様

# バックマージ
最新のソースに修正を加えるための手順

1. checkout
feature-xxx/0001に切り替え。

1. 作業用ブランチにdevelop-xxxをマージ
左側のブランチ一覧の中の「develop-xxx」を右クリック → [現在のブランチにdevelop-xxxをマージ]
その後、feature-xxx/0002で行ったcounts_string_length.shに対する修正が適用されていることを確認。

# コンフリクト解消
他のメンバーの修正と衝突した際の解決の手順

1. ブランチの作成
今回は一人二役となるので開発用にfeatureブランチを2つ作成する
メニューの[ブランチ]　→ 新規ブランチに「feature-xxx/0003」を入力 → [ブランチを作成]
メニューの[ブランチ]　→ 新規ブランチに「feature-xxx/0004」を入力 → [ブランチを作成]

1. checkout
feature-xxx/0003に切り替え。

1. ソースの修正を行う。
counts_string_length.shの変数「bs」の修正する。

    ```bash:counts_string_length.sh
#/bin/bash
array=("bbb" "bbbb" "bb" "bb" "bbbbb")
for a in ${array[@]};
do
  echo "$a is `echo -n $a | wc -c` char";
done
```

1. commit
※と同様

1. push
※と同様

1. PR/MR作成
※と同様

1. PR/MR確認
※と同様

1. PR/MRマージ
※と同様

1. checkout
feature-xxx/0004に切り替え。

1. ソースの修正を行う。
counts_string_length.shの変数「a」の修正する。

    ```bash:counts_string_length.sh
#/bin/bash
bs=("bbb" "bbbb" "bb" "bb" "bbbbb")
for value in ${bs[@]};
do
  echo "$value is `echo -n $value | wc -c` char";
done
```

1. commit
※と同様

1. push
※と同様

1. PR/MR作成
※と同様

1.PR/MR確認
コンフリクト発生。PR/MRでコンフリクト発生の文言が表示されていることを確認。

1. バックマージ
※と同様

1. コンフリクト修正
自分のローカルのソースをマージ後のあるべき姿に修正する。

1. 修正済みとしてマーク
対象のソースを右クリックして修正済みにマークする。


1. commit
※と同様

1. push
※と同様

1. PR/MR確認
この時、pushをしたことでPR/MRの内容が更新されている。(ブランチからブランチへのマージ遺体なので)
マージ可能になっていることを確認する。

1. PR/MRマージ
※と同様

# ファイル名/ディレクトリ名の変更
ソース修正と移動を一緒にやってはいけないらしい(?)
git mv aaa.txt bbb.txt
git log --oneline --follow bbb.txt

# 誤ってcommitした
git reset --hard ハッシュ値

# commit履歴をまとめたい
git commit --amend

# 参考
https://git-scm.com/book/ja/v2
https://github.com/Shinpeim/introduction-to-git