Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Subversion to Git
Search
monzou
December 22, 2012
Programming
5
2k
Subversion to Git
社内勉強会で使用した資料から一部社外に公開出来ないものを取り除いたものです。
間違い等あるかもしれません。
monzou
December 22, 2012
Tweet
Share
More Decks by monzou
See All by monzou
NewsPicks と SPEEDA を連携させてる話
monzou
1
4.3k
How we Build a NewsPicks
monzou
4
2.7k
Java が支える 人気ニュースアプリ NewsPicks の裏側
monzou
25
12k
NewsPicks を支える技術と怖い話
monzou
27
7k
Modern Java Web / SPA Development
monzou
24
6.8k
Other Decks in Programming
See All in Programming
Why Jakarta EE Matters to Spring - and Vice Versa
ivargrimstad
0
1.1k
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
170
みんなでプロポーザルを書いてみた
yuriko1211
0
260
OnlineTestConf: Test Automation Friend or Foe
maaretp
0
110
Nurturing OpenJDK distribution: Eclipse Temurin Success History and plan
ivargrimstad
0
890
Less waste, more joy, and a lot more green: How Quarkus makes Java better
hollycummins
0
100
よくできたテンプレート言語として TypeScript + JSX を利用する試み / Using TypeScript + JSX outside of Web Frontend #TSKaigiKansai
izumin5210
6
1.7k
AWS IaCの注目アップデート 2024年10月版
konokenj
3
3.3k
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
1
290
Amazon Bedrock Agentsを用いてアプリ開発してみた!
har1101
0
330
Jakarta EE meets AI
ivargrimstad
0
140
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
610
Featured
See All Featured
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
Become a Pro
speakerdeck
PRO
25
5k
Rails Girls Zürich Keynote
gr2m
94
13k
YesSQL, Process and Tooling at Scale
rocio
169
14k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Happy Clients
brianwarren
98
6.7k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Designing for humans not robots
tammielis
250
25k
The Pragmatic Product Professional
lauravandoore
31
6.3k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Transcript
Subversion to
Git の基本とメリットをデモを交えて紹介します。 Git を知らない人が「Git って便利じゃね?」「Git 使いたい!」 と思ってくれることが目標です。 ※ 世の中には Git
の情報が溢れているので, Git の基本について細かい説明はしません。 今日の目的
Eclipse の Git プラグイン。 最近では Git の基本機能をほぼ利用出来るようになっている。 開発が活発。 EGit GitHub
が提供している Windows 向けクライアント。 (特に GitHub に限定したツールではありません) Git の機能を「簡単に」使えるような UI を備えている。 Git の Shell も付属するため、EGit で出来ない操作はコチラを使う。 GitHub for Windows 以下のツールを使います。
最初に:某さんの疑問 どう生産性が上がるのか? → 履歴の参照や比較, マージが高速に動作するので待ち時間が減少する → ローカルリポジトリが使えるので作業単位が気軽に記録できる → 気軽にブランチが作成出来るのでリファクタリングの敷居が下がる どうプロジェクト運営が楽になるのか?
→ 楽になるというよりも運用方法が大きく変わると思います → チームによって運用方法は変わってくると思いますが, 一例をあとで紹介します どう品質向上に役立つのか? → コミット単位が整理され, 履歴がシンプルになる → チームで Pull Request を活用すれば, コードで会話出来る → GitHub を使えば意味のあるコードが共有出来るのでチーム全体のレベルアップに
#1 Git のキホン #2 GitHub のキホン #3 当社 での活用イメージ
Git キホン の
Git? ・分散型 バージョン管理システム ・分散 ・高速 ・強力な並列開発サポート ← git ← subversion
・デファクトスタンダード ・Subversion の時代は終わりつつある
集中型 (Subversion)
分散型 (Git)
分散型 (Git)
分散型 (Git)
リポジトリが分散 記録と公開の分離 ローカルリポジトリを使うので高速 集中型 分散型 と
良いことばかりでもない・・・ ・ファイルがロック出来ない → 設計書(バイナリ)の管理には向いてない ・Subversion と比べると複雑な操作 → チームメンバーの教育が必要 → エンジニアじゃない人が多いとツラい
基本的な使い方 リモート リポジトリ
基本的な使い方 clone ローカル リポジトリ リモート リポジトリ
基本的な使い方 clone ローカル リポジトリ リモート リポジトリ checkout ワークツリー
基本的な使い方 clone ローカル リポジトリ リモート リポジトリ edit checkout ワークツリー
基本的な使い方 clone ローカル リポジトリ リモート リポジトリ ステージ add edit checkout
ワークツリー
基本的な使い方 clone ローカル リポジトリ リモート リポジトリ ステージ add commit edit
checkout ワークツリー
基本的な使い方 clone ローカル リポジトリ リモート リポジトリ ステージ add commit push
edit checkout ワークツリー
基本的な使い方 clone ローカル リポジトリ リモート リポジトリ ステージ add commit push
pull fetch edit checkout ワークツリー
Demo
リビジョン (SHA-1 ハッシュ) commit の コミットの作成者 (Author) コミットの適用者 (Committer) スナップショット
(Tree) ひとつ前の Commit (リビジョン)
リビジョン (SHA-1 ハッシュ) commit の コミットの作成者 (Author) コミットの適用者 (Committer) スナップショット
(Tree) ひとつ前の Commit (リビジョン) 特徴
リビジョン (SHA-1 ハッシュ) commit の コミットの作成者 (Author) コミットの適用者 (Committer) スナップショット
(Tree) ひとつ前の Commit (リビジョン) 特徴 重要
commit 辿れる 辿れる NEW OLD ひとつの Commit から過去を辿ることが出来る!
commit master ← 辿れる 辿れる NEW OLD 実はブランチもただの Commit の別名
master ← 辿れる 辿れる NEW OLD この状態で Commit したら・・・
master ← 辿れる 辿れる NEW OLD この状態で Commit したら・・・ こっち
ある Commit から過去(コミットグラフ)を辿ることが出来る commit の ブランチ = 最新の Commit の別名
git で大事なのは Commit よりも Merge
Fast-Forward(早送りマージ) merge の Non Fast-Forward(ちゃんとしたマージ) Squash(まとめてマージ) Rebase(歴史をやり直す)
Fast-Forward(早送りマージ) merge の Non Fast-Forward(ちゃんとしたマージ) Squash(まとめてマージ) Rebase(歴史をやり直す) 重要ですが 説明すると 長くなるので
今回は省きます
merge Local → Local に merge するなら Fast-Forward でも OK
の Remote → Local に pull するときは rebase して履歴をシンプルに Local → Remote に push するときは rebase してから merge Remote → Remote に merge するときは Non Fast-Forward つかいかた の
merge Local → Local に merge するなら Fast-Forward でも OK
の Remote → Local に pull するときは rebase して履歴をシンプルに Local → Remote に push するときは rebase してから merge Remote → Remote に merge するときは Non Fast-Forward つかいかた の ※ トラッキング用のブランチを作るなら rebase する必要は無いですけどね。 ※ rebase は便利だけど落とし穴も・・・ 機能単位で commit を整理したいだけなら merge + squash だけで良いかもしれません。 色々な流派が あるので一概には 決められません
Subversion と比較してみる
Subversion あるある ① 履歴を参照するのが ツラい
履歴見せてよ
履歴見せてよ あとで仕事するわ〜
履歴見せてよ あとで仕事するわ〜 いやそろそろ見せてよ
履歴見せてよ あとで仕事するわ〜 いやそろそろ見せてよ 仕方ないなぁ・・・
履歴を参照するだけでも一苦労 Subversion では……
履歴を参照するだけでも一苦労 × Subversion では……
履歴を参照するだけでも一苦労 × 時間の無駄 Subversion では……
履歴を参照するだけでも一苦労 ×履歴を 見なくなる 時間の無駄 Subversion では……
履歴を参照するだけでも一苦労 ×履歴を 見なくなる 時間の無駄 品質の低下 Subversion では……
Git があるとき! ローカルリポジトリが あるから高速だね!
Git があるとき! ローカルリポジトリが あるから高速だね! やっと気軽に 履歴を見れるわー
Subversion あるある ② レビュー対象が どれか分からない
「とりあえず」中央リポジトリにコミット Subversion では……
「とりあえず」中央リポジトリにコミット × Subversion では……
「とりあえず」中央リポジトリにコミット × ひとつのチケットに 大量のコミット… Subversion では……
「とりあえず」中央リポジトリにコミット ×履歴が崩壊 ひとつのチケットに 大量のコミット… Subversion では……
「とりあえず」中央リポジトリにコミット ×履歴が崩壊 ひとつのチケットに 大量のコミット… レビュー対象が散乱して 細かいレビューが 難しくなる Subversion では……
Git があるとき! ローカルリポジトリに コミット出来るね!
Git があるとき! ローカルリポジトリに コミット出来るね! コミットはあとで 整理出来るよ。
Git があるとき! ローカルリポジトリに コミット出来るね! コミットはあとで 整理出来るよ。 コミットが整理されてるから レビューもしやすいわー
$ git checkout -b sugoi-feature スゴイ機能開発用のブランチをつくってチェックアウト
$ touch sugoi.rb $ git checkout -b sugoi-feature スゴイ機能開発用のブランチをつくってチェックアウト
$ touch sugoi.rb $ git checkout -b sugoi-feature スゴイ機能開発用のブランチをつくってチェックアウト $
git add . スゴイ機能用のファイルをステージする
$ touch sugoi.rb $ git checkout -b sugoi-feature スゴイ機能開発用のブランチをつくってチェックアウト $
git add . スゴイ機能用のファイルをステージする $ git commit -m ‘とりあえずスゴイ機能のベースを追加 ’ スゴイ機能用のファイルを一旦ローカルリポジトリにコミット
$ touch sugoi.rb $ vi sugoi.rb $ git checkout -b
sugoi-feature スゴイ機能開発用のブランチをつくってチェックアウト $ git add . スゴイ機能用のファイルをステージする $ git commit -m ‘とりあえずスゴイ機能のベースを追加 ’ スゴイ機能用のファイルを一旦ローカルリポジトリにコミット
$ touch sugoi.rb $ vi sugoi.rb $ git add -u
$ git checkout -b sugoi-feature スゴイ機能開発用のブランチをつくってチェックアウト $ git add . スゴイ機能用のファイルをステージする $ git commit -m ‘とりあえずスゴイ機能のベースを追加 ’ スゴイ機能用のファイルを一旦ローカルリポジトリにコミット
$ touch sugoi.rb $ vi sugoi.rb $ git add -u
$ git checkout -b sugoi-feature スゴイ機能開発用のブランチをつくってチェックアウト $ git add . スゴイ機能用のファイルをステージする $ git commit -m ‘とりあえずスゴイ機能のベースを追加 ’ スゴイ機能用のファイルを一旦ローカルリポジトリにコミット $ git commit -m ‘added sugoi-feature’ 編集してから再コミット
$ git fetch origin origin と同期して……
$ git fetch origin origin と同期して…… $ git checkout -b
topic origin/master マージ用のブランチを作って……
$ git fetch origin origin と同期して…… $ git checkout -b
topic origin/master マージ用のブランチを作って…… $ git merge --squash sugoi-feature $ git commit -m ‘added sugoi-feature’ sugoi-feature を merge して……
$ git fetch origin origin と同期して…… $ git checkout -b
topic origin/master マージ用のブランチを作って…… $ git push origin topic push ! $ git merge --squash sugoi-feature $ git commit -m ‘added sugoi-feature’ sugoi-feature を merge して……
$ git fetch origin origin と同期して…… $ git checkout -b
topic origin/master マージ用のブランチを作って…… $ git push origin topic push ! ※ squash でマージする場合です。 運用次第ですがチームで開発するときはこれじゃ駄目だと思いマス…… きちんとルールを決めて運用しましょう。 $ git merge --squash sugoi-feature $ git commit -m ‘added sugoi-feature’ sugoi-feature を merge して……
$ git fetch origin origin と同期して…… $ git checkout -b
topic origin/master マージ用のブランチを作って…… $ git push origin topic push ! ※ squash でマージする場合です。 運用次第ですがチームで開発するときはこれじゃ駄目だと思いマス…… きちんとルールを決めて運用しましょう。 $ git merge --squash sugoi-feature $ git commit -m ‘added sugoi-feature’ sugoi-feature を merge して…… 普通は master で remote を tracking しつつ、 branch を master で rebase する人が多いと思いマス
Subversion あるある ③ さっきのコミット、 ファイルが漏れてた……
Subversion では…… おもむろに漏れていたファイルをコミット
Subversion では…… おもむろに漏れていたファイルをコミット ×
コミットが分散 Subversion では…… おもむろに漏れていたファイルをコミット ×
履歴が崩壊 コミットが分散 Subversion では…… おもむろに漏れていたファイルをコミット ×
履歴が崩壊 コミットが分散 レビューしづらい Subversion では…… おもむろに漏れていたファイルをコミット ×
Git があるとき! 前回のコミットを 訂正すれば良いね!
Git があるとき! 前回のコミットを 訂正すれば良いね! そもそも整理してから push するけどね
$ git add sugoi-spec.rb 漏れていたファイルをステージして……
$ git add sugoi-spec.rb 漏れていたファイルをステージして…… $ git commit --amend 前回のコミットを訂正!
$ git add sugoi-spec.rb 漏れていたファイルをステージして…… $ git commit --amend 前回のコミットを訂正!
やったね!
$ git add sugoi-spec.rb 漏れていたファイルをステージして…… $ git commit --amend 前回のコミットを訂正!
やったね! ただし・・・既に公開している コミットを訂正してはいけません!
Subversion あるある ④ さっきのコミットに 関係の無い 修正が混じってた……
Subversion では…… コミットしちゃったし仕方ないよね……
Subversion では…… コミットしちゃったし仕方ないよね……
Subversion では…… コミットしちゃったし仕方ないよね…… ×
Subversion では…… コミットしちゃったし仕方ないよね…… × コミットが散乱
Subversion では…… コミットしちゃったし仕方ないよね…… ×履歴の崩壊 コミットが散乱
Subversion では…… コミットしちゃったし仕方ないよね…… ×履歴の崩壊 レビューしづらい コミットが散乱
Git があるとき! 前回のコミットを 取り消せば良いね!
$ git add . $ git commit -m ‘added sugoi-feature’
例えば sugoi-feature.rb と sugoi-spec.rb がコミットされたとき
$ git add . $ git commit -m ‘added sugoi-feature’
例えば sugoi-feature.rb と sugoi-spec.rb がコミットされたとき spec は別のコミットに したいなぁ……
$ git add . $ git commit -m ‘added sugoi-feature’
例えば sugoi-feature.rb と sugoi-spec.rb がコミットされたとき spec は別のコミットに したいなぁ…… $ git reset HEAD^ sugoi-spec.rb インデックスの spec を HEAD のひとつ前の状態に戻して……
$ git add . $ git commit -m ‘added sugoi-feature’
例えば sugoi-feature.rb と sugoi-spec.rb がコミットされたとき spec は別のコミットに したいなぁ…… $ git reset HEAD^ sugoi-spec.rb インデックスの spec を HEAD のひとつ前の状態に戻して…… $ git commit --amend 前回のコミットを訂正!
$ git add . $ git commit -m ‘added sugoi-feature’
例えば sugoi-feature.rb と sugoi-spec.rb がコミットされたとき spec は別のコミットに したいなぁ…… $ git reset HEAD^ sugoi-spec.rb インデックスの spec を HEAD のひとつ前の状態に戻して…… $ git commit --amend 前回のコミットを訂正! ワークツリーはそのまま なので……
$ git add . $ git commit -m ‘added sugoi-feature’
例えば sugoi-feature.rb と sugoi-spec.rb がコミットされたとき spec は別のコミットに したいなぁ…… $ git reset HEAD^ sugoi-spec.rb インデックスの spec を HEAD のひとつ前の状態に戻して…… $ git commit --amend 前回のコミットを訂正! ワークツリーはそのまま なので…… $ git add sugoi-spec.rb 手元の sugoi-spec.rb を再度ステージして
$ git add . $ git commit -m ‘added sugoi-feature’
例えば sugoi-feature.rb と sugoi-spec.rb がコミットされたとき spec は別のコミットに したいなぁ…… $ git reset HEAD^ sugoi-spec.rb インデックスの spec を HEAD のひとつ前の状態に戻して…… $ git commit --amend 前回のコミットを訂正! ワークツリーはそのまま なので…… $ git add sugoi-spec.rb 手元の sugoi-spec.rb を再度ステージして $ git commit -m ‘added sugoi-spec’ コミット!
$ git add . $ git commit -m ‘added sugoi-feature’
例えば sugoi-feature.rb と sugoi-spec.rb がコミットされたとき spec は別のコミットに したいなぁ…… $ git reset HEAD^ sugoi-spec.rb インデックスの spec を HEAD のひとつ前の状態に戻して…… $ git commit --amend 前回のコミットを訂正! ワークツリーはそのまま なので…… $ git add sugoi-spec.rb 手元の sugoi-spec.rb を再度ステージして $ git commit -m ‘added sugoi-spec’ コミット! コミットが 分離出来たね!
Subversion あるある ⑤ ある機能の開発中に 別の作業を頼まれた……
Subversion では…… 今の作業が終わるまで待ってもらえます?
Subversion では…… 今の作業が終わるまで待ってもらえます? ×
チェックアウトしよう にも時間がかかる Subversion では…… 今の作業が終わるまで待ってもらえます? ×
作業が遅延 チェックアウトしよう にも時間がかかる Subversion では…… 今の作業が終わるまで待ってもらえます? ×
作業が遅延 チェックアウトしよう にも時間がかかる 忘れ去られるかも Subversion では…… 今の作業が終わるまで待ってもらえます? ×
Git があるとき! 今の作業内容を 一時的に待避すれば 良いね!
$ git checkout -b bug-1 bug-1 の修正中に・・・別のバグ修正を緊急で頼まれた!
$ git checkout -b bug-1 bug-1 の修正中に・・・別のバグ修正を緊急で頼まれた! でも手元には 修正中のコードが ・・・
$ git checkout -b bug-1 bug-1 の修正中に・・・別のバグ修正を緊急で頼まれた! でも手元には 修正中のコードが ・・・
$ git stash save こんなときは現在の作業状態を一時待避!
$ git checkout -b bug-1 bug-1 の修正中に・・・別のバグ修正を緊急で頼まれた! でも手元には 修正中のコードが ・・・
$ git stash save こんなときは現在の作業状態を一時待避! $ git checkout -b bug-2 別のブランチで bug-2 の対応を開始
$ git checkout -b bug-1 bug-1 の修正中に・・・別のバグ修正を緊急で頼まれた! でも手元には 修正中のコードが ・・・
$ git stash save こんなときは現在の作業状態を一時待避! 緊急対応中・・・(少々お待ちください) $ git checkout -b bug-2 別のブランチで bug-2 の対応を開始
$ git checkout -b bug-1 bug-1 の修正中に・・・別のバグ修正を緊急で頼まれた! でも手元には 修正中のコードが ・・・
$ git stash save こんなときは現在の作業状態を一時待避! $ git checkout bug-1 元のブランチに戻って・・・ 緊急対応中・・・(少々お待ちください) $ git checkout -b bug-2 別のブランチで bug-2 の対応を開始
$ git checkout -b bug-1 bug-1 の修正中に・・・別のバグ修正を緊急で頼まれた! でも手元には 修正中のコードが ・・・
$ git stash save こんなときは現在の作業状態を一時待避! $ git checkout bug-1 元のブランチに戻って・・・ $ git stash pop 一時待避していた作業内容を復帰させて bug-1 の対応を続行! 緊急対応中・・・(少々お待ちください) $ git checkout -b bug-2 別のブランチで bug-2 の対応を開始
$ git checkout -b bug-1 bug-1 の修正中に・・・別のバグ修正を緊急で頼まれた! でも手元には 修正中のコードが ・・・
$ git stash save こんなときは現在の作業状態を一時待避! $ git checkout bug-1 元のブランチに戻って・・・ $ git stash pop 一時待避していた作業内容を復帰させて bug-1 の対応を続行! 緊急対応中・・・(少々お待ちください) 並行作業が しやすいね $ git checkout -b bug-2 別のブランチで bug-2 の対応を開始
ココまでまとめるとこんな感じ Subversion Git コードの共有 中央リポジトリを介する リポジトリ間で自由 履歴の参照 遅い 速い コミット先
中央リポジトリ ローカルリポジトリ コミットの整理 不可 可 コミットの公開 commit = 公開 push して初めて公開 ブランチの作成 リモートで作成するしかない ローカルで幾つでも作れる マージ 遅い 速い 作業内容の待避 不可 可 ファイルのロック 可 不可 操作 単純 複雑
ココまでまとめるとこんな感じ Subversion Git コードの共有 中央リポジトリを介する リポジトリ間で自由 履歴の参照 遅い 速い コミット先
中央リポジトリ ローカルリポジトリ コミットの整理 不可 可 コミットの公開 commit = 公開 push して初めて公開 ブランチの作成 リモートで作成するしかない ローカルで幾つでも作れる マージ 遅い 速い 作業内容の待避 不可 可 ファイルのロック 可 不可 操作 単純 複雑 ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
GitHub キホン の
♥
Goldman Sachs だって使ってます
GitHub の代表的な機能 ① ・リポジトリの管理 ・高機能なリポジトリブラウザ ・プロジェクト管理機能(Issue, Wiki) ・プロジェクト情報の可視化(Network, Graphs) ・Watch,
Star(プロジェクトの注目度の指標) ・Fork(その場で自分用に Fork 出来る) ・Pull Request(パッチのやりとり)
GitHub の代表的な機能 ② ・ダッシュボード ・News Feed ・Notifications ・etc, etc ...
・ユーザーページ ・Activities ・Repositories ・etc, etc ... ・その他 ・Gist, GItHub Pages etc ...
GitHub の良いところ ・プロジェクトよりも「ヒト」にフォーカス ・誰が何をしているのか可視化 ・ちょっとした書き捨てのコードも共有 ・開発者同士のコラボレーションの促進 ・手軽に Fork ・手軽に Pull
Request
$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$ $$$$$$$$$$$ $$$$$$ $$
$$ $$$$$$ $$$$$$$$$$ $$$$$$$$$$$$$$$ github:enterprise $21 / user / month
$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$ $$$$$$$$$$$ $$$$$$ $$
$$ $$$$$$ $$$$$$$$$$ $$$$$$$$$$$$$$$ github:enterprise $21 / user / month ×
$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$ $$$$$$$$$$$ $$$$$$ $$
$$ $$$$$$ $$$$$$$$$$ $$$$$$$$$$$$$$$ $12,000 / 500 user / one-time
$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$ $$$$$$$$$$$ $$$$$$ $$
$$ $$$$$$ $$$$$$$$$$ $$$$$$$$$$$$$$$ $12,000 / 500 user / one-time ◦
GitHub Stash リポジトリブラウザ ˕ ◦ Issue ◦ ˕ (JIRA と連携)
Wiki ◦ ◦ 可視化 ˕ (Watch, Star, Network, Graphs) △ Fork ◦ ◦ Pull Request ◦ ◦ News Feed ◦ ◦ Notifications ˕ ◦ ユーザーページ ˕ ◦ スニペットの共有 ˕(Gist) × ホスティング ˕(GitHub Pages) × 参照権限の管理 ? ◦ API ˕ ◦ 色々と細かいところのユーザビリティも含めると 全体的に GItHub の方が常に進んでいるのは否めない・・・
GitHub Stash リポジトリブラウザ ˕ ◦ Issue ◦ ˕ (JIRA と連携)
Wiki ◦ ◦ 可視化 ˕ (Watch, Star, Network, Graphs) △ Fork ◦ ◦ Pull Request ◦ ◦ News Feed ◦ ◦ Notifications ˕ ◦ ユーザーページ ˕ ◦ スニペットの共有 ˕(Gist) × ホスティング ˕(GitHub Pages) × 参照権限の管理 ? ◦ API ˕ ◦ 色々と細かいところのユーザビリティも含めると 全体的に GItHub の方が常に進んでいるのは否めない・・・ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
GitHub Stash リポジトリブラウザ ˕ ◦ Issue ◦ ˕ (JIRA と連携)
Wiki ◦ ◦ 可視化 ˕ (Watch, Star, Network, Graphs) △ Fork ◦ ◦ Pull Request ◦ ◦ News Feed ◦ ◦ Notifications ˕ ◦ ユーザーページ ˕ ◦ スニペットの共有 ˕(Gist) × ホスティング ˕(GitHub Pages) × 参照権限の管理 ? ◦ API ˕ ◦ 色々と細かいところのユーザビリティも含めると 全体的に GItHub の方が常に進んでいるのは否めない・・・ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ͱ͍͑4UBTIͰ ࠷ݶඞཁͳػೳଗͬͯ·͢
とりあえず GitHub / Stash を使うとどうなるのか考えてみる
ありませんかこんなこと ① コードレビューしたいから ひとまずコミットして〜
ありませんかこんなこと ① コードレビューしたいから ひとまずコミットして〜 コミットしました〜
ありませんかこんなこと ① コードレビューしたいから ひとまずコミットして〜 コミットしました〜 ・・・これ、 全部リファクタリングして良い?
事前にコードで話し合おう Pull Request を有効に使いましょう
事前にコードで話し合おう Pull Request を有効に使いましょう 議論するための Pull Request もアリだよ
ありませんかこんなこと ② ここの処理は面倒だから 他の PJ のコードをコピペしよう
ありませんかこんなこと ② ここの処理は面倒だから 他の PJ のコードをコピペしよう 他の PJ で作ったライブラリ にはどんなものがあるんだろう?
ありませんかこんなこと ② ここの処理は面倒だから 他の PJ のコードをコピペしよう 他の PJ で作ったライブラリ にはどんなものがあるんだろう?
この PJ で作ったライブラリ、 他の PJ でも使えそうだけど 共有するのが面倒くさい・・・
コードを共有しよう Pull Request を使えば上手く 共有出来るかも?
コードを共有しよう Pull Request を使えば上手く 共有出来るかも? 共有ライブラリ をもっと作りたいな!
ありませんかこんなこと ③ もうすぐ評価レビューだ・・・
ありませんかこんなこと ③ もうすぐ評価レビューだ・・・ 開発チームのあいつ、 何やってるのか分からないんだよな
ありませんかこんなこと ③ もうすぐ評価レビューだ・・・ 開発チームのあいつ、 何やってるのか分からないんだよな 自分の成果が可視化されたら 良いんだけどな・・・
「ヒト」にフォーカスを当てよう Stashを使うと 「ヒト」の貢献が 見えてくるかも?
「ヒト」にフォーカスを当てよう Stashを使うと 「ヒト」の貢献が 見えてくるかも? 個人のナレッジを 共有する文化も 産まれるかもね
「ヒト」にフォーカスを当てよう Stashを使うと 「ヒト」の貢献が 見えてくるかも? 個人のナレッジを 共有する文化も 産まれるかもね モチベーションが上がって イノベーションが生まれそう
当社 での活用イメージ
基本は A successful git branching model を踏襲 ・中央リポジトリの master はマージ専用
・中央リポジトリの develop で開発 ・各開発者が中央リポジトリの develop を fork して開発 ・fork → upstream(中央リポジトリ)に Pull Request ・担当者が Pull Request をレビューして Non Fast-Forward でマージ ・リリースしたら master に Non Fast-Forward でマージ
fork ベースでの開発フロー company/product master develop monzou/product topic upstream として参照 自分の
fork から 本体の develop に Pull Request monzou/product:develop は company/product:develop と同期し, topic は develop で rebase してから push する
中央リポジトリのブランチで開発しても良いけど・・・ ・誤 push が発生する可能性があるので fork の方が安全 ・自分用のリモートリポジトリがある方が大きなミスは少なそう ・但し常に fork 元に同期しないといけないという手間が発生する
ローカルの master を upstream の 追従用にして, 常に master で rebase するようにする
#1. Stash / GitHub で company/product を fork 開発者の作業フロー ①
#1. Stash / GitHub で company/product を fork #2. fork
したリポジトリをローカルに clone $ git clone git://company.com/company/product.git 開発者の作業フロー ①
#1. Stash / GitHub で company/product を fork #2. fork
したリポジトリをローカルに clone $ git clone git://company.com/company/product.git 開発者の作業フロー ① #3. 開発用のトピックブランチを作成 $ git checkout -b topic develop
#1. Stash / GitHub で company/product を fork #2. fork
したリポジトリをローカルに clone $ git clone git://company.com/company/product.git 開発者の作業フロー ① #3. 開発用のトピックブランチを作成 $ git checkout -b topic develop #4. トピックブランチで開発・テスト $ git add . $ git commit -m ‘added topic’
開発者の作業フロー ② #5. fork したリポジトリの develop を fork 元リポジトリと同期 $
git checkout develop $ git pull upstream develop $ git push origin develop
#6. トピックブランチを develop で rebase $ git checkout topic $
git rebase develop 開発者の作業フロー ② #5. fork したリポジトリの develop を fork 元リポジトリと同期 $ git checkout develop $ git pull upstream develop $ git push origin develop
#6. トピックブランチを develop で rebase $ git checkout topic $
git rebase develop 開発者の作業フロー ② #7. コミットを整理する(必要であれば) $ git rebase -i #5. fork したリポジトリの develop を fork 元リポジトリと同期 $ git checkout develop $ git pull upstream develop $ git push origin develop
#6. トピックブランチを develop で rebase $ git checkout topic $
git rebase develop 開発者の作業フロー ② #7. コミットを整理する(必要であれば) $ git rebase -i #8. トピックブランチをリモートに push する $ git push origin topic #5. fork したリポジトリの develop を fork 元リポジトリと同期 $ git checkout develop $ git pull upstream develop $ git push origin develop
開発者の作業フロー ③ #9. Stash で Pull Request を送る monzou/product:topic →
company/product:develop に Pull Request
開発者の作業フロー ③ #9. Stash で Pull Request を送る monzou/product:topic →
company/product:develop に Pull Request #9b. Pull Request が却下されたら修正して再 push #9c. Pull Request が放置されていたら mention を書いてコメント @leader この Pull Request を確認してください
開発者の作業フロー ③ #9. Stash で Pull Request を送る monzou/product:topic →
company/product:develop に Pull Request #9b. Pull Request が却下されたら修正して再 push #9c. Pull Request が放置されていたら mention を書いてコメント @leader この Pull Request を確認してください Stash も GitHub も コメント欄で @mention を 飛ばすことが出来るよ
開発者が Pull Request を送ったら・・・ #1. レビュー担当者が Pull Request マージして内容を確認 $
git remote add monzou git://company.com/monzou/product.git $ git fetch monzou $ git checkout develop $ git merge --no-ff monzou/topic -m ‘Merged in topic (pull request #1)’
開発者が Pull Request を送ったら・・・ #1. レビュー担当者が Pull Request マージして内容を確認 $
git remote add monzou git://company.com/monzou/product.git $ git fetch monzou $ git checkout develop $ git merge --no-ff monzou/topic -m ‘Merged in topic (pull request #1)’ #2. レビュー担当者がリモートにマージ結果を push $ git push origin develop
開発者が Pull Request を送ったら・・・ #1. レビュー担当者が Pull Request マージして内容を確認 $
git remote add monzou git://company.com/monzou/product.git $ git fetch monzou $ git checkout develop $ git merge --no-ff monzou/topic -m ‘Merged in topic (pull request #1)’ #2. レビュー担当者がリモートにマージ結果を push $ git push origin develop #3. Jenkins がマージされた develop ブランチをビルド
予想される問題 レビュー待ちの Pull Request が滞留する ・Pull Request が滞留するとコンフリクトがどんどん増える ・レビュー担当者を分散する ・mention
を有効活用して早めに担当者に通知する ・細かい修正は最悪 Pull Request せずに直接開発者がマージしてしまう
予想される問題 レビュー待ちの Pull Request が滞留する ・Pull Request が滞留するとコンフリクトがどんどん増える ・レビュー担当者を分散する ・mention
を有効活用して早めに担当者に通知する ・細かい修正は最悪 Pull Request せずに直接開発者がマージしてしまう Pull Request 送信時に検出されない不具合が増える ・Pull Request 送信時のブランチを事前にビルドしないと分からない ・でも Pull Request 毎に Jenkins にビルドさせるのは難しい・・・ ・こまめに対応するしかない
まとめ ローカルリポジトリ → 個人の生産性向上 Stash + Pull Request→ チームの生産性・品質向上 Stash
で「ヒト」にフォーカス → エンジニアの交流活性化 Stash でコード共有の活性化 → 開発効率の向上
Any Questions ?