Git操作:概要と基本的な操作

* [自分とこの環境下におけるGit & GitLabレクチャー](https://qiita.com/NeK/private/dee76f411cf2488b6873)


Git操作の概要とGitLabとの操作の概要を示す．

# Git操作の概要
Gitでのバージョン管理の概要を下図に示す．Gitでのバージョン管理を行うための初期化(init)，管理対象となるディレクトリ・ファイルに対する操作(add, mv, rm, commit)，現在の管理状態(status)からなる．

![git-outline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284261/49c9d2fa-517d-d002-6062-28fb5a04056f.png)

## 用語集
<dl>
<dt>project : プロジェクト</dt>
<dd>gitで管理する対象全体．具体的には管理対象のトップディレクトリの名前となる．</dd>
<dt>repository : レポジトリ</dt>
<dd>保存されている管理対象．特にバージョンがついた状態で保存されている．作業が進むにつれて保存したものは増えていく．個々の保存したもの・その状態をsnapshot:スナップショットと呼ぶ．</dd>
<dd>GitLabなどサーバを用いる場合，自分のPCのrepositoryとサーバ上のrepositoryを区別したい場合がある．その場合，自分のPCのものをlocal repository:ローカルレポジトリと呼ぶ．</dd>
<dt>worktree : ワークツリー</dt>
<dd>その時作業しているもの．repositoryをセーブしたものと捉えるとworktreeは現在の状態と捉えられる．</dd>
<dt>index : インデックス</dt>
<dd>Repositoryで保存する対象を集めたもの．プロジェクトディレクトリ以下の全てがrepositoryへの保存対象となるのではなく，選んで対象にしたり対象から外したりすることができる．indexにあるものがrepository保存の対象となる．</dd>
<dd>例1:viやemacsなどの編集時に出る一時保存ファイルを保存対象外とする．</dd>
<dd>例2:卒論で1章から5章までの文章をtexで記載する．4章のみまだ編集途中である．そのため，4章を除いた章に関係するファイルだけ保存対象とし，4章のみ保存対象外とする．</dd>
</dl>


## コマンド
```
git init
```

* 初期化を行う．管理対象となるディレクトリ・ファイルのあるトップディレクトリで実行することで，git管理のための初期化(プロジェクトの作成)を行う．

```
git add [option] [files]
```

* 指定ファイルを管理対象としてindexに追加する．
* option
    * なし
    * -u
        * 変更のあったファイルすべてを追加する．
* files
    * 指定されたファイルを管理対象ファイルとしてindexに登録する．
    * "."(ピリオド)ですべてのファイルを指す．
    * 備考
        * 管理対象ファイルに変更があった場合，「変更があった」と認識しindexを変化させるコマンドとなる．言い換えれば，addしない限り変更してもバージョン管理されないし，そのように使用することである変更に対してバージョン管理しないようにできる．
* 例
    * git add -u
    * git add -u *.txt
    * git add txt.txt
    * git add .

```
git mv [source] [target]
```

* 管理対象ファイルを移動する．
* 備考
    * mv source targetとするとGitがファイルの移動を認識できず，困ったことになる．Gitが管理しているファイルを移動する場合，必ずgit mvを使用しなければならない．

```
git rm [option] [files]
```

* 管理対象のファイルを削除する．
* option
    * なし
    * -r
        * ディレクトリの削除する．
    * -cash
        * indexから対象を削除する．意味的には「管理対象からはずす」となる．実際のファイルは削除されない．

```
git commit [option]
```

* indexに基づいてworktree内のファイルをrepositoryに保存する(=スナップショットをとる．)
* option
    * なし
    * -a
        * worktree内の変更を自動検出し，repositoryに保存する．git add -u & git commitと同等となる．
    * -m "message"
        * repositoryに保存する際のメモを付与する．使用することを推奨する．メッセージには簡単な変更内容を記載すると良い．
* 備考
    * git addコマンドをしていないなどで，indexがファイル更新を認識していない場合は保存されないので注意が必要である．逆に言えば色々ファイルを変更しても全て一度にrepositoryに保存する必要はなく，一段落ついたファイルのみを保存することができる．

```
git status
```

* Gitの管理状態(対象ファイルは変更されているか？indexに入っているか？など)を表示する．




# GitLabとの操作の概要
GitLabを使う場合のローカルPC上での操作の概要を下図に示す．ただし，GitLabにブラウザ経由でアクセスし，GitLab上で完結した操作もあるので注意が必要である．


![git-gitlab-outline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284261/07537227-d0cb-b413-9777-cb789a423267.png)

## コマンド

```
git clone [url]
```

* url
    * urlにあるプロジェクトをローカルPCにダウンロード．

```
git remote [option]
```

* option
    * add [name] [url]
        * 長いurlを短いnameにする別名付与．
        * 例:
            * git remote add origin git@gitlab.com:kentarou/git_seminar.git
    * -v
        * 登録一覧を表示．
    * -r [name]
        * 登録されているnameを削除．


```
git push [option] [repository name [local branch name[:remote branch name]]]
```

* ローカルPCのrepositoryをGitLabのrepository nameにアップロード
    * repository name
        * GitLab上のrepositoryを表すurlもしくはgit remoteで設定した短縮名．
    * local branch name
        * アップロードしたいローカルPC上のブランチ名．とりあえずmain．
    * remote branch name
        * アップロード先となるGitLab上のブランチ名．省略するとlocal branch nameとなる？
    * option
        * なし
        * -u
            * 当該オプションを指定してpushしpushが成功すると，以後repository nameなどを省略できる．
        * -all
            * すべてのブランチ名をアップロード．
    * 例
        * git push git@gitlab.com:kentarou/git_seminar.git main:dev-kentarou
            * ローカルPCのmainをgitlab上のdev-kentarouにアップロード．
        * git push origin main:dev-kentarou
            * 大体上に同じ．originと名前がところにアップロード．
        * git push origin main
            * originのmainにローカルPCのmainブランチをアップロード．
        * git push -u origin main
            * pushが成功すると，以後以下のコマンドでオッケーになる．
                * git push

```
git pull [repository name] [branch name]
```

* GitLab上からローカルPCへの取り込み．GitLab上のrepositoryのbranch nameで指定されたブランチをローカルPCの<font color="Red">現在のブランチ</font>に持ってくる．

# 初期化について
Gitを使うための初期化処理にあたるものはgit initとgit cloneの2種類ある．
git initはローカルPC上で行う初期化処理となる．管理対象としたいディレクトリでgit initのコマンドを実行すると，repositoryの場所や設定の保存場所である.git/ディレクトリが作成される．
一方でgit cloneはGitLab上のプロジェクトをローカルPCに持ってくる処理となる．GitLab上のプロジェクトの中には.git/ディレクトリがあるので，git cloneした時点で初期化も終わっていることになる．