git 基礎　

この記事はudemyのgit講座
Git Complete: The definitive, step-by-step guide to Git
(https://www.udemy.com/course/git-complete/)
を参考にし作成しています。
解釈の間違いなどがあるかと思いますがその時はコメントしていただけると幸いです。
又コミュニティガイドラインは守っているつもりですがQiitaを投稿し始めてまもないのでその際もコメントしていただけるとありがたいです。

#gitとは
ソースコードバージョン管理ツール
ソースコードの変更、ファイル構成の変更などの変更を全て記録することができる。変更箇所の違いを見ることもできる。
とても便利なツールである。
#githubとは
誰がどのようなソースを管理してるか見ることができる。
またそのソースコードを自分のディレクトリへコピーすることもできる。

##5つの基本概念
###作業ディレクトリ：　
コンピュータ上のディレクトリまたはフォルダ
普通にソースコードなどを変更したりする場所

###ステージングエリア：　
作業ディレクトリとローカルgitリポジトリの中間の場所
gitリポジトリにcommitするための変更をキューのように入れておく場所

###ローカルgitリポジトリ:　
自分のコンピュータの中のgitリポジトリ。
.gitフォルダと呼ばれる隠しフォルダ

###forkとは:
他人のgithubアカウントからforkボタンを押すと自分のgithubリポジトリにコピーすることができる

###マスターブランチ：
時系列でファイルの変更を管理するものをブランチといい、枝みたいな意味である。デフォルトのブランチがマスターブランチとなっている。

##githubに登録する
ユーザー登録するとgithubにリポジトリを作成する

##git コマンド　一覧
###バージョン確認
```bash
$ git version
git version 2.17.2 (Apple Git-113)
```

###ローカルの設定
```bash
$ git config --global user.name "<ユーザーの名前>"
$ git config --global user.email "<ユーザーのメールアドレス>"
$ git config --global --list
user.name=<ユーザーの名前>
user.email=<ユーザーのメールアドレス>
```

###①githubからローカルにリポジトリをクローン(取得)する
```bash
$ git clone <github URL>
```
githubから取得したいリポジトリのURLをコピーしてくる
コマンド実行
github上のリポジトリの完全なコピーをローカルに作成する

###②gitの状態表示
```bash
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
```
自分がマスターブランチにいることを示している。
マスターブランチはgitリポジトリのデフォルトブランチとなる。
originとはgithubリポジトリへの参照。
git status コマンドはマスターが「origin/masterで最新」であることを表している。またローカルリポジトリ、ステージングエリアなどの情報も見れる。
「working tree clean」： 何も変更がない状態

###③ローカルリポジトリに入り、新規ファイル作成,ステータス確認
```bash
$ cd git_intro/
$ ls
first.txt  second.txt
$ touch 0613.txt
$ ls
0613.txt   first.txt  second.txt
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	0613.txt

nothing added to commit but untracked files present (use "git add" to track)
```
今の状態だと作成した0613.txtはgitにまだ追加されていないということ。
現在は0613.txtは作業ディレクトリにある状態

###④ステージングエリアに移動させよう
```bash
$ git add 0613.txt

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   0613.txt
```
「new file:   0613.txt」: ステージングエリアに新しいファイルがあるという意味。
「Changes to be committed」 : コミットされる変更

###⑤ローカルリポジトリにコミットしよう
```bash
$ git commit -m "add 0613.txt"

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
```
「Your branch is ahead of 'origin/master' by 1 commit」
は参照しているリモートリポジトリのマスターブランチより一個進んでいる事を示している。
現在ファイルはまだローカルリポジトリにあリます。

###⑥githubにプッシュしよう
```bash
$ git push origin master
```
リモートリポジトリ、ローカルリポジトリにはそれぞれ対応するブランチがある。
変更されるのはローカルのブランチで変更後にリモートリポジトリにpushする必要がある。
origin: クローン元のリモートリポジトリの名前
master: デフォルトのブランチの名前
git push origin master: 変更されたローカルのブランチをgithubのブランチにpushするという意味。 
現在の状態でgithubにアクセスすると0613.txtが追加されている

#基本コマンド
###ローカルリポジトリの作成
```bash
$ git init new_repogitory ----(新規リポジトリの作成)

$ cd new_repogitory/
$ ls -al
total 0
drwxr-xr-x  3 username  staff   96  6 14 09:51 .
drwxr-xr-x  4 username  staff  128  6 14 09:51 ..
drwxr-xr-x  9 username  staff  288  6 14 09:51 .git

$ git status
On branch master ----(マスターブランチにいる)

No commits yet ----(まだコミットしていない)

nothing to commit (create/copy files and use "git add" to track) ----(コミットしてない)

$ mate one.txt ----(新規テキストを作成)

$ git status ----(ステータス確認)
On branch master

No commits yet

Untracked files: ----(gitが追跡していないファイルがある)
  (use "git add <file>..." to include in what will be committed)

	one.txt 

nothing added to commit but untracked files present (use "git add" to track) ----(addしていない)

$ git add one.txt ----(ステージングエリアに追加)

$ git status
On branch master

No commits yet

Changes to be committed: ----(コミットする変更がある)
  (use "git rm --cached <file>..." to unstage)

	new file:   one.txt

$ git commit -m "adding new file" ----(変更をコミットする)
[master (root-commit) 0e332ef] adding new file
 1 file changed, 1 insertion(+)
 create mode 100644 one.txt

$ git status
On branch master
nothing to commit, working tree clean ----(なにもない状態)
```
コミットした場合に出力される「0e332ef」の文字列はコミットのユニークな識別子である。

###ローカルリポジトリの作成
```bash
$ git init
Initialized empty Git repository in /Users/user/Desktop/git/test/.git/
```
現在のディレクトリを作業ディレクトリとする
実行すると作業ディレクトリに./gitディレクトリが作成される

###pushする前にpullしよう!
```bash
$ git pull origin master
From https://github.com/user-cloud/starter-web
 * branch            master     -> FETCH_HEAD
Already up to date. ----(すでにアップデートされている=最新版)

$ git push origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 279 bytes | 279.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/user-cloud/starter-web.git
   4beb7f0..da1f580  master -> master
```
理由はリモートリポジトリが新しく更新されている可能性があるため。

###.gitconfigファイルを編集しよう!
```bash
$ mate ~/.gitconfig
[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
	required = true
[user]
	name = <username>
	email = <usermailaddress>
[core]
	editor = mate -w
```
ここでgitの設定を変更することができる

###addとcommitを同時にやってしまおう!
```bash
$ git commit -am "add second write"
```

###gitが追跡しているファイル一覧を見よう!
```bash
$ git ls-files
```
###ディレクトリ階層ごとに変更がある場合
```bash
$ mkdir -p level1/level2/level3

ここで各階層ごとにファイルを作成する

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	level1/

nothing added to commit but untracked files present (use "git add" to track)

$ git add .

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   level1/level1-file.txt
	new file:   level1/level2/level2-file.txt
	new file:   level1/level2/level3/level3-file.txt

$ git commit
[master 0a7dc91] all three files
 3 files changed, 3 insertions(+)
 create mode 100644 level1/level1-file.txt
 create mode 100644 level1/level2/level2-file.txt
 create mode 100644 level1/level2/level3/level3-file.txt
```
ファイルが階層的になっていても大丈夫である。

###ステージングエリアのファイルを削除し、最後にコミットした状態に戻そう
```bash
$ git status ----(ステージングエリアにファイルがある)
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   level1-file.txt

$ git reset HEAD level1-file.txt ----(ファイルをステージングエリアから削除する)
Unstaged changes after reset:
M	level1/level1-file.txt

$ git status ----(作業ディレクトリの変更状態に戻った)
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   level1-file.txt

$ git checkout -- level1-file.txt ----(最後にコミットした状態のファイルを呼び出す)

 git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
```
これでファイルに間違った変更を施し、ステージングエリアまで追加してしまっても元どおりである。

###リポジトリを同期させよう
```bash
①githubにてリポジトリを作成
②新規ディレクトリを作成
$ mkdir aaaa
$ cd aaaa/
③git initコマンドでローカルリポジトリを作成
$ git init
$ touch afhfoahof.tx
$ git add .
$ git commit
④git remote add origin <githubリポジトリのURL>でローカルリポジトリとリモートリポジトリを結びつける。
$ git remote add origin https://github.com/user-cloud/DQM.git
$ git push origin master
```

###ファイル名を変更しよう
```bash
$ git mv level3-file.txt level3.txt
$ git status
n branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	renamed:    level3-file.txt -> level3.txt

$ mv level2-file.txt level2.txt
$ git status
On branch master
Your branch is ahead of 'origin/master' by 4 commits.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    level2-file.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	level2.txt

$ git add -A
```
ファイル名の変更などはgit mvコマンドでも実施できる
普通のbashを使用してファイルの名前変更、削除、構成などを変更した場合にステージングエリアに送るときはgit add -Aを使用する
とりあえずリポジトリでファイルの変更をするときはgit mv コマンドがいい

###gitで追跡されているファイルを削除しよう
```bash
$ git rm <file name>
```

###削除したファイルを復元しよう
```bash
$ rm <delete file name>
$ git checkout -- <delete file name>
```

###gitのlogのhelpを見てみよう
```bash
$ git help log
```

###gitのlogを見てみよう
```bash
$ git log
commit b9f4a6ff35bde09252d7ba8d872cb8bc4248bfe3 (HEAD -> master)
Author: user-cloud <user mailaddress>
Date:   Mon Jun 15 10:04:08 2020 +0900

    file moving file

commit fe6fcf75976fd9fdcdb00880b32c0f8eabd6b631
Author: user-cloud <user mailaddress>
Date:   Mon Jun 15 09:36:52 2020 +0900

    renaming file
......(以下省略)
```
下に行くにつれて最新の履歴となる。
commit: gitが識別するコミットしたユニークな識別子
Author: ユーザーネーム、メールアドレス
Date: いつ
その下はコミットする際につけるコメント
終了はqをおす

###git logの見やすい形式
```bash
$ git log --abbrev-commit ----(省略版)
commit b9f4a6f (HEAD -> master)
Author: user-cloud <user mailaddress>
Date:   Mon Jun 15 10:04:08 2020 +0900

    file moving file

commit fe6fcf7
Author: user-cloud <user mailaddress>
Date:   Mon Jun 15 09:36:52 2020 +0900

    renaming file

$ git log --oneline --graph --decorate ----(見やすい版)
* b9f4a6f (HEAD -> master) file moving file
* fe6fcf7 renaming file
* 0a7dc91 all three files
* 9985a0d double file
* 4eea004 add second write
* da1f580 (origin/master, origin/HEAD) my first cmd
*   4beb7f0 Merge pull request #6 from jasongtaylor/feature-readme
|\
| * e73f914 Adding Purpose section to README
| * 34f563b Adding README file
|/
* 5c05047 Copying files from initializr project zip file and then creating simple.html as basis for super simple pages

$ git log b9f4a6...9985a0 ----(気になるコミットだけ選択できる)
commit b9f4a6ff35bde09252d7ba8d872cb8bc4248bfe3 (HEAD -> master)
Author: user-cloud <user mailaddress>
Date:   Mon Jun 15 10:04:08 2020 +0900

    file moving file

commit fe6fcf75976fd9fdcdb00880b32c0f8eabd6b631
Author: user-cloud <user mailaddress>
Date:   Mon Jun 15 09:36:52 2020 +0900

    renaming file

commit 0a7dc91e15bc6b1c3ada15e0d1d7a2c79eacba89
Author: username <user mailaddress>
Date:   Sun Jun 14 18:16:11 2020 +0900

    all three files

$ git log --since="3 days ago" ----(３日前からの指定)

$ git log -- <file name> ----(ファイルのログをみる)

$ git log --follow -- <file name> ----(ファイルのコミットログをみる)

$ git show <commit ID> ----(コミットの詳細をみる)
```

###gitのaliasを設定しよう
```bash
$ git config --global alias.hist "log --all --graph  --decorate --oneline"

$ git hist
* b9f4a6f (HEAD -> master) file moving file
* fe6fcf7 renaming file
* 0a7dc91 all three files
* 9985a0d double file

$ cat ~/.gitconfig ----(設定ファイルの保存場所)
```
長いコマンドなどを短いコマンドで登録したりする。
なおこの変更はローカルで行われるので全体の変更ではない。
alias.hist: でhistコマンドを作成したという意味
"log --all --graph  --decorate --oneline": ""の中にhistコマンドとして実行させたいコマンドを入力する

###gitでファイルやディレクトリを無視する
```bash
$ mate .gitignore
```
.gitignoreファイルに無視するファイル名を入力する
add 、 commitする。すると指定したファイルは追跡しない

###ファイルのどこをどう変更したのかを見てみよう
```bash
$ mate test.py ----(新規にファイル作成、書き込み)

$ cat test.py
print('hello world')

$ git add test.py

$ git commit -m "first commit test.py"

$ mate test.py

$ cat test.py
print('hello world') ----(元から)

print('evenig world') ----(追加)

$ git diff
diff --git a/test.py b/test.py
index 00950d9..e391768 100644
--- a/test.py
+++ b/test.py
@@ -1 +1,3 @@
-print('hello world')
\ No newline at end of file
+print('hello world')
+
+print('evenig world')
\ No newline at end of file

$ git add test.py

$ mate test.py

$ cat test.py
print('hello world') ----(最初から)

print('evenig world') ----(前回追加)

print('night world') ----(今回追加)

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   test.py

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   test.py

$ git diff ----(作業ディレクトリとステージングを比較する)
diff --git a/test.py b/test.py
index e391768..90f8b18 100644
--- a/test.py
+++ b/test.py
@@ -1,3 +1,5 @@
 print('hello world')

-print('evenig world')
\ No newline at end of file
+print('evenig world')
+
+print('night world')
\ No newline at end of file

$ git diff HEAD ----(作業ディレクトリと最後にコミットした違いを比較する)
diff --git a/test.py b/test.py
index 00950d9..90f8b18 100644
--- a/test.py
+++ b/test.py
@@ -1 +1,5 @@
-print('hello world')
\ No newline at end of file
+print('hello world')
+
+print('evenig world')
+
+print('night world')
\ No newline at end of file

$ git diff --staged HEAD ----(ステージングエリアと最後にコミットした違いを比較する)
diff --git a/test.py b/test.py
index 00950d9..e391768 100644
--- a/test.py
+++ b/test.py
@@ -1 +1,3 @@
-print('hello world')
\ No newline at end of file
+print('hello world')
+
+print('evenig world')
\ No newline at end of file
```
HEAD: 現在のブランチでの最後のコミットを表す

###複数のファイルを変更した時にファイルを絞って差分を表示する
```bash
$ git diff -- <file name>
```

#任意のコミットと最後のコミットを比較しよう
```bash
$ git log --oneline
a6e697d (HEAD -> master) first commit test.py
aa68507 (origin/master, origin/HEAD) adding igonore file
b9f4a6f file moving file
fe6fcf7 renaming file
0a7dc91 all three files
....(以下省略)

$ git diff b9f4a6f HEAD ====(後ろから三番目のコミットと最後のコミットを比較する)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/test.py b/test.py
new file mode 100644
index 0000000..00950d9
--- /dev/null ----(最初はなかった)
+++ b/test.py ----(新規に作成した)
@@ -0,0 +1 @@
+print('hello world')
\ No newline at end of file
```

###ローカルブランチとリモートブランチを比較しよう
```bash
$ git master origin/master
```
master: ローカルブランチ
origin/master: リモートブランチ

##ブランチを知る
基本デフォルトのブランチはマスターブランチとなっているが本来はマスターブランチから派生させて使用するのが良い。
###ブランチのリスト
```bash
$ git branch -a
* master ----(現在のブランチ)
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
```

###ブランチの作成
```bash
$ git branch mynewbranch ----(ブランチの作成)

$ git branch -a
* master 
  mynewbranch
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

$ git checkout mynewbranch ----(ブランチの変更)
Switched to branch 'mynewbranch'

 git branch -a
  master
* mynewbranch ----(現在のブランチ)
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

$ git log --oneline --decorate
c486032 (HEAD -> mynewbranch, origin/master, origin/HEAD, master) new updating master ----(４つのブランチが同じ状態でHEADだという意味)
```

###ブランチの名前変更
```bash
$ git branch -m <元ブランチネーム> <後ブランチネーム>
```

###ブランチの削除　
```bash
$ git branch -d <削除したいブランチネーム>
```

###現在のソースを変更しmasterにmergeするまで
```bash
$ git checkout -b title-chenge ----(ブランチを作成しcheckoutする)

$ mate simple.html ----(変更を行う)

$ git commit -am "changing title of html file"

$ git log --oneline
8684a30 (HEAD -> title-chenge) changing title of html file

$ git diff master title-chenge ----(マスターブランチから派生したtitle-chengeブランチがどこを変更したか)
diff --git a/simple.html b/simple.html
index ca5e908..848251d 100644
--- a/simple.html
+++ b/simple.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
 <head>
-       <title></title>
+       <title>An example website</title>
        <link rel="stylesheet" href="css/bootstrap.min.css">
        <style>
                body {

$ git checkout master

$ git merge title-chenge ----(title-chengeブランチで変更したところをmasterブランチにmerge(統合)する)
Updating c486032..8684a30
Fast-forward
 simple.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-) ----(一つのファイルが変更された。一行追加して一行削除した。)

$ git branch -d title-chenge ----(タイトルを変更するという目的は達成したので削除する)
```

###mergeの方法２
```bash
$ git merge <マージするブランチ> --no-ff
$ git log --all --graph  --decorate --oneline
*   63fdf29 (HEAD -> master) Merge branch 'add-copyright'
|\
| * 0c82b0d (add-copyright) adding copyright README
| * e9e216c adding copyright notice
|/
* 8684a30 changing title of html file
* c486032 (origin/master, origin/HEAD) new updating master
```

###自動merge: master以外のブランチを触っている時にmasterが変更されたら
```bash
$ git checkout -b sinple-changes

$ mate humans.txt ----(ファイル中身変更)

$ git commit -am "adding team member to humans.txt"

$ git checkout master

$ mate README.md ----(ファイル中身変更)

$ git commit -am "adding on how to contributes"

$ git log --all --graph  --decorate --oneline
* 601b846 (HEAD -> master) adding on how to contributes
| * e6d9757 (sinple-changes) adding team member to humans.txt
|/
*   63fdf29 Merge branch 'add-copyright'

$ git merge simple-changes -m "merging changes"

$ git log --all --graph  --decorate --oneline
*   48ff9d5 (HEAD -> master) merging changes
|\
| * e6d9757 (sinple-changes) adding team member to humans.txt
* | 601b846 adding on how to contributes
|/
*   63fdf29 Merge branch 'add-copyright'
```
これでmasterブランチ以外を編集していてmasterが更新されていても
どっちの編集も組み込むことができる。

###mergeの競合を解決する
```bash
$ git checkout -b realwork

$ mate simple.html

$ git commit -am "making changes"

$ git checkout master

$ mate simple.html

$ git commit -am "adding conflicting chages"

$ git log --all --graph  --decorate --oneline
* 7c3656a (HEAD -> master) adding conflicting chages
| * cebb784 (realwork) making changes
|/
*   48ff9d5 merging changes

$ git diff master realwork
ndex b61f92d..8952850 100644
--- a/simple.html
+++ b/simple.html
@@ -3,7 +3,7 @@
     copy right 2014 git traning
 -->
 <head>
-       <title>very respectfull website</title>
+       <title>A Greate website</title>
        <link rel="stylesheet" href="css/bootstrap.min.css">
        <style>
                body {
@@ -17,11 +17,11 @@
        <main class="container">
        <!-- Content Goes Here -->
                <p>
-                       hello world
+                       intresting
                </p>
        </main>
        <footer class="container">
-               <p>&copy; kkkkk 2014</p>
+               <p>&copy; git traning 2014</p>

$ git merge realwork ----(merge実行)
Auto-merging simple.html
CONFLICT (content): Merge conflict in simple.html ----(競合がありました)
Automatic merge failed; fix conflicts and then commit the result. ----(merge失敗)

$ cat simple.html
<!DOCTYPE html>
<!--
    copy right 2014 git traning
-->
<head>
<<<<<<< HEAD ----(masterブランチの方)
	<title>very respectfull website</title>
=======
	<title>A Greate website</title>
>>>>>>> realwork ----(realworkブランチの方)
	<link rel="stylesheet" href="css/bootstrap.min.css">
	<style>
....(以下省略)

手動で書き直す
$ git add .

$ git commit -m "done resolving merge conflict"
```
競合とは異なるブランチで同じファイルを変更してしまうこと

##リベースとは
リベースとはmaster以外のブランチ(develop branch)で作業しつつ、masterが更新されたらその状態をdevelop branchに反映させる　
develop branchにmasterの変更を組み込む。
###リベースしてみよう
```bash
$ git checkout -b myfeature

$ mate humans.txt

$ git commit -am "thanks all humans"

$ git checkout master

$ mate README.md

$ git commit -am "adding oneliner"

$ git log --all --graph  --decorate --oneline
* 155d60a (HEAD -> master) adding oneliner
| * b98a2e2 (myfeature) thanks all humans
|/
*   475946c (origin/master, origin/HEAD) done resolving merge conflict

$ git checkout myfeature

$ git rebase master
```
これで開発途中のブランチにmasterの機能をrebaseすることができた。


rebaseしようとして衝突が起きたとします。
このコマンドで実行すること衝突しそうならrebaseの処理をやめてくれる。
こうすることでで衝突によってファイルが複雑にならなくて済む。
衝突してしまったら手動でファイルを編集するしかない。
###rebaseでの衝突
```bash
$ git rebase --abort
ファイルを編集
$ git rebase --countine
```

###pullするものをrebaseしよう
```bash
①masterで何か変更する
②githubで違うファイルを変更する
$ git fetch origin master ----(githubを参照する)
$ git pull --rebase origin master ----(githubでの変更をmasterに加える)
```
masterブランチを使用している時にorigin masterが変更されたらその変更をmasterに更新させたいということ。

###stashとは
```bash
$ mate simple.html

$ git stash ----(変更をとりあえず何かに格納)

$ git status ----(変更履歴がなくなった)
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

$ mate README.md

$ git commit -am "quick fix in production"

$ git stash apply ----(格納していた変更を作業ディレクトリに持ってくる)
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   simple.html

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash list ----(格納しているリスト)
stash@{0}: WIP on master: 059c407 Merge branch 'master' of https://github.com/user-cloud/starter-web

$ git stash drop ----(格納していたものを削除)
Dropped refs/stash@{0} (071bb2eb0abddf753c9da913358de2ee56e46747)
```
stashとは変更履歴を自由に出し入れするもの
masterブランチでの変更履歴を別のブランチで適応することもできる

###masterブランチでstashし別のブランチで適応する
```bash
$ mate test.py ----(master branchにて変更を加える)

$ git stash

$ git checkout -b test-branch

$ git stash list
stash@{0}: WIP on master: 495019e jajfoiajgoihaoghoapdating

$ git stash pop ----(変更を適応)

$ git commit -am "changeing test.py"

$ git checkout master

$ cat test.py ----(最初の変更はなかったことになっている)
```


###stashを空にする
```bash
$ git stash clear
```

###stashを適応する、リストからは削除されない
```bash
$ git stash apply stash@{1} ----(リストの２つめを適応する)
```

###stashを取り出す,取り出したらリストから削除される
```bash
$ git stash pop
```

###stashのヘルプをみる
```bash
$ git help stash
```

###タグ付けする
```bash
$ git tag mytag

$ git hist ----(aliasを使用)
* cb02582 (HEAD -> master, tag: mytag, origin/master, origin/HEAD) add commit

$ git tag --list
mytag

$ git show mytag ----(タグの詳細表示)
commit cb02582ef7f76c4e7dde1aeeae4487b1c4cdfe12 (HEAD -> master, tag: mytag, origin/master, origin/HEAD)
Author: user-cloud <user mailaddressm>
Date:   Mon Jun 15 18:46:40 2020 +0900

    add commit

diff --git a/humans.txt b/humans.txt
index 24a4a36..d7ec90f 100644
--- a/humans.txt

$ git tag --delete mytag ----(タグの削除)
```
タグ付けはコミットしたものにつけることができる

###注釈付きタグ
```bash
$ git tag -a v-1.0
```

###タグ比較
```bash
$ git diff v-1.0 v-1.2
```
タグ名で比較ができる

###特定のコミットにタグをつける
```bash
$ git tag -a v-0.9 <commit ID>
```

###タグの場所を変更する
```bash
$ git tag -a v-0.9 -f <commit ID>
```

###タグをpushする
```bash
$ git push origin <tag name>

$ git push origin master --tags ----(全てのタグをpush)

$ git push origin master :<tag name> ----(githubのタグを削除する)
```