Posted at

Git入門


はじめに

改めてGITを勉強したので、備忘録として残しておきます。


Git

Gitとは分散型バージョン管理システムのことで、Linuxのソースコードを効果的に管理するために作られた。

Gitを使うメリット

・編集前のファイルの状態に戻すことができる。

・チームで開発する場合、他人の編集内容を知らず識らずのうちに上書きしてしまうとった問題を回避できる。


リポジトリ

ファイルやディレクトリの状態を管理する場所。

リポジトリ下に置くことで変更履歴を管理できる。

リモートリポジトリは専用のサーバに配置して複数人で共有するためのもの。

ローカルリポジトリは自分のマシン上にある、一人一人が管理するもの。


コミット

コミットとは、ファイルやディレクトリの追加・変更をリポジトリに記録する操作のこと。

コミットにより、前回コミット時の状態と現在の状態の差分の記録がコミット(リビジョン)として記録される。

このコミット時にはメッセージが必要となり内容は変更内容の要約+変更した理由になる。


ワークツリーとインデックス(ステージングエリア)

Gitの管理下に置かれた、みなさんが実際に作業をしているディレクトリのことをワークツリーという。

Gitにはインデックスというものがあり、コミットを実行した時にワークツリーから直接リポジトリ内に状態を記録するのでなく、その間に設けられているインデックスの設定された状態を記録するようになっている。

基本的に以下の三つの状態になる。

1:作業ディレクトリ

↓git add

2:ステージングエリア(インデックス)

↓git commit

3:リポジトリ


初期設定

#名前、メールアドレス設定、設定確認

$ git config --global user.name "Kazuma Horikawa"
$ git config --global user.email "horikazu1397@gmail.com"
$ git config --global color.ui true
$ git config -l


git init

リポジトリを新規作成または再初期化する

$ git init

Initialized empty Git repository in /Users/×××/Desktop/test/.git/


git log

コミットのログを確認する

$ git log

commit da4××××××××××× (HEAD -> master)
Author: ×××××× <×××××@gmail.com>
Date: Sat Jun 22 10:42:34 2019 +0900

new commit

$ git log --oneline (一行でログを確認)
da45938 (HEAD -> master) new commit

$ git log -p (ログに加えてどこが変更されたかを表示)
commit da4××××××××××× (HEAD -> master)
Author: ×××××× <×××××@gmail.com>
Date: Sat Jun 22 10:42:34 2019 +0900

new commit
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..1ffa548
--- /dev/null
+++ b/index.html
@@ -0,0 +1 @@
+hi from test

$ git log --stat (ログに加えてどのファイルが変更されたか)
commit da4××××××××××× (HEAD -> master)
Author: ×××××× <×××××@gmail.com>
Date: Sat Jun 22 10:42:34 2019 +0900

new commit
index.html | 1 +
1 file changed, 1 insertion(+)


git status

作業ディレクトリ(add、ステージングエリアの前)で状態を確認できる。

checkout/addで編集できる。

$ git status

On branch master
nothing to commit, working tree clean

この表示はステージングエリアに何もないということ

$ vim status.html

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

status.html

この表示はコミットするためにはgit addをしてくださいと言っている


git diff

作業ディレクトリ(add、ステージングエリアの前)で変更を確認できる。

$ git diff

diff --git a/index.html b/index.html
index 1ffa548..d288de7 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
hi from test
+confirm diff

addしてステージングエリアのファイルを確認する場合は、オプションで--cachedをつける

git diff --cashed

ファイルを削除・移動する場合は、

git rm/mv

とする。


.gitignore

指定したファイルをコミットしないようにする。

vimでワイルドカードを用いて編集し、

*.log

のようにすると、.log系のファイルはaddされない。

.gitignoreが適用される範囲はどうディレクトリと下位ディレクトリで、主な用途としてはセキュリティ上見られたくないものやファイルが大きくて上げる必要がないものに使われる。

$ vim test.log

$ vim .gitignore
*.log

↑により、test.logはコミットされない。


git commit --amend

直前のコミットを変更したいがlogはそのままでいい場合に使う。

コミットメッセージが開き、変更するか問われる。


git reset

addまでして前のコミットの状態にしたい時、logを指定して戻ることができる。

git reset --hard HEAD

HEADまたは直接logの値を指定できる

git reset --hard ORIG_HEAD

とすることでコミットデータが戻る

$ git reset --hard HEAD

HEAD is now at 5a6fd32 new

$ cat index.html
hi from test
confirm diff

$ git reset --hard HEAD^(HEADのもう一つ前)
HEAD is now at da45938 new commit

$ cat index.html
hi from test

$ git reset --hard ORIG_HEAD
HEAD is now at 5a6fd32 new


git branch

git branch

で現在の状況を確認できる。標準はmaster

git branch hoge

でブランチ作成

git checkout hoge

でブランチ移動

または作成・移動は

git checkout -b hoge

とする

$ git branch

* master

$ git branch hoge

$ git branch
hoge
* master
*
$ git checkout hoge
Switched to branch 'hoge'

$ git branch
* hoge
master

$ git checkout -b hogehoge
Switched to a new branch 'hogehoge'

$ git branch
hoge
* hogehoge
master


git merge

masterにブランチを同期させる。

git merge hoge

上記でいえば、hogeでの編集内容をmasterに同期することができる。

git branch -d hoge

で削除できる

$ git branch

hoge
* master

$ git checkout hoge
Switched to branch 'hoge'

$ vim hoge.html

$ git add .

$ git commit -m"commit from hoge"
[hoge a3d9e3e] from hoge
1 file changed, 1 insertion(+)
create mode 100644 hoge.html

$ git log
commit a3d××××××××(HEAD -> hoge)
Author: ×××× <×××@gmail.com>
Date: Sat Jun 22 11:04:05 2019 +0900

from hoge

commit 5a6××××××××(master)
Author: ××× <×××@gmail.com>
Date: Sat Jun 22 10:52:59 2019 +0900

  cmmit from master

$ git checkout master
Switched to branch 'master'

$ git merge hoge
Updating 5a..a3e
Fast-forward
hoge.html | 1 +
1 file changed, 1 insertion(+)
create mode 100644 hoge.html

$ git log
commit a3d×××× (HEAD -> master, hoge)
Author: ××× <×××@gmail.com>
Date: Sat Jun 22 11:04:05 2019 +0900

from hoge


CONFLICT

同じファイルを違うブランチで編集してマージするとコンフリクト(衝突)が起きる

git statusで確認できる

この場合はvimでコンフリクトが起きている箇所を直接編集する。


git tag

logの値の羅列に対して名前をつけることができる。

git tag v1.0

↑直近のコミットをv1.0という名前にした。

git show v1.0

でコミット内容確認できる。

git tag -d v1.0

でタグを削除できる。

$ git tag v1.0

$ git show v1.0
commit a3d××× (HEAD -> master, tag: v1.0, hoge)
Author: ××× <×××@gmail.com>
Date: Sat Jun 22 11:04:05 2019 +0900

from hoge

diff --git a/hoge.html b/hoge.html
new file mode 100644
index 0000000..45b983b
--- /dev/null
+++ b/hoge.html
@@ -0,0 +1 @@
+hi

$ git tag -d v1.0
Deleted tag 'v1.0' (was a3d9e3e)


alias

aliasを使うことでコマンドに短縮名をつけることができる

checkoutにcoという略称をつけたい

git config --global alias.co checkout

branchにbrという略称をつけたい

git config --global alias.br branch

$ git config --global alias.st status

$ git st
On branch master
nothing to commit, working tree clean

$ git config -l(aliasの確認)
...
alias.st=status
...


共有リポジトリ

共有リポジトリをinitする場合は--bare/sharedというオプションが必要になる

git init --bare --shared

git remote add origin リモートリポジトリのパス

でリポートリポジトリを指定する。

git push origin master

で内容をプッシュすることができ、

git pull origin master

で内容をプルできる

git congig -l

でリモートリポジトリの場所やaliasを確認することができる。