コマンドラインでGit入門

Gitに関しても過去記事まとめしていきます。

スポンサーリンク

Git入門

Gitの入手とインストール

Windows

後日更新予定です。

Linux(Debian)

後日更新予定です。

Mac

後日更新予定です。

Gitバージョン確認

定番の–versionで確認できます。

takk~$ git --version
git version 2.20.1
takk~$

Gitレポジトリ作成

Git レポジトリの作成

ものすごく簡単です。ディレクトリを作成し、git initをするだけです。
tmp/repos/workというディレクトリを作成して、それをレポジトリにしたいと思います。

takk~$ mkdir -p tmp/repos/work
takk~$ cd !$
cd tmp/repos/work
takk~/tmp/repos/work$

これでレポジトリ用のディレクトリが作成できました。
次は今作成したディレクトリをレポジトリにしてみます。

takk~/tmp/repos/work$ git init
Initialized empty Git repository in /home/takk/tmp/repos/work/.git/
takk~/tmp/repos/work$ ls
takk~/tmp/repos/work$

これだけです。
空のGitレポジトリを初期化しましたっていうメッセージが表示されましたね。

lsしても何も出てこないのは、管理ファイルが隠しファイルだからです。ls -aで確認してみます。

takk~/tmp/repos/work$ ls -a
.  ..  .git
takk~/tmp/repos/work$

できてますね。試しに何かファイルを追加してコミットしてみます。

takk~/tmp/repos/work$ echo AAA > file1.txt
takk~/tmp/repos/work$ git add file1.txt
takk~/tmp/repos/work$ git commit -m "first commit"
[master (root-commit) 084f6f8] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 file1.txt
takk~/tmp/repos/work$ git log --oneline
084f6f8 (HEAD -> master) first commit
takk~/tmp/repos/work$

コミットもできて、ログの確認もできました。

Git ベアレポジトリの作成

次は、ベアレポジトリ(Bare Repository)を作成してみます。さきほどのディレクトリは一旦削除して最初から作成です。

takk~$ cd
takk~$ rm -rf tmp
takk~$ ls
takk~$ mkdir -p tmp/repos/work
takk~$ cd !$
cd tmp/repos/work
takk~/tmp/repos/work$

ではベアレポジトリを作ります。–bareオプションを指定するだけです。

takk~/tmp/repos/work$ git init --bare
Initialized empty Git repository in /home/takk/tmp/repos/work/
takk~/tmp/repos/work$

ホームのtmp/repos/workが、ベアレポジトリになりました。
ls -aで管理ディレクトリを確認してみます。

takk~/tmp/repos/work/tmp/repos/work$ ls -a
.  ..  branches  config  description  HEAD  hooks  info  objects  refs
takk~/tmp/repos/work/tmp/repos/work$

あれ、今度は.gitディレクトリじゃありませんね。
ベアレポジトリは、実際にファイルの追加、コミットといったバージョン管理する作業場ではなく、レポジトリしかないベア(裸)なレポジトリなので、本当の管理でディレクトリしか存在しません。
じゃあどうやって使うのかというと、クローンして使います。
また、–bareをつけないレポジトリと、–bareを付けて作成したベアレポジトリは、両方とも外から見るとディレクトリなので、区別つきません。
なので分かりやすくベアレポジトリの方は、ディレクトリ名に.gitとつけるのが通例のようです。

git clone レポジトリのクローン作成

では、さきほど作ったベアレポジトリのURLを指定してクローンのレポジトリを作成してみます。

takk~/tmp/repos/work$ cd ~/tmp
takk~/tmp$ mkdir A
takk~/tmp$ cd A
takk~/tmp/A$ git clone file:///home/takk/tmp/repos/work
Cloning into 'work'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
takk~/tmp/A$ ls
work
takk~/tmp/A$

ではworkの中を見てみましょう。

takk~/tmp/A$ cd work
takk~/tmp/A/work$ ls
takk~/tmp/A/work$

空ですね。実は隠しフォルダが存在します。

takk~/tmp/A/work$ ls -a
.  ..  .git
takk~/tmp/A/work$

この.gitディレクトリがあるディレクトリが、クローンされたレポジトリです。
このディレクトリの中で、ファイルやディレクトリを作って、コミットして、バージョン管理していきます。

最初にユーザ名とメールアドレスの設定をしましょう。現在のgitのコンフィグを確認。

takk~/tmp/A/work$ git config --list
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=file:///home/takk/tmp/repos/work
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
takk~/tmp/A/work$

ユーザ名とメールアドレスを設定します。

takk~/tmp/A/work$ git config --global user.name "takk"
takk~/tmp/A/work$ git config --global user.email "takk@xxxxxxxx.xxx.xxx"
takk~/tmp/A/work$

設定されたコンフィグを確認してみます。

takk~/tmp/A/work$ git config --list | grep user
user.name=takk
user.email=takk@xxxxxxxx.xxx.xxx
takk~/tmp/A/work$

ばっちりです。

では、gitコマンドを使ってみます。

takk~/tmp/A/work$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
takk~/tmp/A/work$

まだコミットがありません。そして「On branch master」は、現在のブランチがmasterであること示しています。
新しいレポジトリを作ってクローンしたとき、カレントブランチとして必ずmasterになっています。
branchコマンドでも確認してみます。branchコマンドは新しくブランチを作ったり、削除したり、ブランチのリストを表示してくれるコマンドです。
引数をつけないとブランチのリストを表示します。

takk~/tmp/A/work$ git branch
takk~/tmp/A/work$

何も表示されませんね。そうなんです。何かファイルをコミットするまでリスト表示されません。
では、ファイルを作ってみましょう。

takk~/tmp/A/work$ echo HELLO > file1.txt
takk~/tmp/A/work$ git status
On branch master

Initial commit

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

	file1.txt

nothing added to commit but untracked files present (use "git add" to track)
takk~/tmp/A/work$

作ったばかりのファイルは、Untracked fileとなっており、管理外のファイルです。
このファイルをGit管理下にしてみましょう。git addを使います。

takk~/tmp/A/work$ git add file1.txt
takk~/tmp/A/work$ git status
On branch master

No commits yet

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

	new file:   file1.txt

takk~/tmp/A/work$

ではコミットします。

takk~/tmp/A/work$ git commit -m "first commit"
[master (root-commit) d4b39ba] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 file1.txt
takk~/tmp/A/work$

git branchはどうなってでしょうか。

takk~/tmp/A/work$ git branch
* master
takk~/tmp/A/work$

masterと表示されました。コミットログも表示してみましょう。

takk~/tmp/A/work$ git log
commit 4fc174dea3712dcd0ac64d6a36e2f88857a82bc9 (HEAD -> master)
Author: takk <takk@xxxxxxxx.xxx.xxx>
Date:   Wed Apr 8 23:20:09 2020 +0900

    first commit
takk~/tmp/A/work$

さきほど-mオプションで書いたログが表示されました。ちゃんとユーザ名とメールアドレスもありますね。

git commit コミット

さきほどはレポジトリを作成し、初回のコミットを済ませました。
再度ファイルを修正してコミットしてみます。

takk~/tmp/A/work$ cat file1.txt
HELLO
takk~/tmp/A/work$ echo SEE YOU >> file1.txt
takk~/tmp/A/work$ cat file1.txt
HELLO
SEE YOU
takk~/tmp/A/work$

ファイルの修正をしました。git statusを確認してみます。

takk~/tmp/A/work$ git status
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

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:   file1.txt

no changes added to commit (use "git add" and/or "git commit -a")
takk~/tmp/A/work$

ファイルが修正されていることを示す、「modifiled」が表示されています。
次に、この修正ファイルをステージします。ステージすると指定したファイルをコミットする準備ができます。

takk~/tmp/A/work$ git add file1.txt
takk~/tmp/A/work$ git status
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

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

	modified:   file1.txt

takk~/tmp/A/work$

ではコミットします。

takk~/tmp/A/work$ git commit -m "second commit"
[master 0c17b0d] second commit
 1 file changed, 1 insertion(+)
takk~/tmp/A/work$

ログを確認してみましょう。

takk~/tmp/A/work$ git log
commit 0c17b0d36e71a89298bd1d46575d0ab3ff2be8dc (HEAD -> master)
Author: takk <takk@xxxxxxxx.xxx.xxx>
Date:   Wed Apr 8 23:36:19 2020 +0900

    second commit

commit 4fc174dea3712dcd0ac64d6a36e2f88857a82bc9
Author: takk <takk@xxxxxxxx.xxx.xxx>
Date:   Wed Apr 8 23:20:09 2020 +0900

    first commit
takk~/tmp/A/work$

git branch ブランチ作成

git branchでブランチを作成できます。
ブランチを作ってみます。

takk~/tmp/A/work$ git branch b-1
takk~/tmp/A/work$

これでb-1ブランチができました。
確認してみましょう。引数をつけずにgit branchを使えば、ブランチのリストが表示されます。

takk~/tmp/A/work$ git branch
  b-1
* master
takk~/tmp/A/work$

b-1と、masterがあり、masterに *がついています。
*は、カレントブランチを表します。

git checkout ブランチ変更

git checkoutで、カレントブランチが変更できます。

さきほど作ったb-1ブランチに変更してみます。

takk~/tmp/A/work$ git checkout b-1
Switched to branch 'b-1'
takk~/tmp/A/work$ git branch
* b-1
  master
takk~/tmp/A/work$

ではこのブランチでファイルを修正し、コミットしてみます。

takk~/tmp/A/work$ cat file1.txt
HELLO
SEE YOU
takk~/tmp/A/work$ echo 12345 >> file1.txt
takk~/tmp/A/work$ git add file1.txt
takk~/tmp/A/work$ git commit -m "3rd commit"
[b-1 c3f7bc5] 3rd commit
 1 file changed, 1 insertion(+)
takk~/tmp/A/work$

logを確認します。–onelineオプションで短いログを確認しましょう。

takk~/tmp/A/work$ git log --oneline
c3f7bc5 (HEAD -> b-1) 3rd commit
0c17b0d (master) second commit
4fc174d first commit
takk~/tmp/A/work$

ログを見ると分かりますが、「3rd commit」のみ、b-1ブランチでコミットされています。
ブランチをmasterに戻してみます。

takk~/tmp/A/work$ git checkout master
Switched to branch 'master'
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)
takk~/tmp/A/work$

ログも見てみましょう。

takk~/tmp/A/work$ git log --oneline
0c17b0d (HEAD -> master) second commit
4fc174d first commit
takk~/tmp/A/work$

masterにはコミットしていないので、「3rd commit」がありませんね。

git diff 修正差分を見る

ファイル修正していないときに、git diffを使うと、

takk~/tmp/A/work$ git diff
takk~/tmp/A/work$

何も表示されません。

ファイル修正してみます。

takk~/tmp/A/work$ cat file1.txt
HELLO
SEE YOU
takk~/tmp/A/work$ echo GOOD NIGIT >> file1.txt
takk~/tmp/A/work$

もう一度git diff。

takk~/tmp/A/work$ git diff
diff --git a/file1.txt b/file1.txt
index 596219a..1bf565f 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1,2 +1,3 @@
 HELLO
 SEE YOU
+GOOD NIGIT
takk~/tmp/A/work$

コミットされている最新ファイルの内容と、さきほど修正したファイルの内容が比較され、
差分が表示されました。
+(プラス)の記号がついている行が、追加された行です。

Git 修正ファイルを元に戻す

修正したファイルを元に戻してみます。
git diffで修正内容を確認。

takk~/tmp/A/work$ git diff
diff --git a/file1.txt b/file1.txt
index 596219a..1bf565f 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1,2 +1,3 @@
 HELLO
 SEE YOU
+GOOD NIGIT
takk~/tmp/A/work$

ではgit checkoutを使って元に戻します。

takk~/tmp/A/work$ git checkout file1.txt
takk~/tmp/A/work$

これで戻りました。git diffを実行してみます。

takk~/tmp/A/work$ git diff
takk~/tmp/A/work$

git reset ステージの取り消し(addの取り消し)

ファイル修正、addしてみます。

takk~/tmp/A/work$ echo BBB >> file1.txt
takk~/tmp/A/work$ git add file1.txt
takk~/tmp/A/work$

ステージしたファイルは、git diffで差分は表示されません。

takk~/tmp/A/work$ git diff
takk~/tmp/A/work$

git resetしてみます。

takk~/tmp/A/work$ git reset
Unstaged changes after reset:
M	file1.txt
takk~/tmp/A/work$

この後に、git diffを見ると、

takk~/tmp/A/work$ git diff
diff --git a/file1.txt b/file1.txt
index 596219a..0af9364 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1,2 +1,3 @@
 HELLO
 SEE YOU
+BBB
takk~/tmp/A/work$

add前に戻りました。
この状態からgit checkoutでファイル名を指定すると、修正前に戻ります。

コメント

タイトルとURLをコピーしました