SlideShare a Scribd company logo
1 of 75
Download to read offline
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

More Related Content

What's hot

Git One Day Training Notes
Git One Day Training NotesGit One Day Training Notes
Git One Day Training Notesglen_a_smith
 
Gitはじめの一歩
Gitはじめの一歩Gitはじめの一歩
Gitはじめの一歩Ayana Yokota
 
30分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.230分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.2uchan_nos
 
はじめてのGit forデザイナー&コーダー
はじめてのGit forデザイナー&コーダーはじめてのGit forデザイナー&コーダー
はじめてのGit forデザイナー&コーダーSaeko Yamamoto
 
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理Takafumi Yoshida
 
Git flowの活用事例
Git flowの活用事例Git flowの活用事例
Git flowの活用事例Hirohito Kato
 
ポイントをおさえて移行しよう!Git乗り換え超初級
ポイントをおさえて移行しよう!Git乗り換え超初級ポイントをおさえて移行しよう!Git乗り換え超初級
ポイントをおさえて移行しよう!Git乗り換え超初級Kouji Matsui
 
バージョン管理のワークフロー
バージョン管理のワークフローバージョン管理のワークフロー
バージョン管理のワークフローadd20
 
デザイナのためのGit入門
デザイナのためのGit入門デザイナのためのGit入門
デザイナのためのGit入門dsuke Takaoka
 
Sphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメントSphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメントIosif Takakura
 
ノンプログラマでも今日から使える「Git」でバージョン管理
ノンプログラマでも今日から使える「Git」でバージョン管理ノンプログラマでも今日から使える「Git」でバージョン管理
ノンプログラマでも今日から使える「Git」でバージョン管理H2O Space. Co., Ltd.
 
ブランチを綺麗に保ち、どうやって本番アップするのか
ブランチを綺麗に保ち、どうやって本番アップするのかブランチを綺麗に保ち、どうやって本番アップするのか
ブランチを綺麗に保ち、どうやって本番アップするのかSaeko Yamamoto
 
20分でわかるgVisor入門
20分でわかるgVisor入門20分でわかるgVisor入門
20分でわかるgVisor入門Shuji Yamada
 
A Practical Introduction to git
A Practical Introduction to gitA Practical Introduction to git
A Practical Introduction to gitEmanuele Olivetti
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Pythonkwatch
 

What's hot (20)

Git One Day Training Notes
Git One Day Training NotesGit One Day Training Notes
Git One Day Training Notes
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 
Gitはじめの一歩
Gitはじめの一歩Gitはじめの一歩
Gitはじめの一歩
 
30分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.230分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.2
 
Git and Github
Git and GithubGit and Github
Git and Github
 
はじめてのGit forデザイナー&コーダー
はじめてのGit forデザイナー&コーダーはじめてのGit forデザイナー&コーダー
はじめてのGit forデザイナー&コーダー
 
Git
GitGit
Git
 
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
 
Git flowの活用事例
Git flowの活用事例Git flowの活用事例
Git flowの活用事例
 
Git (実践入門編)
Git (実践入門編)Git (実践入門編)
Git (実践入門編)
 
ポイントをおさえて移行しよう!Git乗り換え超初級
ポイントをおさえて移行しよう!Git乗り換え超初級ポイントをおさえて移行しよう!Git乗り換え超初級
ポイントをおさえて移行しよう!Git乗り換え超初級
 
バージョン管理のワークフロー
バージョン管理のワークフローバージョン管理のワークフロー
バージョン管理のワークフロー
 
デザイナのためのGit入門
デザイナのためのGit入門デザイナのためのGit入門
デザイナのためのGit入門
 
Sphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメントSphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメント
 
ノンプログラマでも今日から使える「Git」でバージョン管理
ノンプログラマでも今日から使える「Git」でバージョン管理ノンプログラマでも今日から使える「Git」でバージョン管理
ノンプログラマでも今日から使える「Git」でバージョン管理
 
ブランチを綺麗に保ち、どうやって本番アップするのか
ブランチを綺麗に保ち、どうやって本番アップするのかブランチを綺麗に保ち、どうやって本番アップするのか
ブランチを綺麗に保ち、どうやって本番アップするのか
 
20分でわかるgVisor入門
20分でわかるgVisor入門20分でわかるgVisor入門
20分でわかるgVisor入門
 
A Practical Introduction to git
A Practical Introduction to gitA Practical Introduction to git
A Practical Introduction to git
 
今さら聞けない人のためのGitLabの始め方 Ubuntu編
今さら聞けない人のためのGitLabの始め方 Ubuntu編今さら聞けない人のためのGitLabの始め方 Ubuntu編
今さら聞けない人のためのGitLabの始め方 Ubuntu編
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Python
 

Similar to 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.
 

Similar to Git 入門 (20)

20120324 git training
20120324 git training20120324 git training
20120324 git training
 
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超入門
 
はじめてのGit
はじめてのGitはじめてのGit
はじめてのGit
 

More from 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
 

More from 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 で拡張モジュールをビルドしてみた
 

Recently uploaded

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 

Recently uploaded (9)

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 

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