【超初心者】実務で初の「git push origin ****」まで（めちゃくちゃヒヤヒヤしました）

##本記事を書いた理由
実際に業務でGitを使って編集したファイルを`git push`することができたので、自分の勉強用・記録用として残します。

取り急ぎ勉強中なので簡単に書きますが、誰が見てもわかるようにリライトしていきたいです。

##今回のケース
リモートリポジトリのソースコードをクローンし、開発用として新たに作成されたブランチ（ここでは「branchA」という名前のブランチとします）にプッシュする。

##実際に行った手順

###1.git cloneでローカルにクローンを作る
まずはリモートリポジトリのソースコードをローカルにクローン（複製）する。
その前にディレクトリ移動用のLinuxコマンド`cd`を使用してソースコードをクローンしたいディレクトリに移動しておく。
そして以下のコマンドを実行↓

```git 
$ gti clone リモートリポジトリのURL（〜.git）
```
これで自分のPC（ローカル）にリモートリポジトリのソースコードと全く同じものができる。

後述するが、`git clone`すると作業ブランチはmasterブランチになるので、あらかじめ開発用（作業用）ブランチがわかっているならば、以下のコマンドでブランチを指定してクローンすることが可能。
（masterブランチのままプッシュしてしまったらヤバイんですよね？多分）

```git
$ git clone branchA リモートリポジトリのURL（〜.git）
```

上記コマンドはこの記事の通り↓
[リモートから特定のブランチを指定してcloneする](https://qiita.com/icoxfog417/items/5776e0f0f758f0f0e48a)

これ、後から調べて知ったのだが「これしたらすぐできるじゃん」、ということで今後このコマンドを使うことを決めた。
（また１つ勉強になった）

※以降の内容は`git clone`で作業ブランチがmasterになっているケースで話を進める。

###2.git checkoutでローカルリポジトリのブランチを開発用ブランチに切り替える
`git clone`でリリモートリポジトリをクローンした場合、作業ブランチがmasterブランチになるので、今回の開発用のブランチ「branchA」に切り替える必要がある。
ただ、ローカルリポジトリにはまだ開発用ブランチである「branchA」がないので以下の作業が必要。

- ローカルリポジトリに開発用ブランチ「branchA」を作成する
- ローカルリポジトリの作業ブランチ（HEAD）をmaster→branchAに切り替える

`git checkout -b`コマンドを使えば１回の実行で行えるので以下のgitコマンドを実行する。

```git 
$ git checkout -b branchA origin/branch
```
これでbranchAを作成して作業ブランチをbranchへ切り替えることができる。

ローカルリポジトリの作業ブランチ切り替えに関してはこちらの記事にまとめましたので併せて読んでいただければと思います↓
[「git cloneしたソースコードの作業ブランチを切り替えて」と言われたので先輩に教わりながらやってみた](https://qiita.com/shimotaroo/items/be1f1f35dff2d8250aeb)

簡単に書くと以下のコマンドを１行で実行しているということ。

```git 
//git branchコマンドで新たにブランチを作成する
$ git branch  branchA origin/master

//git checkoutコマンドで作業ブランチを切り替える
$ git checkout branchA
```

###3.git pullで最新のリモートリポジトリの開発ブランチの状態をローカルリポジトリに取り込む
次にクローンしたリモートリポジトリの開発ブランチの状態最新の情報をローカルリポジトリに取り込む。
自分が`git clone`でクローンした時点のリモートリポジトリから他の人が変更分をプッシュしたりして、リモートリポジトリの内容はどんどん更新されていくので、その最新の状態を取り込む。

そのためには`git pull`コマンドを使って以下のように記述する。

```git
$ git pull origin branchA
```

これで、originリポジトリのbranchAブランチの最新情報（他の人が更新した内容）を取得（fetch）して自分のローカルリポジトリの作業ブランチに結合（merge）することができる。

（branchAにorigin/branchAを結合する）

ここに書いているが、`git pull`コマンドは`git fetch`コマンドと`git merge`コマンドを一気に行うことができるコマンドである。

それぞれのコマンドを使って実行すると以下の通り↓

```git 
//最新のリモートリポジトリの状態をローカルリポジトリに取得する
$ git fetch

//取得したリモートリポジトリの情報をローカルリポジトリに結合する
$ git merge origin branchA
```

`git pull`コマンドを使うことで１行でできる。
（ネットにはあまりpullは使わない方が良いと書いていたが今はタスクがこなせたのでとりあえずOK）

`git pull`についての詳しい説明は→[こちら](https://eng-entrance.com/git-pull)
`git fetch`についての詳しい説明は→[こちら](https://www.sejuku.net/blog/71164)
`git merge`についての詳しい説明は→[こちら](https://www.sejuku.net/blog/71003)

###4.git addで変更したファイルをステージに追加する
自分の作業ブランチが最新の状態にすることができたので変更をプッシュする準備に移る。
以下のコマンドで変更したファイルをステージに追加する。
（ワークツリー→ステージ）

```git 
$ git add ファイル名
```

###5.git commitで変更したファイルをローカルリポジトリに記録する
以下のコマンドでステージに追加された変更分をローカルリポジトリに記録する。
（ステージ→ローカルリポジトリ）

```git 
$ cgit commit -m "コミットメッセージ"
```

###6.git pushでリモートリポジトリに反映する
最後にコミットした変更をリモートリポジトリに反映する。
以下のコマンドで開発用のブランチである`origin/branchA`にプッシュする。

```git 
$ git push origin branchA
```

これでローカルリポジトリの作業ブランチ`branchA`の変更分をリモートリポジトリの開発用ブランチ`origin/branchA`にプッシュ（反映）することができた。

##おわりに
とまあ、こんな感じで無事にファイルを修正してリモートリポジトリに変更分をプッシュすることができました。
実務未経験の人間がプッシュする瞬間はドキドキしまくりますね...

※ちなみに先輩にお聞きしたのですが、ローカルリポジトリに作成する作業ブランチの名前は任意でOKなのですが、混乱を防ぐためにoriginリポジトリのブランチ名に合わせた方が良いとのことでした。

（例）
originリポジトリのbranchBブランチで開発を進める場合は、ローカルリポジトリに作成するブランチはbranchBにする。

リモート：origin/branchB
ローカル:branchB


今日でGitへの理解が一気に深まりました。

やっぱ実務で触るのが成長できますね！