Slide 1

Slide 1 text

git-svn で始める ボッチのための Git 2014/09/25 @oohira

Slide 2

Slide 2 text

今日話したいことは たった1つ

Slide 3

Slide 3 text

git-svn を使って仕事でも Git を始めよう

Slide 4

Slide 4 text

でも結構ハマったから ノウハウ共有するよ

Slide 5

Slide 5 text

逆に今日話さないこと

Slide 6

Slide 6 text

Git/GitHub の使い方 チーム開発への Git の導入 Subversion との費用対効果 プルリクベースの開発

Slide 7

Slide 7 text

あくまで ボッチのための Git

Slide 8

Slide 8 text

google-trends “git” “subversion”

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

うちで使ってるライブラリ

Slide 11

Slide 11 text

jQuery Bootstrap Ember.js Handlebars.js Twitter4J :

Slide 12

Slide 12 text

全部 Git/GitHub Git が使えないと パッチも送れない 例外は、Apache 系ぐらい?

Slide 13

Slide 13 text

理由は色々付けられるけど 要はもう Git 使いたい

Slide 14

Slide 14 text

とはいえ会社は Subversion 現役

Slide 15

Slide 15 text

git-svn !!

Slide 16

Slide 16 text

SVN Repos SVN Users Git Users Git Repos git commit git checkout git svn rebase git svn dcommit svn update svn commit Git Repos git commit git checkout git svn clone svn checkout

Slide 17

Slide 17 text

git-svn を使う前準備 (Windows)

Slide 18

Slide 18 text

ここが一番大変で萎える … 全力でスキップ

Slide 19

Slide 19 text

1. SVN への公開鍵認証 ● http://www.flagsystem.co.jp/news /archives/50 ● 確認 o PuTTY でパスワード入力なしで SVN サー バーに SSH 接続できる o TortoiseSVN でパスワード入力なしでリポ ジトリブラウザを開ける

Slide 20

Slide 20 text

2. msysgit のインストール $ vi ~/.bashrc # 起動時に 1.で作った秘密鍵を登録 eval `ssh-agent` ssh-add ~/.ssh/id_rsa # Git Bash で日本語入力できないので外部エディタ指定 export EDITOR=/c/tool/emacs/bin/emacsclientw.exe # 日本語ファイル名の表示 alias ls='ls -F --color --show-control-chars' ● http://msysgit.github.io/ $ git clone https://github.com/octocat/Spoon-Knife.git

Slide 21

Slide 21 text

3. authors-file の作成 $ svn log --xml svn+ssh://path/to/svn/repos/ | grep "(.*?)<¥/author>/$1 = $1 <$1¥@example.com>/ > ~/svnauthors.txt $ cat ~/svnauthors.txt foo = foo bar = bar ... # SVNユーザー名 = Gitユーザー名 # 必要なら手動編集して調整

Slide 22

Slide 22 text

4. SVN リポジトリを clone ● rev.9800 o 14 … (^o^) $ git svn clone -A ~/svnauthors.txt -s -- prefix svn/ svn+ssh://path/to/svn/repos/

Slide 23

Slide 23 text

5. Git リポジトリの初期設定 $ cd /path/to/git-repos/ ## svn:ignore を引き継ぐ $ git svn show-ignore >> .git/info/exclude ## ユーザー名(authors-fileに合わせる) ## --global でもいいけど、GitHubとかも併用するので $ git config user.name foobar $ git config user.email [email protected] ## 改行コード(true推奨だが、既存コードに不要なdiffが出るので) $ git config core.autocrlf false ## authors-file(自動設定されているはず) $ git config svn.autorsfile c:/path/to/svnauthors.txt ## 確認 $ git config -l

Slide 24

Slide 24 text

SVN Repos Git Users Git Repos git commit git checkout git svn rebase git svn dcommit 準備完了!

Slide 25

Slide 25 text

逆引き git-svn 10選 (ほとんど git なんだけど…)

Slide 26

Slide 26 text

1. SVN → Git リポジトリへ更新を取得 ● git-svn 専用コマンド o git pull 相当 未コミットの修正がある場合 $ git checkout master $ git svn rebase $ git stash # 現在の修正を一時退避 $ git svn rebase $ git stash pop

Slide 27

Slide 27 text

2. Git リポジトリへ修正をコミット $ git status # 変更状態の確認 $ git add README.txt # コミット対象をstaging $ git add LICENSE.txt $ git commit ● ローカルリポジトリにコミットされるだけ o 他の人には見えないので失敗しても平気 ● IntelliJ IDEA から GUI でもコミット可能 o Subversion とだいたい同じ

Slide 28

Slide 28 text

3. Git → SVN リポジトリへ更新を反映 ● git-svn 専用コマンド o git push 相当 ● Git 側に溜まったコミットを SVN に反映 o git svn dcommit してはじめて他の SVN ユーザーに 見える(もう取り消せない) ● 注意 o master ブランチ以外からしない o 事前に git svn rebase で最新にしておく $ git checkout master $ git svn dcommit

Slide 29

Slide 29 text

4. コミット履歴の確認 $ git log # 基本 $ git log -2 # 直近2コミットだけ表示 $ git log -p # 変更点のdiffも表示 $ git log --oneline # 1コミット1行で表示 $ git log --graph # グラフ表示 $ git log --decorate # ブランチ名を表示 $ git log --branches # 他のブランチも表示 ● git help log

Slide 30

Slide 30 text

5. ブランチの操作 ● チケット単位で作るとよい ● 他の人には影響がないので、気軽に作って 気軽に削除できる $ git checkout -b topic-branch # 作成 $ git branch # 一覧 master * topic-branch $ git checkout master # 切り替え $ git branch -D topic-branch # 削除

Slide 31

Slide 31 text

6. SVN の更新をブランチに反映 $ git checkout master # まずmasterをSVNに追従 $ git svn rebase $ git checkout topic-branch # branchをmasterに追従 $ git rebase master ● HEAD からブランチを作り直すイメージ X' Y' topic-branch master X Y topic-branch

Slide 32

Slide 32 text

7. ブランチの修正をマージ (--no-ff) $ git checkout topic-branch $ git rebase master $ git checkout master $ git merge --no-ff --no-commit topic-branch # コミットコメントを自分で書くため --no-commit $ git commit ● Git 側にはキレイなマージログが残る ● SVN 側は A, B, C を1回でまとめてコミット したログになる A B C topic-branch master master

Slide 33

Slide 33 text

8. ブランチの修正をマージ (--ff-only) $ git checkout topic-branch $ git rebase master $ git checkout master $ git merge --ff-only topic-branch ● Git 側はブランチとは分からないログになる ● SVN 側も A, B, C をコミットしたログになる o SVN 側でコミットを分けたいとき A B C topic-branch master master

Slide 34

Slide 34 text

9. 直前のコミットを修正する ● 合体した1つのコミットになるイメージ ● すでに git svn dcommit してたらダメ $ git commit $ git commit --amend # コミットコメントのみ修正 $ vi README.txt $ git add README.txt $ git commit --amend # コミット内容も修正

Slide 35

Slide 35 text

10. コミット履歴を改変する ● 直近 n 個のコミットを修正したり、1つにま とめたりできる ● ここでは説明しきれないけどオススメ o typo に後で気付いて修正 o 関係ないコミットが混ざってたので除外 o 作業途中でもコミットしといて後で整理 $ git rebase -i HEAD~ # は数字

Slide 36

Slide 36 text

ボッチ Git してみて

Slide 37

Slide 37 text

Good ● 周りを気にせず Git が使える ● Git の使い方をゆるやかに学べる ● 複数のチケットを同時進行できる ● 気軽に試して捨て(寝かせ)られる ● 体感して分かる気持ちよさ

Slide 38

Slide 38 text

Bad ● SVN での見え方を気にしたマージ ● SVN に反映してからミスに気付く ● SVN 側のブランチ操作とかリリース 周りは怖くて手を出せてない ● 思ったほど速くない? ● やっぱりプルリクしたい

Slide 39

Slide 39 text

欲は出るけど 最初のステップとしては 「あり」

Slide 40

Slide 40 text

まとめ

Slide 41

Slide 41 text

会社に Git が導入されるのを 待っている必要はない

Slide 42

Slide 42 text

git-svn で Git を始めよう

Slide 43

Slide 43 text

● Git - Git and Subversion o http://git-scm.com/book/en/Git-and-Other-Systems-Git-and- Subversion ● Git svnではじめる忍者のごとく潜むgit o http://www.slideshare.net/kazukisato0920/git-svngit ● git-svnを使うときのベストプラクティス o http://layzie.hatenablog.com/entry/20121216/1355653349 ● 図で分かるgit-mergeの--ff, --no-ff, --squashの違い o http://d.hatena.ne.jp/sinsoku/20111025/1319497900 ● こわくない Git o http://www.slideshare.net/kotas/git-15276118 ● Git における履歴の書き換え o https://www.atlassian.com/ja/git/tutorial/rewriting-git- history 参考文献