[Git]基本的なコマンド入門

# はじめに

結構忘れてしまうことがあるのでこちらも備忘録としてメモしていきたいと思います！！

# Git

バージョンの管理システムの役割をし、コードの修正履歴を記録します。
いつどこをなぜ修正したのかの確認、複数メンバーで共同開発をする際に使用します。
シェルコマンドで操作します。

# 3つの場所

gitを使用する際はこの場所を考えながら操作をしていきます。

`ワーキングディレクトリ`
　自分が作業を行なっている場所

`ステージングエリア`　
　変更内容を仮登録する場所。indexともいう

`リポジトリ`
　実際に変更内容が記録される所



![スクリーンショット 2021-01-07 12.11.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/892628/6c63af46-b4a7-34be-dfe7-596721edc282.png)

もっと詳細が書いてあるのを貼っておきます。

[1.3 使い始める - Gitの基本](https://git-scm.com/book/ja/v2/使い始める-Gitの基本)


# 使用したバージョン管理の機能

- `add, commit`　コードの変更を記録

- `log, diff`　状態や変更箇所を記録

- `reset, revert`　前の状態を復活

- `branch, checkout`　作業に合わせて分岐

- `push, merge`　作業結果を統合


# リポジトリを作る

確認をしていくために実際にディレクトリを作っていきます。

```ruby

1.  mkdir mysample    （作業のするディレクトリを作る）

2.  cd mysample       (移動)

3.  git init          (initでリポジトリを作るとmysampleが記録対象になる)

4.  ls -a             (確認)↓


 % ls -a
.       ..      .git　　（隠しディレクトリができております）

```


# 状態を確認するコマンドたち

- `git status`　現在のステージングやリポジトリの状態を確認できる
 - git status -s  もっとシンプルに見る

- `git log`　コミットの履歴を確認する
 - git log --oneline 
 - git log -1 　直近のログだけを確認できる

- `git branch`　どこのブランチにいるのか確認ができる

- `ls -al`

# 使っていく


「kiroku.txt」というファイルを作ったのでまず仮登録していきます。

```ruby

git add kiroku.txt


# 「git status」 で確認するとような感じ
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   kiroku.txt

```

リポジトリに追加します。

```ruby

git commit

```

そうすると`「vim」`　というシェルで利用できるテキストエディタが開かれます。
Gitでコミットしようとすると、コミットメッセージの入力のために、自動的に起動します。


コミットメッセージを入力します。
どんな変更をしたか、なぜ変更したのかを書いていきます。

```ruby

1st commit      # ← （ここにコミットメッセージ）
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
#
# Initial commit
#
# Changes to be committed:
#       new file:   kiroku.txt
#
~                                                           
~       
             # （下はまだ続いてます。）
```


「vim」 はコマンドモードと編集モードを切り替えて使用します。

`編集モードに切り替える。`
- A 現在の行の末尾に入力する
- a 現在のカーソル位置の右から入力する

`コマンドモード`
- u 元に戻す- 
- :wq 保存して終了- 
- :q! 保存しないで終了

うーむ・・ここら辺はまた今度深掘りしましょう・・・。

<br>
無事にコミットできると

```ruby
# 「git status」 で確認

On branch master
nothing to commit, working tree clean
```
コミットできました！！


このようなリポジトリにコミットしたひとまとまりの状態を `「スナップショット」` と言います。


## 複数ファイル

「.」をつけるとワーキングディレクトリの全てのファイルを指定してくれます。

```Ruby

git add .

# (「git status」 で見る)
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   kiroku.txt
        new file:   kiroku2.txt

```

仮登録とコミットを一度にやってくれるコマンドもあります。

```ruby

git commit -a -m "2nd commit"
                    # ↑コミットメッセージ

```

- `「-a」`　
ステージングエリアに登録済みのファイルの変更について仮登録とコミットを同時にやってくれる

- `「-m」`
　コミットメッセージを１行だけ指定できる



##  「差分」を見る

どのような変更が行われたのかを確認します。
このような比較情報を「差分」と言います。

```ruby

git diff

```

最新コミットとステージングエリアを比較します。

```ruby

git diff --cached

```

最新コミットとワーキングディレクトリを比較します。

```ruby

git diff HEAD

```

こんな感じで出てきます。

```ruby

mysample % git diff HEAD

diff --git a/kiroku2.txt b/kiroku2.txt
index 360cddf..db701bb 100644
--- a/kiroku2.txt
+++ b/kiroku2.txt    # (比較しているファイル)

@@ -1 +1,2 @@    # ファイルがどのように変更されているか　@@変更前　変更後@@
-おはようございます。
\ No newline at end of file    # どのような違いなのか
+おはようございます。                # 空白であれば変更なし
+お元気ですか                     # 「-」 は削除
\ No newline at end of file     # 「+」 は追加

```

## 作業の履歴を取り消す

ステージング上の特定ファイルを一つ前の状態に戻したい時に使用します。

```ruby

git reset kiroku.txt

```

ワーキングディレクトリのファイルを前の状態に戻します。

```ruby

git checkout kiroku.txt

```

最新のコミットを打ち消すコマンドです。

```ruby

git revert HEAD

```

# ブランチを切る

作業内容に合わせてリポジトリを分岐する機能です。ブランチを使うと昨日の追加やバグの修正といった作業内容をリポジトリにまとめることが簡単にできます。

デフォルトでは「master」というブランチが用意されています。

<br>

ブランチを作ります。

```ruby

git branch add_html

# 「git branch」で確認してみます。
  add_html
* master        # できた。

```

切り替えます。

```ruby

git checkout add_html


* add_html
  master     # できた。

```

戻します。

```ruby

git checkout master


add_html
* master      # 戻った。

```

コミットの仕方ははじめにやったものと基本同じなのでブランチを切って移動した後もやり方は同じです。　・・・とのこと！！！！

わかりました！！！！！


## ブランチをマージする

ブランチのデータをmasterブランチに統合します。

```ruby

git checkout master

git merge add_html


Updating 019bd0d..2a3e430
Fast-forward
 kiroku.txt | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

```

不要になりましたら
ブランチを削除します。

```ruby

git branch -d add_html


Deleted branch add_html (was 2a3e430).

```

ちなみに
ブランチを作って、移動をもっと簡単に入力するには

```ruby

git checkout -b add_html2


Switched to a new branch 'add_html2'

# 「git log」 で確認してみます。
  add_css
* add_html2
  master         # 便利

```

# コンフリクトを解決する


同じファイルに別々の人が同じファイルを変更して統合するとコンフリクトという衝突が起きます。

ファイルを確認して、<<<<<　や　===== で囲まれているところが
衝突部分なので残したいコードのみ残して消去するか、全てを変更するかします。


```html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>hello git</title>
  </head>
  <body>
    <h1>見出し</h1>
<<<<<<< HEAD
    <p>ここはmasterです。</p>
=======
    <p>ここはadd_htmlです。</p>
>>>>>>> add_html
  </body>
</html>

```

このような感じで。残したいもの以外は消します。

```html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>hello git</title>
  </head>
  <body>
    <h1>見出し</h1>                            (これを消す)
                                      <!-- <<<<<<< HEAD -->
    <p>ここはmasterです。</p>
                                      <!-- =======
                                       <p>ここはadd_htmlです。</p>
                                       >>>>>>> add_html   -->
  </body>
</html>

```

最後に通常通り仮登録とコミットをします。

```ruby


git add index.html


git commit


```


# プロジェクトを複製する（クローンする）


他のメンバーと共同開発しているプロジェクトに参加する方法です。

```ruby

1. mkdir sample               (格納するディレクトリを作成する)

2. cd sample                   (移動)

3. git clone [共有リポジトリのファイルパス].git    (複製する)

```


共有した共同のリポジトリの情報を表示します。

```ruby

git remote -v

```

修正して、仮登録とコミットしたのち、
コミットを共同リポジトリに反映させます。

```ruby

git push origin master

```

また、プロジェクトの変更を取り込みたい場合はこのようにします。

```ruby

git pull [共有リポジトリのファイルパス].git

```

# まとめ

なんだか後半急いでダッシュな感じになってしまったので、もう少し詳しく調べてみたいと思います。

後は情報を見る時のオプションも次回は詳しくみていきたいです。

今日は終わりです！

# 参考

最近調べものをすると頻繁に出会うことに気付いたサイト。
見た目も素敵ですので貼っておきませう。

[SMART](https://rfs.jp/)


Gitについての色々な資料が載っている興味深いものも発見です。

[Git、GitHubを教える時に使いたい資料まとめ](https://qiita.com/yuyakato/items/41751848add5dfd5289c)


こちらはコマンドがたくさん載っています。

[Linux基本コマンドTips](https://www.atmarkit.co.jp/ait/series/3065/)