SlideShare une entreprise Scribd logo
1  sur  75
Télécharger pour lire hors ligne
Git 入門 
2014/11/04 社内勉強会資料1
話すことと話さないこと 
話すこと 
◦ ローカルリポジトリでの作業の流れ 
◦ ブランチとマージ 
◦ リモートリポジトリを使う作業の流れ 
話さないこと 
◦ Git が提供するさまざまなコマンドの解説 
◦ GUI クライアントやIDE のプラグインの使い方 
◦ Git の開発モデル(git-flow とか) 
◦ その他諸々 
このスライドの内容はgit 1.8.3.1 で確認しています 
2014/11/04 社内勉強会資料2
ローカルリポジトリ 
~個人用バージョン管理システムとして~ 
2014/11/04 社内勉強会資料3
リポジトリを作成する 
git init 
$ pwd 
/home/y-uti/proj 
$ git init 
Initialized empty Git repository in /home/y-uti/proj/.git/ 
$ ls -a 
./ ../ .git/ 
◦ 管理ディレクトリが作成される 
2014/11/04 社内勉強会資料4
ユーザ情報を登録する 
git config 
$ git config user.email 'y-uti@mycompany.com' 
$ git config user.name 'y-uti' 
$ git config -l 
core.repositoryformatversion=0 
core.filemode=true 
core.bare=false 
core.logallrefupdates=true 
user.email=y-uti@mycompany.com 
user.name=y-uti 
◦ 設定しておかないとコミットするときに怒られる 
2014/11/04 社内勉強会資料5
Git の作業フロー 
作成 
編集 
削除 
ステージコミット 
2014/11/04 社内勉強会資料6
ファイルを作成する 
好きなエディタを開いて自由にファイルを作成する 
$ vi README 
Git 入門 
$ ls -a 
./ ../ .git/ README 
2014/11/04 社内勉強会資料7
状態を確認する 
git status 
$ git status 
# On branch master 
# 
# Initial commit 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be 
committed) 
# 
# README 
nothing added to commit but untracked files present (use 
"git add" to track) 
2014/11/04 社内勉強会資料8
ステージする 
git add 
$ git add README 
$ git status 
# On branch master 
# 
# Initial commit 
# 
# Changes to be committed: 
# (use "git rm --cached <file>..." to unstage) 
# 
# new file: README 
# 
2014/11/04 社内勉強会資料9
コミットする 
git commit 
$ git commit -m 'README を作成' 
[master (root-commit) 1fd89c5] README を作成 
1 file changed, 1 insertion(+) 
create mode 100644 README 
$ git status 
# On branch master 
nothing to commit, working directory clean 
2014/11/04 社内勉強会資料10
ファイルを編集する 
好きなエディタを開いて自由にファイルを編集する 
$ vi README 
Git 入門 
Git はとても難しい 
2014/11/04 社内勉強会資料11
状態を確認する 
git status 
$ git status 
# On branch master 
# 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: README 
# 
no changes added to commit (use "git add" and/or "git 
commit -a") 
◦ ここでgit commit しても変更はコミットされない 
2014/11/04 社内勉強会資料12
ステージする 
git add 
$ git add README 
$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: README 
# 
◦ ここでgit commit すれば変更がコミットされる 
◦ が、次のスライドでちょっと寄り道してみましょう 
2014/11/04 社内勉強会資料13
さらにファイルを編集する 
好きなエディタを開いて自由にファイルを編集する 
$ vi README 
Git 入門 
Git はとても難しい 
Git は難しすぎる 
2014/11/04 社内勉強会資料14
状態を確認する 
git status 
$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: README 
# 
# 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: README 
# 
◦ 二箇所に出てくる 
2014/11/04 社内勉強会資料15
今どうなっているのか 
作業ディレクトリステージング領域リポジトリ(の最新) 
Git 入門 
Git 入門 
Git 入門 
Git はとても難しい 
Git はとても難しい 
Git は難しすぎる 
2014/11/04 社内勉強会資料16
差分を確認する 
From: ステージング領域 
To: 作業ディレクトリ 
作業ディレクトリステージング領域リポジトリ(の最新) 
Git 入門 
Git 入門 
Git 入門 
Git はとても難しい 
Git はとても難しい 
Git は難しすぎる 
$ git diff 
diff --git a/README b/README 
index a1247d5..7ffac0f 100644 
--- a/README 
+++ b/README 
@@ -1,2 +1,3 @@ 
Git 入門 
Git はとても難しい 
+Git は難しすぎる 
2014/11/04 社内勉強会資料17
差分を確認する 
From: リポジトリの最新 
To: 作業ディレクトリ 
作業ディレクトリステージング領域リポジトリ(の最新) 
Git 入門 
Git 入門 
Git 入門 
Git はとても難しい 
Git はとても難しい 
Git は難しすぎる 
$ git diff HEAD 
diff --git a/README b/README 
index 4dfa228..7ffac0f 100644 
--- a/README 
+++ b/README 
@@ -1 +1,3 @@ 
Git 入門 
+Git はとても難しい 
+Git は難しすぎる 
2014/11/04 社内勉強会資料18
差分を確認する 
From: リポジトリの最新 
To: ステージング領域 
作業ディレクトリステージング領域リポジトリ(の最新) 
Git 入門 
Git 入門 
Git 入門 
Git はとても難しい 
Git はとても難しい 
Git は難しすぎる 
$ git diff --cached 
diff --git a/README b/README 
index 4dfa228..a1247d5 100644 
--- a/README 
+++ b/README 
@@ -1 +1,2 @@ 
Git 入門 
+Git はとても難しい 
2014/11/04 社内勉強会資料19
コミットする 
git commit 
$ git commit -m 'README を編集' 
[master ac1ee4a] README を編集 
1 file changed, 1 insertion(+) 
$ git status 
# On branch master 
# 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: README 
# 
no changes added to commit (use "git add" and/or "git commit -a") 
◦ "nothing to commit, working directory clean" にはならない 
2014/11/04 社内勉強会資料20
何が起きたのか 
コミット前 
作業ディレクトリステージング領域リポジトリ(の最新) 
Git 入門 
Git 入門 
Git 入門 
Git はとても難しい 
Git はとても難しい 
Git は難しすぎる 
コミット後 
作業ディレクトリステージング領域リポジトリ(の最新) 
Git 入門 
Git 入門 
Git 入門 
Git はとても難しい 
Git はとても難しい 
Git はとても難しい 
Git は難しすぎる 
◦ git commit はステージング領域をリポジトリに反映するだけ 
2014/11/04 社内勉強会資料21
ステージを取り消す 
大切な余談 
作業ディレクトリステージング領域リポジトリ(の最新) 
Git 入門 
Git 入門 
Git 入門 
Git はとても難しい 
Git はとても難しい 
Git は難しすぎる 
$ git reset README 
Unstaged changes after reset: 
M README 
作業ディレクトリステージング領域リポジトリ(の最新) 
Git 入門 
Git 入門Git 入門 
Git はとても難しい 
Git は難しすぎる 
◦ リポジトリの最新の内容をステージング領域に取得 
2014/11/04 社内勉強会資料22
大切な余談 
未ステージの変更を取消す 
作業ディレクトリステージング領域リポジトリ(の最新) 
Git 入門 
Git 入門 
Git 入門 
Git はとても難しい 
Git はとても難しい 
Git は難しすぎる 
$ git checkout -- README 
作業ディレクトリステージング領域リポジトリ(の最新) 
Git 入門 
Git 入門 
Git 入門 
Git はとても難しい 
Git はとても難しい 
◦ ステージング領域の内容を作業ディレクトリに取得 
2014/11/04 社内勉強会資料23
ブランチとマージ 
~コミットで作られるグラフ構造を理解する~ 
2014/11/04 社内勉強会資料24
その前に 
作業ディレクトリを掃除しておきます 
$ git reset --hard 
HEAD is now at ac1ee4a README を編集 
◦ git reset --hard = git reset + git checkout 
◦ リポジトリの最新をステージング領域に取得 
◦ ステージング領域を作業ディレクトリに取得 
それぞれの内容はこのようになっている(としましょう) 
作業ディレクトリステージング領域リポジトリ(の最新) 
Git 入門 
Git 入門 
Git 入門 
Git はとても難しい 
Git はとても難しい 
Git はとても難しい 
2014/11/04 社内勉強会資料25
コミットの履歴を確認する 
git log 
$ git log 
commit ac1ee4a27ec36764178ef73f2490270e87610cc6 
Author: y-uti <y-uti@mycompany.com> 
Date: Sat Nov 1 15:08:44 2014 +0900 
README を編集 
commit 1fd89c51a0946827c77c357dfe3287e2e96af875 
Author: y-uti <y-uti@mycompany.com> 
Date: Sat Nov 1 13:50:48 2014 +0900 
README を作成 
2014/11/04 社内勉強会資料26
コミットの履歴を確認する 
git log --graph --oneline --decorate=full 
$ git log --graph --oneline --decorate=full 
* ac1ee4a (HEAD, refs/heads/master) README を編集 
* 1fd89c5 README を作成 
HEAD master 
ac1ee4a 
READMEを編集 
1fd89c5 
READMEを作成 
2014/11/04 社内勉強会資料27
ブランチを作成する 
git branch 
$ git branch foo 
$ git log --graph --oneline --decorate=full 
* ac1ee4a (HEAD, refs/heads/master, refs/heads/foo) README 
を編集 
* 1fd89c5 README を作成 
HEAD master foo 
ac1ee4a 
READMEを編集 
1fd89c5 
READMEを作成 
2014/11/04 社内勉強会資料28
ブランチを一覧表示する 
git branch 
$ git branch 
foo 
* master 
◦ ブランチを作成しただけでは現在のブランチは切り替わらない 
HEAD master foo 
ac1ee4a 
READMEを編集 
1fd89c5 
READMEを作成 
2014/11/04 社内勉強会資料29
ブランチを切り替える 
git checkout 
$ git checkout foo 
Switched to branch 'foo' 
$ git branch 
* foo 
master 
master foo HEAD 
ac1ee4a 
READMEを編集 
1fd89c5 
READMEを作成 
2014/11/04 社内勉強会資料30
ブランチで作業する 
各ブランチで適当に作業してコミットする 
$ echo foo >foo.txt 
$ git add foo.txt 
$ git commit -m 'foo.txt を作成' 
$ git checkout master 
$ ls 
README 
$ echo master >master.txt 
$ git add master.txt 
$ git commit -m 'master.txt を作成' 
◦ master ブランチにはfoo.txt が存在していないことに注目 
2014/11/04 社内勉強会資料31
今どうなっているのか 
HEAD master foo 
5e8d07f 
master.txtを作成 
ac1ee4a 
READMEを編集 
1fd89c5 
READMEを作成 
4f5c71b 
foo.txtを作成 
2014/11/04 社内勉強会資料32
ブランチをマージする 
git merge 
$ git merge foo 
Merge branch 'foo' 
# Please enter a commit message to explain why this merge is necessary, 
# especially if it merges an updated upstream into a topic branch. 
# 
# Lines starting with '#' will be ignored, and an empty message aborts 
# the commit. 
◦ エディタでコミットメッセージを入力するとマージが実行される 
Merge made by the 'recursive' strategy. 
foo.txt | 1 + 
1 file changed, 1 insertion(+) 
create mode 100644 foo.txt 
2014/11/04 社内勉強会資料33
マージ結果を確認する 
git log を使う 
$ ls 
README foo.txt master.txt 
$ git log --graph --oneline --decorate=full 
* cbf2105 (HEAD, refs/heads/master) Merge branch 'foo' 
|¥ 
| * 4f5c71b (refs/heads/foo) foo.txt を作成 
* | 5e8d07f master.txt を作成 
|/ 
* ac1ee4a README を編集 
* 1fd89c5 README を作成 
◦ マージも一つのコミット 
2014/11/04 社内勉強会資料34
衝突 
各ブランチで適当にファイルを編集して衝突させる 
$ git checkout foo 
$ echo foo >>README 
$ git commit -am 'README を編集(foo)' 
$ git checkout master 
$ echo master >>README 
$ git commit -am 'README を編集(master)' 
$ git merge foo 
Auto-merging README 
CONFLICT (content): Merge conflict in README 
Automatic merge failed; fix conflicts and then commit the 
result. 
2014/11/04 社内勉強会資料35
衝突を解決する 
衝突箇所を編集してからgit add してgit commit する 
$ cat README 
Git 入門 
Git はとても難しい 
<<<<<<< HEAD 
master 
======= 
foo 
>>>>>>> foo 
$ vi README 
$ git add README 
$ git commit 
[master 247be48] Merge branch 'foo' 
2014/11/04 社内勉強会資料36
今どうなっているのか 
HEAD master 
815bb4d 
READMEを編集(master) 
cbf2105 
Merge branch 'foo' 
5e8d07f 
master.txtを作成 
ac1ee4a 
READMEを編集 
1fd89c5 
READMEを作成 
247be48 
Merge branch 'foo' 
foo 
f966ea7 
READMEを編集(foo) 
4f5c71b 
foo.txtを作成 
* 247be48 Merge branch 'foo' 
|¥ 
| * f966ea7 README を編集(foo) 
* | 815bb4d README を編集(master) 
* | cbf2105 Merge branch 'foo' 
|¥ ¥ 
| |/ 
| * 4f5c71b foo.txt を作成 
* | 5e8d07f master.txt を作成 
|/ 
* ac1ee4a README を編集 
* 1fd89c5 README を作成 
2014/11/04 社内勉強会資料37
大切な余談 
衝突の解決を諦めて戻す 
衝突する予定のなかったgit merge で衝突して途方に暮れたら 
$ git reset --hard 
HEAD is now at 815bb4d README を編集(master) 
◦ 明日やることにして帰って寝る 
2014/11/04 社内勉強会資料38
fast-forward マージ 
引き続きmaster ブランチでファイルを編集する 
$ echo edited >>master.txt 
$ git commit -am 'master.txt を編集' 
[master d77e388] master.txt を編集 
1 file changed, 1 insertion(+) 
2014/11/04 社内勉強会資料39
今どうなっているのか 
HEAD master 
815bb4d 
READMEを編集(master) 
cbf2105 
Merge branch 'foo' 
5e8d07f 
master.txtを作成 
ac1ee4a 
READMEを編集 
d77e388 
master.txt を編集 
247be48 
Merge branch 'foo' 
foo 
f966ea7 
READMEを編集(foo) 
4f5c71b 
foo.txtを作成 
2014/11/04 社内勉強会資料40
fast-forward マージ 
master の変更をfoo ブランチにマージする 
◦ 今までと逆 
$ git checkout foo 
Switched to branch 'foo' 
$ git merge master 
Updating f966ea7..d77e388 
Fast-forward 
README | 1 + 
master.txt | 2 ++ 
2 files changed, 3 insertions(+) 
create mode 100644 master.txt 
◦ コミットメッセージの入力も無いまま勝手にマージが完了する 
2014/11/04 社内勉強会資料41
このようにはならない 
foo HEAD 
d77e388 
master.txt を編集 
master 
247be48 
Merge branch 'foo' 
815bb4d 
READMEを編集(master) 
cbf2105 
Merge branch 'foo' 
??????? 
Merge branch 'master' 
この間でfoo 側にコミットがないので 
??????? はd77e388 と差がない 
f966ea7 
READMEを編集(foo) 
2014/11/04 社内勉強会資料42
こうなる 
d77e388 
master.txt を編集 
master foo HEAD 
247be48 
Merge branch 'foo' 
815bb4d 
READMEを編集(master) 
cbf2105 
Merge branch 'foo' 
f966ea7 
READMEを編集(foo) 
2014/11/04 社内勉強会資料43
リモートリポジトリ 
~みんなで使う分散バージョン管理システム~ 
2014/11/04 社内勉強会資料44
その前に 
今まで作業したリポジトリを共有しておきます 
$ pwd 
/home/y-uti 
$ git clone --bare proj proj.git 
$ cd proj.git 
$ git remote remove origin 
◦ /home/y-uti/proj.git にリモートリポジトリが作成された 
◦ 中身は今まで作業してきたローカルリポジトリのコピー 
2014/11/04 社内勉強会資料45
開発者Bob がいます 
ということにしましょう 
$ mkdir ~/bob 
Bob は開発を進めるためリモートリポジトリを取得します 
$ cd ~/bob 
$ git clone ~/proj.git 
Cloning into 'proj'... 
done. 
$ git config user.email 'bob@mycompany.com' 
$ git config user.name Bob 
$ git config push.default simple 
◦ 最後の一行はオマジナイ(書かないと後で文句を言われる) 
2014/11/04 社内勉強会資料46
状況の確認 
Bob のローカルリポジトリを確認する 
$ cd ~/bob/proj 
$ git log --graph --oneline --decorate=full --all 
* d77e388 (HEAD, refs/remotes/origin/master, 
refs/remotes/origin/foo, refs/remotes/origin/HEAD, 
refs/heads/master) master.txt を編集 
* 247be48 Merge branch 'foo' 
... (以下省略) 
◦ --all を付けるとリモートブランチも表示される 
2014/11/04 社内勉強会資料47
今どうなっているのか 
d77e388 
master.txt を編集 
HEAD master 
247be48 
Merge branch 'foo' 
815bb4d 
READMEを編集(master) 
cbf2105 
Merge branch 'foo' 
f966ea7 
READMEを編集(foo) 
2014/11/04 社内勉強会資料48
作業をコミットする 
ローカルリポジトリで適当にファイルを編集する 
$ echo Bob >bob.txt 
$ git add bob.txt 
$ git commit -m 'bob.txt を作成' 
[master 94141eb] bob.txt を作成 
1 file changed, 1 insertion(+) 
create mode 100644 bob.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 directory clean 
2014/11/04 社内勉強会資料49
今どうなっているのか 
94141eb 
bob.txt を作成 
HEAD master 
d77e388 
master.txt を編集 
247be48 
Merge branch 'foo' 
815bb4d 
READMEを編集(master) 
cbf2105 
Merge branch 'foo' 
f966ea7 
READMEを編集(foo) 
2014/11/04 社内勉強会資料50
リモートリポジトリに 
反映する 
git push 
$ git push 
Counting objects: 4, done. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 343 bytes | 0 bytes/s, done. 
Total 3 (delta 0), reused 0 (delta 0) 
To /home/y-uti/proj.git 
d77e388..94141eb master -> master 
# On branch master 
nothing to commit, working directory clean 
2014/11/04 社内勉強会資料51
今どうなっているのか 
origin/master origin/HEAD 
origin/foo 
94141eb 
bob.txt を作成 
HEAD master 
d77e388 
master.txt を編集 
247be48 
Merge branch 'foo' 
815bb4d 
READMEを編集(master) 
cbf2105 
Merge branch 'foo' 
f966ea7 
READMEを編集(foo) 
2014/11/04 社内勉強会資料52
Alice 登場 
Alice もproj の開発者だとしましょう 
$ mkdir ~/alice 
Alice も開発を進めるためリモートリポジトリを取得します 
$ cd ~/alice 
$ git clone ~/proj.git 
Cloning into 'proj'... 
done. 
$ git config user.email 'alice@mycompany.com' 
$ git config user.name Alice 
$ git config push.default simple 
◦ Alice はBob のpush 後にclone したので直前のスライドの状態 
2014/11/04 社内勉強会資料53
Alice が作業する 
ローカルリポジトリで適当にファイルを編集してpush する 
$ echo Alice >alice.txt 
$ git add alice.txt 
$ git commit -m 'alice.txt を作成' 
[master eca2360] alice.txt を作成 
1 file changed, 1 insertion(+) 
create mode 100644 alice.txt 
$ git push 
Counting objects: 4, done. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 284 bytes | 0 bytes/s, done. 
Total 3 (delta 1), reused 0 (delta 0) 
To /home/y-uti/proj.git 
94141eb..eca2360 master -> master 
2014/11/04 社内勉強会資料54
今どうなっているのか 
origin/master origin/HEAD 
origin/foo 
eca2360 
alice.txt を作成 
HEAD master 
94141eb 
bob.txt を作成 
d77e388 
master.txt を編集 
247be48 
Merge branch 'foo' 
815bb4d 
READMEを編集(master) 
f966ea7 
READMEを編集(foo) 
2014/11/04 社内勉強会資料55
その頃Bob は・・・ 
Alice と並行して黙々と作業を続ける 
$ cd ~/bob/proj 
$ echo 'edited' >>bob.txt 
$ git commit -am 'bob.txt を編集' 
[master 7a98272] bob.txt を編集 
1 file changed, 1 insertion(+) 
2014/11/04 社内勉強会資料56
軽やかにpush 
そして失敗する 
$ git push 
To /home/y-uti/proj.git 
! [rejected] master -> master (fetch first) 
error: failed to push some refs to '/home/y-uti/proj.git' 
hint: Updates were rejected because the remote contains work that 
you do 
hint: not have locally. This is usually caused by another 
repository pushing 
hint: to the same ref. You may want to first merge the remote 
changes (e.g., 
hint: 'git pull') before pushing again. 
hint: See the 'Note about fast-forwards' in 'git push --help' for 
details. 
2014/11/04 社内勉強会資料57
今どうなっているのか 
7a98272 
bob.txt を編集 
94141eb origin/master origin/HEAD 
origin/foo 
HEAD master 
bob.txt を作成 
d77e388 
master.txt を編集 
247be48 
Merge branch 'foo' 
815bb4d 
READMEを編集(master) 
f966ea7 
READMEを編集(foo) 
2014/11/04 社内勉強会資料58
$ cd ~/proj.git 
$ git log --graph --oneline --decorate=full 
今どうなっているのか 
origin/master origin/HEAD 
foo 
7a98272 
bob.txt を編集 
HEAD master 
94141eb 
bob.txt を作成 
d77e388 
master.txt を編集 
247be48 
Merge branch 'foo' 
815bb4d 
READMEを編集(master) 
eca2360 
alice.txt を作成 
master HEAD 
f966ea7 
READMEを編集(foo) 
2014/11/04 社内勉強会資料59
リモートリポジトリを 
取得する 
git fetch 
$ git fetch 
remote: Counting objects: 4, done. 
remote: Compressing objects: 100% (2/2), done. 
remote: Total 3 (delta 1), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From /home/y-uti/proj 
94141eb..eca2360 master -> origin/master 
2014/11/04 社内勉強会資料60
今どうなっているのか 
eca2360 
alice.txt を作成 
origin/master origin/HEAD 
origin/foo 
7a98272 
bob.txt を編集 
HEAD master 
94141eb 
bob.txt を作成 
d77e388 
master.txt を編集 
247be48 
Merge branch 'foo' 
815bb4d 
READMEを編集(master) 
f966ea7 
READMEを編集(foo) 
2014/11/04 社内勉強会資料61
リモートブランチを 
マージする 
git merge 
$ git merge origin/master 
Merge made by the 'recursive' strategy. 
alice.txt | 1 + 
1 file changed, 1 insertion(+) 
create mode 100644 alice.txt 
◦ fast-forward マージにならないのでコミットメッセージを入力 
◦ 変更が衝突した場合は修正してgit add してgit commit する 
このスライドでBob が実行した操作は実はあまり良くない 
後で振り返ります 
2014/11/04 社内勉強会資料62
今どうなっているのか 
HEAD master 0a17096 
Merge remote-tracking branch 'origin/master' 
origin/master origin/HEAD 
eca2360 
alice.txt を作成 
origin/foo 
7a98272 
bob.txt を編集 
94141eb 
bob.txt を作成 
d77e388 
master.txt を編集 
247be48 
Merge branch 'foo' 
2014/11/04 社内勉強会資料63
改めてpush する 
今度は無事に成功する 
$ git push 
Counting objects: 8, done. 
Compressing objects: 100% (4/4), done. 
Writing objects: 100% (5/5), 497 bytes | 0 bytes/s, done. 
Total 5 (delta 2), reused 0 (delta 0) 
To /home/y-uti/proj.git 
eca2360..0a17096 master -> master 
◦ この変更をAlice は知らないので、次はAlice がpush に失敗する 
◦ これを繰り返すのが分散バージョン管理 
2014/11/04 社内勉強会資料64
大切な余談 
ところでfoo どこ行った 
clone ではmaster 以外のローカルブランチは用意されない 
$ git branch -a 
* master 
remotes/origin/HEAD -> origin/master 
remotes/origin/foo 
remotes/origin/master 
git checkout するときに作成する 
$ git checkout -b foo origin/foo 
Branch foo set up to track remote branch foo from origin. 
Switched to a new branch 'foo' 
◦ -b オプションを指定する 
◦ checkout なので同時にHEAD もfoo を指すように切り替わる 
2014/11/04 社内勉強会資料65
Enjoy Git! 
2014/11/04 社内勉強会資料66
ちょっと待てコラ! 
2014/11/04 社内勉強会資料67
これをpush した人は 
正直に手を挙げてください 
HEAD master 0a17096 
Merge remote-tracking branch 'origin/master' 
eca2360 
alice.txt を作成 
foo 
7a98272 
bob.txt を編集 
94141eb 
bob.txt を作成 
d77e388 
master.txt を編集 
247be48 
Merge branch 'foo' 
意味のないマージが 
リモートリポジトリの履歴を汚す 
2014/11/04 社内勉強会資料68
過去に戻る・・・ 
Bob がpush に失敗してfetch してきた状態を再現する 
$ cd ~/proj.git 
$ git reset --soft eca2360 
$ cd ~/bob/proj 
$ git reset --hard 7a98272 
$ git fetch 
◦ 現実のプロジェクトで安易にこういう操作をしてはいけない 
2014/11/04 社内勉強会資料69
fetch してきた状態 
eca2360 
alice.txt を作成 
origin/master origin/HEAD 
origin/foo 
7a98272 
bob.txt を編集 
HEAD master 
94141eb 
bob.txt を作成 
d77e388 
master.txt を編集 
247be48 
Merge branch 'foo' 
815bb4d 
READMEを編集(master) 
f966ea7 
READMEを編集(foo) 
2014/11/04 社内勉強会資料70
commit を作り直す 
git rebase 
$ git rebase 
First, rewinding head to replay your work on top of it... 
Applying: bob.txt を編集 
◦ master でのコミットをorigin/master に対してやり直す 
◦ 衝突した場合は修正する必要がある 
2014/11/04 社内勉強会資料71
今どうなっているのか 
HEAD master d0cc18c 
bob.txt を編集 
origin/master origin/HEAD 
eca2360 
alice.txt を作成 
origin/foo 
7a98272 
bob.txt を編集 
94141eb 
bob.txt を作成 
d77e388 
master.txt を編集 
247be48 
Merge branch 'foo' 
この状態からpush すれば 
マージコミットが履歴に残らない 
2014/11/04 社内勉強会資料72
終わり 
2014/11/04 社内勉強会資料73
話さなかったこと 
たくさんある 
$ git help -a 
usage: git [--version] [--help] [-c name=value] 
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] 
[-p|--paginate|--no-pager] [--no-replace-objects] [--bare] 
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] 
<command> [<args>] 
available git commands in '/usr/libexec/git-core' 
add count-objects grep merge-recursive remote show-ref 
add--interactive credential hash-object merge-resolve remote-ext stage 
am credential-cache help merge-subtree remote-fd stash 
annotate credential-cache--daemon http-backend merge-tree remote-ftp status 
apply credential-gnome-keyring http-fetch mergetool remote-ftps stripspace 
archive credential-store http-push mktag remote-http submodule 
bisect describe imap-send mktree remote-https subtree 
bisect--helper diff index-pack mv remote-testpy symbolic-ref 
blame diff-files init name-rev repack tag 
branch diff-index init-db notes replace tar-tree 
bundle diff-tree instaweb pack-objects repo-config unpack-file 
cat-file difftool log pack-redundant request-pull unpack-objects 
check-attr difftool--helper lost-found pack-refs rerere update-index 
check-ignore fast-export ls-files patch-id reset update-ref 
check-ref-format fast-import ls-remote peek-remote rev-list update-server-info 
checkout fetch ls-tree prune rev-parse upload-archive 
checkout-index fetch-pack mailinfo prune-packed revert upload-pack 
cherry filter-branch mailsplit pull rm var 
cherry-pick fmt-merge-msg merge push send-pack verify-pack 
clean for-each-ref merge-base quiltimport sh-i18n--envsubst verify-tag 
clone format-patch merge-file read-tree shell web--browse 
column fsck merge-index rebase shortlog whatchanged 
commit fsck-objects merge-octopus receive-pack show write-tree 
commit-tree gc merge-one-file reflog show-branch 
config get-tar-commit-id merge-ours relink show-index 
'git help -a' and 'git help -g' lists available subcommands and some 
concept guides. See 'git help <command>' or 'git help <concept>' 
to read about a specific subcommand or concept. 
2014/11/04 社内勉強会資料74
参考になる情報 
探せばいくらでも見つかる 
◦ 公式ウェブサイト 
◦ リファレンスマニュアルhttp://git-scm.com/docs 
◦ 解説書『Pro Git』の和訳http://git-scm.com/book/ja/v1 
◦ 初心者向けの全般的な解説 
◦ Git チュートリアルhttps://www.atlassian.com/ja/git/ 
◦ いつやるの? Git 入門http://www.slideshare.net/matsukaz/git-28304397 
◦ サルでもわかるGit 入門http://www.backlog.jp/git-guide/ 
◦ リンク集 
◦ Git 初心者が見るべきサイトまとめ 
http://matome.naver.jp/odai/2136491451473222801 
2014/11/04 社内勉強会資料75

Contenu connexe

Tendances

はじめようGit
はじめようGitはじめようGit
はじめようGittechscore
 
ノンプログラマのGit入門
ノンプログラマのGit入門ノンプログラマのGit入門
ノンプログラマのGit入門Muyuu Fujita
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0Masakazu Matsushita
 
Gitはじめの一歩
Gitはじめの一歩Gitはじめの一歩
Gitはじめの一歩Ayana Yokota
 
Git Started With Git
Git Started With GitGit Started With Git
Git Started With GitNick Quaranto
 
Introduction to Git and GitHub Part 1
Introduction to Git and GitHub Part 1Introduction to Git and GitHub Part 1
Introduction to Git and GitHub Part 1Omar Fathy
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學littlebtc
 
Git Terminologies
Git TerminologiesGit Terminologies
Git TerminologiesYash
 
バージョン管理のワークフロー
バージョン管理のワークフローバージョン管理のワークフロー
バージョン管理のワークフローadd20
 
Version Control & Git
Version Control & GitVersion Control & Git
Version Control & GitJason Byrne
 
Advanced Git Tutorial
Advanced Git TutorialAdvanced Git Tutorial
Advanced Git TutorialSage Sharp
 
Git flowの活用事例
Git flowの活用事例Git flowの活用事例
Git flowの活用事例Hirohito Kato
 
Git and github - Verson Control for the Modern Developer
Git and github - Verson Control for the Modern DeveloperGit and github - Verson Control for the Modern Developer
Git and github - Verson Control for the Modern DeveloperJohn Stevenson
 

Tendances (20)

はじめようGit
はじめようGitはじめようGit
はじめようGit
 
ノンプログラマのGit入門
ノンプログラマのGit入門ノンプログラマのGit入門
ノンプログラマのGit入門
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
 
Gitはじめの一歩
Gitはじめの一歩Gitはじめの一歩
Gitはじめの一歩
 
Git Started With Git
Git Started With GitGit Started With Git
Git Started With Git
 
Introduction to Git and GitHub Part 1
Introduction to Git and GitHub Part 1Introduction to Git and GitHub Part 1
Introduction to Git and GitHub Part 1
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學
 
Git Terminologies
Git TerminologiesGit Terminologies
Git Terminologies
 
Git and github 101
Git and github 101Git and github 101
Git and github 101
 
Git (実践入門編)
Git (実践入門編)Git (実践入門編)
Git (実践入門編)
 
バージョン管理のワークフロー
バージョン管理のワークフローバージョン管理のワークフロー
バージョン管理のワークフロー
 
Git由超淺入超深
Git由超淺入超深Git由超淺入超深
Git由超淺入超深
 
Version Control & Git
Version Control & GitVersion Control & Git
Version Control & Git
 
Advanced Git Tutorial
Advanced Git TutorialAdvanced Git Tutorial
Advanced Git Tutorial
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 
Git in 10 minutes
Git in 10 minutesGit in 10 minutes
Git in 10 minutes
 
Git 版本控制 (使用教學)
Git 版本控制 (使用教學)Git 版本控制 (使用教學)
Git 版本控制 (使用教學)
 
Git flowの活用事例
Git flowの活用事例Git flowの活用事例
Git flowの活用事例
 
Git and github - Verson Control for the Modern Developer
Git and github - Verson Control for the Modern DeveloperGit and github - Verson Control for the Modern Developer
Git and github - Verson Control for the Modern Developer
 
Git n git hub
Git n git hubGit n git hub
Git n git hub
 

Similaire à Git 入門

20120324 git training
20120324 git training20120324 git training
20120324 git trainingTakeshi AKIMA
 
Gitとちょっと仲良くなるために覚えたことまとめ
Gitとちょっと仲良くなるために覚えたことまとめGitとちょっと仲良くなるために覚えたことまとめ
Gitとちょっと仲良くなるために覚えたことまとめNatsumi Kashiwa
 
バージョン管理
バージョン管理バージョン管理
バージョン管理Misa Kondo
 
Gitを使ってみよう
Gitを使ってみようGitを使ってみよう
Gitを使ってみようTamotsu Furuya
 
Gitを理解するためにおさえておきたい3つの図(工事中)
Gitを理解するためにおさえておきたい3つの図(工事中)Gitを理解するためにおさえておきたい3つの図(工事中)
Gitを理解するためにおさえておきたい3つの図(工事中)Teloo
 
今さら聞けない人のためのGit超入門 GitLab 14対応版
今さら聞けない人のためのGit超入門 GitLab 14対応版今さら聞けない人のためのGit超入門 GitLab 14対応版
今さら聞けない人のためのGit超入門 GitLab 14対応版VirtualTech Japan Inc./Begi.net Inc.
 
Gitを使ってみませんか
Gitを使ってみませんかGitを使ってみませんか
Gitを使ってみませんかAtsuhiro Takiguchi
 
Git勉強会 2016 Gitで卒論を管理しよう回
Git勉強会 2016 Gitで卒論を管理しよう回Git勉強会 2016 Gitで卒論を管理しよう回
Git勉強会 2016 Gitで卒論を管理しよう回kinme modoki
 
Build insider offline session チームでのgit
Build insider offline session チームでのgitBuild insider offline session チームでのgit
Build insider offline session チームでのgitTadahiro Ishisaka
 
Githubことはじめ
GithubことはじめGithubことはじめ
Githubことはじめtikitikipoo
 
今さら聞けない人のためのGit超入門 GitLab 13対応版
今さら聞けない人のためのGit超入門 GitLab 13対応版今さら聞けない人のためのGit超入門 GitLab 13対応版
今さら聞けない人のためのGit超入門 GitLab 13対応版VirtualTech Japan Inc./Begi.net Inc.
 

Similaire à Git 入門 (20)

20120324 git training
20120324 git training20120324 git training
20120324 git training
 
今さら聞けない人のためのGitLabの始め方 Ubuntu編
今さら聞けない人のためのGitLabの始め方 Ubuntu編今さら聞けない人のためのGitLabの始め方 Ubuntu編
今さら聞けない人のためのGitLabの始め方 Ubuntu編
 
Gitとちょっと仲良くなるために覚えたことまとめ
Gitとちょっと仲良くなるために覚えたことまとめGitとちょっと仲良くなるために覚えたことまとめ
Gitとちょっと仲良くなるために覚えたことまとめ
 
Github第4章
Github第4章Github第4章
Github第4章
 
Git for beginners
Git for beginnersGit for beginners
Git for beginners
 
バージョン管理
バージョン管理バージョン管理
バージョン管理
 
Git 勉強会
Git 勉強会Git 勉強会
Git 勉強会
 
Gitを使ってみよう
Gitを使ってみようGitを使ってみよう
Gitを使ってみよう
 
Gitを理解するためにおさえておきたい3つの図(工事中)
Gitを理解するためにおさえておきたい3つの図(工事中)Gitを理解するためにおさえておきたい3つの図(工事中)
Gitを理解するためにおさえておきたい3つの図(工事中)
 
今さら聞けない人のためのgit超入門
今さら聞けない人のためのgit超入門今さら聞けない人のためのgit超入門
今さら聞けない人のためのgit超入門
 
今さら聞けない人のためのGit超入門 GitLab 14対応版
今さら聞けない人のためのGit超入門 GitLab 14対応版今さら聞けない人のためのGit超入門 GitLab 14対応版
今さら聞けない人のためのGit超入門 GitLab 14対応版
 
Gitを使ってみませんか
Gitを使ってみませんかGitを使ってみませんか
Gitを使ってみませんか
 
Git勉強会 2016 Gitで卒論を管理しよう回
Git勉強会 2016 Gitで卒論を管理しよう回Git勉強会 2016 Gitで卒論を管理しよう回
Git勉強会 2016 Gitで卒論を管理しよう回
 
今さら聞けない人のためのGit超入門
今さら聞けない人のためのGit超入門今さら聞けない人のためのGit超入門
今さら聞けない人のためのGit超入門
 
Build insider offline session チームでのgit
Build insider offline session チームでのgitBuild insider offline session チームでのgit
Build insider offline session チームでのgit
 
Githubことはじめ
GithubことはじめGithubことはじめ
Githubことはじめ
 
今さら聞けない人のためのGit超入門 2019/11/21
今さら聞けない人のためのGit超入門 2019/11/21今さら聞けない人のためのGit超入門 2019/11/21
今さら聞けない人のためのGit超入門 2019/11/21
 
Git (運用編)
Git (運用編)Git (運用編)
Git (運用編)
 
今さら聞けない人のためのGit超入門 GitLab 13対応版
今さら聞けない人のためのGit超入門 GitLab 13対応版今さら聞けない人のためのGit超入門 GitLab 13対応版
今さら聞けない人のためのGit超入門 GitLab 13対応版
 
今さら聞けない人のためのgit超入門
今さら聞けない人のためのgit超入門今さら聞けない人のためのgit超入門
今さら聞けない人のためのgit超入門
 

Plus de y-uti

潜在ディリクレ配分法
潜在ディリクレ配分法潜在ディリクレ配分法
潜在ディリクレ配分法y-uti
 
Active Object
Active ObjectActive Object
Active Objecty-uti
 
目で見る過学習と正則化
目で見る過学習と正則化目で見る過学習と正則化
目で見る過学習と正則化y-uti
 
ロジスティック回帰入門
ロジスティック回帰入門ロジスティック回帰入門
ロジスティック回帰入門y-uti
 
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...y-uti
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードy-uti
 
PHP-ML で手書き数字認識
PHP-ML で手書き数字認識PHP-ML で手書き数字認識
PHP-ML で手書き数字認識y-uti
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今y-uti
 
スパース推定
スパース推定スパース推定
スパース推定y-uti
 
Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話y-uti
 
PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告y-uti
 
分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用y-uti
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみたy-uti
 
JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試したy-uti
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試したy-uti
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件y-uti
 
PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告y-uti
 
RFC: "var" Deprecation
RFC: "var" DeprecationRFC: "var" Deprecation
RFC: "var" Deprecationy-uti
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話y-uti
 
Windows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたWindows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたy-uti
 

Plus de y-uti (20)

潜在ディリクレ配分法
潜在ディリクレ配分法潜在ディリクレ配分法
潜在ディリクレ配分法
 
Active Object
Active ObjectActive Object
Active Object
 
目で見る過学習と正則化
目で見る過学習と正則化目で見る過学習と正則化
目で見る過学習と正則化
 
ロジスティック回帰入門
ロジスティック回帰入門ロジスティック回帰入門
ロジスティック回帰入門
 
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
 
PHP-ML で手書き数字認識
PHP-ML で手書き数字認識PHP-ML で手書き数字認識
PHP-ML で手書き数字認識
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今
 
スパース推定
スパース推定スパース推定
スパース推定
 
Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話
 
PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告
 
分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試した
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試した
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件
 
PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告
 
RFC: "var" Deprecation
RFC: "var" DeprecationRFC: "var" Deprecation
RFC: "var" Deprecation
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話
 
Windows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたWindows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみた
 

Git 入門

  • 1. Git 入門 2014/11/04 社内勉強会資料1
  • 2. 話すことと話さないこと 話すこと ◦ ローカルリポジトリでの作業の流れ ◦ ブランチとマージ ◦ リモートリポジトリを使う作業の流れ 話さないこと ◦ Git が提供するさまざまなコマンドの解説 ◦ GUI クライアントやIDE のプラグインの使い方 ◦ Git の開発モデル(git-flow とか) ◦ その他諸々 このスライドの内容はgit 1.8.3.1 で確認しています 2014/11/04 社内勉強会資料2
  • 4. リポジトリを作成する git init $ pwd /home/y-uti/proj $ git init Initialized empty Git repository in /home/y-uti/proj/.git/ $ ls -a ./ ../ .git/ ◦ 管理ディレクトリが作成される 2014/11/04 社内勉強会資料4
  • 5. ユーザ情報を登録する git config $ git config user.email 'y-uti@mycompany.com' $ git config user.name 'y-uti' $ git config -l core.repositoryformatversion=0 core.filemode=true core.bare=false core.logallrefupdates=true user.email=y-uti@mycompany.com user.name=y-uti ◦ 設定しておかないとコミットするときに怒られる 2014/11/04 社内勉強会資料5
  • 6. Git の作業フロー 作成 編集 削除 ステージコミット 2014/11/04 社内勉強会資料6
  • 7. ファイルを作成する 好きなエディタを開いて自由にファイルを作成する $ vi README Git 入門 $ ls -a ./ ../ .git/ README 2014/11/04 社内勉強会資料7
  • 8. 状態を確認する git status $ git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # README nothing added to commit but untracked files present (use "git add" to track) 2014/11/04 社内勉強会資料8
  • 9. ステージする git add $ git add README $ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: README # 2014/11/04 社内勉強会資料9
  • 10. コミットする git commit $ git commit -m 'README を作成' [master (root-commit) 1fd89c5] README を作成 1 file changed, 1 insertion(+) create mode 100644 README $ git status # On branch master nothing to commit, working directory clean 2014/11/04 社内勉強会資料10
  • 11. ファイルを編集する 好きなエディタを開いて自由にファイルを編集する $ vi README Git 入門 Git はとても難しい 2014/11/04 社内勉強会資料11
  • 12. 状態を確認する git status $ git status # On branch master # 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: README # no changes added to commit (use "git add" and/or "git commit -a") ◦ ここでgit commit しても変更はコミットされない 2014/11/04 社内勉強会資料12
  • 13. ステージする git add $ git add README $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: README # ◦ ここでgit commit すれば変更がコミットされる ◦ が、次のスライドでちょっと寄り道してみましょう 2014/11/04 社内勉強会資料13
  • 14. さらにファイルを編集する 好きなエディタを開いて自由にファイルを編集する $ vi README Git 入門 Git はとても難しい Git は難しすぎる 2014/11/04 社内勉強会資料14
  • 15. 状態を確認する git status $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: README # # 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: README # ◦ 二箇所に出てくる 2014/11/04 社内勉強会資料15
  • 16. 今どうなっているのか 作業ディレクトリステージング領域リポジトリ(の最新) Git 入門 Git 入門 Git 入門 Git はとても難しい Git はとても難しい Git は難しすぎる 2014/11/04 社内勉強会資料16
  • 17. 差分を確認する From: ステージング領域 To: 作業ディレクトリ 作業ディレクトリステージング領域リポジトリ(の最新) Git 入門 Git 入門 Git 入門 Git はとても難しい Git はとても難しい Git は難しすぎる $ git diff diff --git a/README b/README index a1247d5..7ffac0f 100644 --- a/README +++ b/README @@ -1,2 +1,3 @@ Git 入門 Git はとても難しい +Git は難しすぎる 2014/11/04 社内勉強会資料17
  • 18. 差分を確認する From: リポジトリの最新 To: 作業ディレクトリ 作業ディレクトリステージング領域リポジトリ(の最新) Git 入門 Git 入門 Git 入門 Git はとても難しい Git はとても難しい Git は難しすぎる $ git diff HEAD diff --git a/README b/README index 4dfa228..7ffac0f 100644 --- a/README +++ b/README @@ -1 +1,3 @@ Git 入門 +Git はとても難しい +Git は難しすぎる 2014/11/04 社内勉強会資料18
  • 19. 差分を確認する From: リポジトリの最新 To: ステージング領域 作業ディレクトリステージング領域リポジトリ(の最新) Git 入門 Git 入門 Git 入門 Git はとても難しい Git はとても難しい Git は難しすぎる $ git diff --cached diff --git a/README b/README index 4dfa228..a1247d5 100644 --- a/README +++ b/README @@ -1 +1,2 @@ Git 入門 +Git はとても難しい 2014/11/04 社内勉強会資料19
  • 20. コミットする git commit $ git commit -m 'README を編集' [master ac1ee4a] README を編集 1 file changed, 1 insertion(+) $ git status # On branch master # 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: README # no changes added to commit (use "git add" and/or "git commit -a") ◦ "nothing to commit, working directory clean" にはならない 2014/11/04 社内勉強会資料20
  • 21. 何が起きたのか コミット前 作業ディレクトリステージング領域リポジトリ(の最新) Git 入門 Git 入門 Git 入門 Git はとても難しい Git はとても難しい Git は難しすぎる コミット後 作業ディレクトリステージング領域リポジトリ(の最新) Git 入門 Git 入門 Git 入門 Git はとても難しい Git はとても難しい Git はとても難しい Git は難しすぎる ◦ git commit はステージング領域をリポジトリに反映するだけ 2014/11/04 社内勉強会資料21
  • 22. ステージを取り消す 大切な余談 作業ディレクトリステージング領域リポジトリ(の最新) Git 入門 Git 入門 Git 入門 Git はとても難しい Git はとても難しい Git は難しすぎる $ git reset README Unstaged changes after reset: M README 作業ディレクトリステージング領域リポジトリ(の最新) Git 入門 Git 入門Git 入門 Git はとても難しい Git は難しすぎる ◦ リポジトリの最新の内容をステージング領域に取得 2014/11/04 社内勉強会資料22
  • 23. 大切な余談 未ステージの変更を取消す 作業ディレクトリステージング領域リポジトリ(の最新) Git 入門 Git 入門 Git 入門 Git はとても難しい Git はとても難しい Git は難しすぎる $ git checkout -- README 作業ディレクトリステージング領域リポジトリ(の最新) Git 入門 Git 入門 Git 入門 Git はとても難しい Git はとても難しい ◦ ステージング領域の内容を作業ディレクトリに取得 2014/11/04 社内勉強会資料23
  • 25. その前に 作業ディレクトリを掃除しておきます $ git reset --hard HEAD is now at ac1ee4a README を編集 ◦ git reset --hard = git reset + git checkout ◦ リポジトリの最新をステージング領域に取得 ◦ ステージング領域を作業ディレクトリに取得 それぞれの内容はこのようになっている(としましょう) 作業ディレクトリステージング領域リポジトリ(の最新) Git 入門 Git 入門 Git 入門 Git はとても難しい Git はとても難しい Git はとても難しい 2014/11/04 社内勉強会資料25
  • 26. コミットの履歴を確認する git log $ git log commit ac1ee4a27ec36764178ef73f2490270e87610cc6 Author: y-uti <y-uti@mycompany.com> Date: Sat Nov 1 15:08:44 2014 +0900 README を編集 commit 1fd89c51a0946827c77c357dfe3287e2e96af875 Author: y-uti <y-uti@mycompany.com> Date: Sat Nov 1 13:50:48 2014 +0900 README を作成 2014/11/04 社内勉強会資料26
  • 27. コミットの履歴を確認する git log --graph --oneline --decorate=full $ git log --graph --oneline --decorate=full * ac1ee4a (HEAD, refs/heads/master) README を編集 * 1fd89c5 README を作成 HEAD master ac1ee4a READMEを編集 1fd89c5 READMEを作成 2014/11/04 社内勉強会資料27
  • 28. ブランチを作成する git branch $ git branch foo $ git log --graph --oneline --decorate=full * ac1ee4a (HEAD, refs/heads/master, refs/heads/foo) README を編集 * 1fd89c5 README を作成 HEAD master foo ac1ee4a READMEを編集 1fd89c5 READMEを作成 2014/11/04 社内勉強会資料28
  • 29. ブランチを一覧表示する git branch $ git branch foo * master ◦ ブランチを作成しただけでは現在のブランチは切り替わらない HEAD master foo ac1ee4a READMEを編集 1fd89c5 READMEを作成 2014/11/04 社内勉強会資料29
  • 30. ブランチを切り替える git checkout $ git checkout foo Switched to branch 'foo' $ git branch * foo master master foo HEAD ac1ee4a READMEを編集 1fd89c5 READMEを作成 2014/11/04 社内勉強会資料30
  • 31. ブランチで作業する 各ブランチで適当に作業してコミットする $ echo foo >foo.txt $ git add foo.txt $ git commit -m 'foo.txt を作成' $ git checkout master $ ls README $ echo master >master.txt $ git add master.txt $ git commit -m 'master.txt を作成' ◦ master ブランチにはfoo.txt が存在していないことに注目 2014/11/04 社内勉強会資料31
  • 32. 今どうなっているのか HEAD master foo 5e8d07f master.txtを作成 ac1ee4a READMEを編集 1fd89c5 READMEを作成 4f5c71b foo.txtを作成 2014/11/04 社内勉強会資料32
  • 33. ブランチをマージする git merge $ git merge foo Merge branch 'foo' # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit. ◦ エディタでコミットメッセージを入力するとマージが実行される Merge made by the 'recursive' strategy. foo.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 foo.txt 2014/11/04 社内勉強会資料33
  • 34. マージ結果を確認する git log を使う $ ls README foo.txt master.txt $ git log --graph --oneline --decorate=full * cbf2105 (HEAD, refs/heads/master) Merge branch 'foo' |¥ | * 4f5c71b (refs/heads/foo) foo.txt を作成 * | 5e8d07f master.txt を作成 |/ * ac1ee4a README を編集 * 1fd89c5 README を作成 ◦ マージも一つのコミット 2014/11/04 社内勉強会資料34
  • 35. 衝突 各ブランチで適当にファイルを編集して衝突させる $ git checkout foo $ echo foo >>README $ git commit -am 'README を編集(foo)' $ git checkout master $ echo master >>README $ git commit -am 'README を編集(master)' $ git merge foo Auto-merging README CONFLICT (content): Merge conflict in README Automatic merge failed; fix conflicts and then commit the result. 2014/11/04 社内勉強会資料35
  • 36. 衝突を解決する 衝突箇所を編集してからgit add してgit commit する $ cat README Git 入門 Git はとても難しい <<<<<<< HEAD master ======= foo >>>>>>> foo $ vi README $ git add README $ git commit [master 247be48] Merge branch 'foo' 2014/11/04 社内勉強会資料36
  • 37. 今どうなっているのか HEAD master 815bb4d READMEを編集(master) cbf2105 Merge branch 'foo' 5e8d07f master.txtを作成 ac1ee4a READMEを編集 1fd89c5 READMEを作成 247be48 Merge branch 'foo' foo f966ea7 READMEを編集(foo) 4f5c71b foo.txtを作成 * 247be48 Merge branch 'foo' |¥ | * f966ea7 README を編集(foo) * | 815bb4d README を編集(master) * | cbf2105 Merge branch 'foo' |¥ ¥ | |/ | * 4f5c71b foo.txt を作成 * | 5e8d07f master.txt を作成 |/ * ac1ee4a README を編集 * 1fd89c5 README を作成 2014/11/04 社内勉強会資料37
  • 38. 大切な余談 衝突の解決を諦めて戻す 衝突する予定のなかったgit merge で衝突して途方に暮れたら $ git reset --hard HEAD is now at 815bb4d README を編集(master) ◦ 明日やることにして帰って寝る 2014/11/04 社内勉強会資料38
  • 39. fast-forward マージ 引き続きmaster ブランチでファイルを編集する $ echo edited >>master.txt $ git commit -am 'master.txt を編集' [master d77e388] master.txt を編集 1 file changed, 1 insertion(+) 2014/11/04 社内勉強会資料39
  • 40. 今どうなっているのか HEAD master 815bb4d READMEを編集(master) cbf2105 Merge branch 'foo' 5e8d07f master.txtを作成 ac1ee4a READMEを編集 d77e388 master.txt を編集 247be48 Merge branch 'foo' foo f966ea7 READMEを編集(foo) 4f5c71b foo.txtを作成 2014/11/04 社内勉強会資料40
  • 41. fast-forward マージ master の変更をfoo ブランチにマージする ◦ 今までと逆 $ git checkout foo Switched to branch 'foo' $ git merge master Updating f966ea7..d77e388 Fast-forward README | 1 + master.txt | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 master.txt ◦ コミットメッセージの入力も無いまま勝手にマージが完了する 2014/11/04 社内勉強会資料41
  • 42. このようにはならない foo HEAD d77e388 master.txt を編集 master 247be48 Merge branch 'foo' 815bb4d READMEを編集(master) cbf2105 Merge branch 'foo' ??????? Merge branch 'master' この間でfoo 側にコミットがないので ??????? はd77e388 と差がない f966ea7 READMEを編集(foo) 2014/11/04 社内勉強会資料42
  • 43. こうなる d77e388 master.txt を編集 master foo HEAD 247be48 Merge branch 'foo' 815bb4d READMEを編集(master) cbf2105 Merge branch 'foo' f966ea7 READMEを編集(foo) 2014/11/04 社内勉強会資料43
  • 45. その前に 今まで作業したリポジトリを共有しておきます $ pwd /home/y-uti $ git clone --bare proj proj.git $ cd proj.git $ git remote remove origin ◦ /home/y-uti/proj.git にリモートリポジトリが作成された ◦ 中身は今まで作業してきたローカルリポジトリのコピー 2014/11/04 社内勉強会資料45
  • 46. 開発者Bob がいます ということにしましょう $ mkdir ~/bob Bob は開発を進めるためリモートリポジトリを取得します $ cd ~/bob $ git clone ~/proj.git Cloning into 'proj'... done. $ git config user.email 'bob@mycompany.com' $ git config user.name Bob $ git config push.default simple ◦ 最後の一行はオマジナイ(書かないと後で文句を言われる) 2014/11/04 社内勉強会資料46
  • 47. 状況の確認 Bob のローカルリポジトリを確認する $ cd ~/bob/proj $ git log --graph --oneline --decorate=full --all * d77e388 (HEAD, refs/remotes/origin/master, refs/remotes/origin/foo, refs/remotes/origin/HEAD, refs/heads/master) master.txt を編集 * 247be48 Merge branch 'foo' ... (以下省略) ◦ --all を付けるとリモートブランチも表示される 2014/11/04 社内勉強会資料47
  • 48. 今どうなっているのか d77e388 master.txt を編集 HEAD master 247be48 Merge branch 'foo' 815bb4d READMEを編集(master) cbf2105 Merge branch 'foo' f966ea7 READMEを編集(foo) 2014/11/04 社内勉強会資料48
  • 49. 作業をコミットする ローカルリポジトリで適当にファイルを編集する $ echo Bob >bob.txt $ git add bob.txt $ git commit -m 'bob.txt を作成' [master 94141eb] bob.txt を作成 1 file changed, 1 insertion(+) create mode 100644 bob.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 directory clean 2014/11/04 社内勉強会資料49
  • 50. 今どうなっているのか 94141eb bob.txt を作成 HEAD master d77e388 master.txt を編集 247be48 Merge branch 'foo' 815bb4d READMEを編集(master) cbf2105 Merge branch 'foo' f966ea7 READMEを編集(foo) 2014/11/04 社内勉強会資料50
  • 51. リモートリポジトリに 反映する git push $ git push Counting objects: 4, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 343 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To /home/y-uti/proj.git d77e388..94141eb master -> master # On branch master nothing to commit, working directory clean 2014/11/04 社内勉強会資料51
  • 52. 今どうなっているのか origin/master origin/HEAD origin/foo 94141eb bob.txt を作成 HEAD master d77e388 master.txt を編集 247be48 Merge branch 'foo' 815bb4d READMEを編集(master) cbf2105 Merge branch 'foo' f966ea7 READMEを編集(foo) 2014/11/04 社内勉強会資料52
  • 53. Alice 登場 Alice もproj の開発者だとしましょう $ mkdir ~/alice Alice も開発を進めるためリモートリポジトリを取得します $ cd ~/alice $ git clone ~/proj.git Cloning into 'proj'... done. $ git config user.email 'alice@mycompany.com' $ git config user.name Alice $ git config push.default simple ◦ Alice はBob のpush 後にclone したので直前のスライドの状態 2014/11/04 社内勉強会資料53
  • 54. Alice が作業する ローカルリポジトリで適当にファイルを編集してpush する $ echo Alice >alice.txt $ git add alice.txt $ git commit -m 'alice.txt を作成' [master eca2360] alice.txt を作成 1 file changed, 1 insertion(+) create mode 100644 alice.txt $ git push Counting objects: 4, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 284 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 0 (delta 0) To /home/y-uti/proj.git 94141eb..eca2360 master -> master 2014/11/04 社内勉強会資料54
  • 55. 今どうなっているのか origin/master origin/HEAD origin/foo eca2360 alice.txt を作成 HEAD master 94141eb bob.txt を作成 d77e388 master.txt を編集 247be48 Merge branch 'foo' 815bb4d READMEを編集(master) f966ea7 READMEを編集(foo) 2014/11/04 社内勉強会資料55
  • 56. その頃Bob は・・・ Alice と並行して黙々と作業を続ける $ cd ~/bob/proj $ echo 'edited' >>bob.txt $ git commit -am 'bob.txt を編集' [master 7a98272] bob.txt を編集 1 file changed, 1 insertion(+) 2014/11/04 社内勉強会資料56
  • 57. 軽やかにpush そして失敗する $ git push To /home/y-uti/proj.git ! [rejected] master -> master (fetch first) error: failed to push some refs to '/home/y-uti/proj.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first merge the remote changes (e.g., hint: 'git pull') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. 2014/11/04 社内勉強会資料57
  • 58. 今どうなっているのか 7a98272 bob.txt を編集 94141eb origin/master origin/HEAD origin/foo HEAD master bob.txt を作成 d77e388 master.txt を編集 247be48 Merge branch 'foo' 815bb4d READMEを編集(master) f966ea7 READMEを編集(foo) 2014/11/04 社内勉強会資料58
  • 59. $ cd ~/proj.git $ git log --graph --oneline --decorate=full 今どうなっているのか origin/master origin/HEAD foo 7a98272 bob.txt を編集 HEAD master 94141eb bob.txt を作成 d77e388 master.txt を編集 247be48 Merge branch 'foo' 815bb4d READMEを編集(master) eca2360 alice.txt を作成 master HEAD f966ea7 READMEを編集(foo) 2014/11/04 社内勉強会資料59
  • 60. リモートリポジトリを 取得する git fetch $ git fetch remote: Counting objects: 4, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From /home/y-uti/proj 94141eb..eca2360 master -> origin/master 2014/11/04 社内勉強会資料60
  • 61. 今どうなっているのか eca2360 alice.txt を作成 origin/master origin/HEAD origin/foo 7a98272 bob.txt を編集 HEAD master 94141eb bob.txt を作成 d77e388 master.txt を編集 247be48 Merge branch 'foo' 815bb4d READMEを編集(master) f966ea7 READMEを編集(foo) 2014/11/04 社内勉強会資料61
  • 62. リモートブランチを マージする git merge $ git merge origin/master Merge made by the 'recursive' strategy. alice.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 alice.txt ◦ fast-forward マージにならないのでコミットメッセージを入力 ◦ 変更が衝突した場合は修正してgit add してgit commit する このスライドでBob が実行した操作は実はあまり良くない 後で振り返ります 2014/11/04 社内勉強会資料62
  • 63. 今どうなっているのか HEAD master 0a17096 Merge remote-tracking branch 'origin/master' origin/master origin/HEAD eca2360 alice.txt を作成 origin/foo 7a98272 bob.txt を編集 94141eb bob.txt を作成 d77e388 master.txt を編集 247be48 Merge branch 'foo' 2014/11/04 社内勉強会資料63
  • 64. 改めてpush する 今度は無事に成功する $ git push Counting objects: 8, done. Compressing objects: 100% (4/4), done. Writing objects: 100% (5/5), 497 bytes | 0 bytes/s, done. Total 5 (delta 2), reused 0 (delta 0) To /home/y-uti/proj.git eca2360..0a17096 master -> master ◦ この変更をAlice は知らないので、次はAlice がpush に失敗する ◦ これを繰り返すのが分散バージョン管理 2014/11/04 社内勉強会資料64
  • 65. 大切な余談 ところでfoo どこ行った clone ではmaster 以外のローカルブランチは用意されない $ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/foo remotes/origin/master git checkout するときに作成する $ git checkout -b foo origin/foo Branch foo set up to track remote branch foo from origin. Switched to a new branch 'foo' ◦ -b オプションを指定する ◦ checkout なので同時にHEAD もfoo を指すように切り替わる 2014/11/04 社内勉強会資料65
  • 66. Enjoy Git! 2014/11/04 社内勉強会資料66
  • 68. これをpush した人は 正直に手を挙げてください HEAD master 0a17096 Merge remote-tracking branch 'origin/master' eca2360 alice.txt を作成 foo 7a98272 bob.txt を編集 94141eb bob.txt を作成 d77e388 master.txt を編集 247be48 Merge branch 'foo' 意味のないマージが リモートリポジトリの履歴を汚す 2014/11/04 社内勉強会資料68
  • 69. 過去に戻る・・・ Bob がpush に失敗してfetch してきた状態を再現する $ cd ~/proj.git $ git reset --soft eca2360 $ cd ~/bob/proj $ git reset --hard 7a98272 $ git fetch ◦ 現実のプロジェクトで安易にこういう操作をしてはいけない 2014/11/04 社内勉強会資料69
  • 70. fetch してきた状態 eca2360 alice.txt を作成 origin/master origin/HEAD origin/foo 7a98272 bob.txt を編集 HEAD master 94141eb bob.txt を作成 d77e388 master.txt を編集 247be48 Merge branch 'foo' 815bb4d READMEを編集(master) f966ea7 READMEを編集(foo) 2014/11/04 社内勉強会資料70
  • 71. commit を作り直す git rebase $ git rebase First, rewinding head to replay your work on top of it... Applying: bob.txt を編集 ◦ master でのコミットをorigin/master に対してやり直す ◦ 衝突した場合は修正する必要がある 2014/11/04 社内勉強会資料71
  • 72. 今どうなっているのか HEAD master d0cc18c bob.txt を編集 origin/master origin/HEAD eca2360 alice.txt を作成 origin/foo 7a98272 bob.txt を編集 94141eb bob.txt を作成 d77e388 master.txt を編集 247be48 Merge branch 'foo' この状態からpush すれば マージコミットが履歴に残らない 2014/11/04 社内勉強会資料72
  • 74. 話さなかったこと たくさんある $ git help -a usage: git [--version] [--help] [-c name=value] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] <command> [<args>] available git commands in '/usr/libexec/git-core' add count-objects grep merge-recursive remote show-ref add--interactive credential hash-object merge-resolve remote-ext stage am credential-cache help merge-subtree remote-fd stash annotate credential-cache--daemon http-backend merge-tree remote-ftp status apply credential-gnome-keyring http-fetch mergetool remote-ftps stripspace archive credential-store http-push mktag remote-http submodule bisect describe imap-send mktree remote-https subtree bisect--helper diff index-pack mv remote-testpy symbolic-ref blame diff-files init name-rev repack tag branch diff-index init-db notes replace tar-tree bundle diff-tree instaweb pack-objects repo-config unpack-file cat-file difftool log pack-redundant request-pull unpack-objects check-attr difftool--helper lost-found pack-refs rerere update-index check-ignore fast-export ls-files patch-id reset update-ref check-ref-format fast-import ls-remote peek-remote rev-list update-server-info checkout fetch ls-tree prune rev-parse upload-archive checkout-index fetch-pack mailinfo prune-packed revert upload-pack cherry filter-branch mailsplit pull rm var cherry-pick fmt-merge-msg merge push send-pack verify-pack clean for-each-ref merge-base quiltimport sh-i18n--envsubst verify-tag clone format-patch merge-file read-tree shell web--browse column fsck merge-index rebase shortlog whatchanged commit fsck-objects merge-octopus receive-pack show write-tree commit-tree gc merge-one-file reflog show-branch config get-tar-commit-id merge-ours relink show-index 'git help -a' and 'git help -g' lists available subcommands and some concept guides. See 'git help <command>' or 'git help <concept>' to read about a specific subcommand or concept. 2014/11/04 社内勉強会資料74
  • 75. 参考になる情報 探せばいくらでも見つかる ◦ 公式ウェブサイト ◦ リファレンスマニュアルhttp://git-scm.com/docs ◦ 解説書『Pro Git』の和訳http://git-scm.com/book/ja/v1 ◦ 初心者向けの全般的な解説 ◦ Git チュートリアルhttps://www.atlassian.com/ja/git/ ◦ いつやるの? Git 入門http://www.slideshare.net/matsukaz/git-28304397 ◦ サルでもわかるGit 入門http://www.backlog.jp/git-guide/ ◦ リンク集 ◦ Git 初心者が見るべきサイトまとめ http://matome.naver.jp/odai/2136491451473222801 2014/11/04 社内勉強会資料75