【git初心者】リポジトリ整理備忘録

なんとなくリモートリポジトリにプッシュし続けているけど、バージョンをもっと扱いやすく管理したい。
初心者なりに方法を考えて実践した備忘録です。

状況
-
・同じブランチにプッシュし続けている
・リポジトリ内にブランチが乱立
・github使用
・とりあえず何でもコミット＆プッシュしている
・プッシュの時"サイズが大きい"とwarningを見かける

色々問題がありました。


問題点１：同じブランチにプッシュし続けている
-

###結論：用途を分けてブランチを使う

**こんな風に思っていました**
>余計なことをしてエラーを見たくなくて、ひたすらプッシュしかしていない。
でもそれって同じブランチにすごい数のバージョンが存在していて、いざ必要なものを必要な場所から取り出したい時にはとても見つけづらいのでは、、、？


**打開策：ブランチを切る**
別のブランチを作って、そこにプッシュすることにしました。
これでとりあえず「すごい数のバージョン」からは逃れられるはず。

```zsh

git checkout -b ブランチ名
```
プッシュ先のリポジトリ指定を忘れずに。プッシュの際に指定するのも可。

```zsh
git branch -u origin/ブランチ名
```

ただリモートに対象のブランチが存在しないとこういう風になるので、

```zsh
hint: 
hint: If you are planning on basing your work on an upstream
hint: branch that already exists at the remote, you may need to
hint: run "git fetch" to retrieve it.
hint: 
hint: If you are planning to push out a new local branch that
hint: will track its remote counterpart, you may want to use
hint: "git push -u" to set the upstream config as you push.
```

その場合はプッシュの時にブランチを指定すればOK。

```zsh
git push -u リモートリポジトリ （originなど）　ブランチ名
```

問題点2：ブランチが乱立している
-

同じブランチを使い続ける状況は回避できたけど、今度はブランチが乱立してしまった。

###結論：ブランチのマージや削除

**打開策１：プルリクorマージする**
レビュアーがいる場合、プッシュしたものをプルリクし、レビュアーが内容を確認したらマージしてもらう。
レビュアーがいなければ、自分でマージ。

**打開策２：ブランチを削除する**
マージが済んだら履歴もマージされているため、作業していたブランチは基本的に不要。
※プロジェクトのルールにもよる為要確認
リモートブランチ＆ローカルブランチを削除する。
尚、プルリクしたものはリモートブランチを削除してもプルリク自体の記録は残る為github上でも内容確認可能。

リモートブランチ

```zsh
git push --delete origin <ブランチ名>
To github.com:<組織名>/<リポジトリ名>
 - [deleted]         <ブランチ名>
```
下記の方法もある、結果は上記と一緒。

```zsh
git push origin :<ブランチ名>
```
ローカルブランチ

```zsh
git branch -d <ブランチ名>
Deleted branch <ブランチ名> (was <コミットID>).
```
ここでの<コミットの番号>はローカルで行ったコミットの番号で、他の人が同じブランチにプッシュした内容（コミットID）はpullしていない限り表示されない。

その為、削除対象のローカルブランチがリモート上でマージされた場合、その情報をpullしないとローカル上ではマージされていない為下記のようなエラーとなる

```zsh
error: The branch '<ブランチ名>' is not fully merged.
If you are sure you want to delete it, run 'git branch -D <ブランチ名>'.
```

問題点3:とりあえず何でもコミット＆プッシュしている
-
###結論：バージョン管理するもの＆しないものを明確にする

**打開策１：バージョン管理しないものを把握しておく**

・バイナリファイル（ソースコードをバージョン管理すれば良い）
・接続設定情報などが記載されたセキュリティ上アップロード厳禁なもの
・vendorなどのプロジェクト用パッケージ（ディレクトリ）

vendorごとバージョン管理するかどうかは諸説あるけど、私はできれば避けたい派。

**打開策2：バージョン管理から外す方法を把握する**

.gitignoreに記載する。絶対パスでも相対パスでもどちらでも良い様子

```yml
#何のためのものかコメント記載しておくと良い
#ディレクトリごと外す
/vendor/*
#アスタリスク指定したディレクトリ内で管理したいファイルがある場合は下記のように記載
!/vendor/test.php
#ファイルをフルパスで指定
/config/test.php
```

**打開策３：バージョン管理から外す方のを忘れてプッシュ等した場合**
プッシュした時にエラーになって気付くパターンが多い。
プッシュやコミットを取り消したり、上書きしたりして修正する。

こちらに詳細を記載。
https://qiita.com/mby/items/af9eb586cc95d8804698

git statusでステージング状態にあるファイルを確認するなどしながら対応するとわかりやすい。

```sh
% git status
On branch <ブランチ名>
Your branch is up to date with 'origin/<ブランチ名>'.Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   更新したファイル.txt
	new file:   新しいファイル.txt
 Untracked files:　 ignoreしたファイル.txt
```

問題点4:プッシュの時"サイズが大きい"とwarningを見かける
-

下記のようなエラーやワーニングを見かけることがある

```sh
remote: warning: File サイズの大きいファイル.txt is 52.09 MB; this is larger than GitHub's recommended maximum file size of 50.00 MB
To github.com:<組織名>/<リポジトリ名>
```

```sh
remote: error: File サイズの大きいファイル.txt is 2844.42 MB; this exceeds GitHub's file size limit of 100.00 MB
```

###結論：バージョン管理しないorファイルを圧縮する

**打開策１：バージョン管理しない**
問題点3参照。

**打開策2：ファイルを圧縮する**
gzip等で圧縮したファイルを配置、使用する時に解凍するように仕込むとか。

```sh
#!/bin/sh

gunzip 解凍したいファイル.txt.gz
<ファイルを使用する処理など>
#また圧縮したい場合
gzip 圧縮したいファイル.txt
```

まとめ
-
以上、リポジトリの整理の為に行ってきたことの記録でした。
他にも新しく良い整理の方法を実践したら追記します。