Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Cookpad Summer Internship 2019 Day 1 Git
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
AKAMATSU Yuki
August 19, 2019
Programming
10k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cookpad Summer Internship 2019 Day 1 Git
AKAMATSU Yuki
August 19, 2019
More Decks by AKAMATSU Yuki
See All by AKAMATSU Yuki
今年できたチームの生産性を向上させたプラクティスの紹介 / Kaigi on Rails 2022
ukstudio
4
5.1k
Cookpad Tech Kitchen #24
ukstudio
0
800
Cookpad Summer Internship 2019 Day 1 Ruby TypeScript
ukstudio
0
10k
sdevtalks.org開発報告 / reporting that sdevtalks.org was launched
ukstudio
0
390
GraphQL on Rails
ukstudio
1
480
「なんでも」をしよう / 2018-12-19 s-dev talks LT
ukstudio
2
580
Rails Developers Meetup 2018 Extreme
ukstudio
0
3.6k
機能追加時における 仮説検証/s-dev-talks-01
ukstudio
0
1k
Rails Developers Meetup
ukstudio
6
3.7k
Other Decks in Programming
See All in Programming
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
270
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
4
3.6k
Family mrubyの進捗
kishima
1
100
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
230
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
2
230
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
自分的「カンファレンスの楽しみ方」
syumai
0
200
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
690
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
130
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
1k
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
320
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
730
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
410
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Side Projects
sachag
455
43k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
190
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
890
Un-Boring Meetings
codingconduct
0
410
Transcript
Day 1 Git/GitHub 赤松 祐希
講師 ・サーバーサイドエンジニア ・今回のインターンの実行委員長 赤松 祐希(@ukstudio) あかまつ ゆうき クックパッド株式会社 新規サービス開発部
TA ・2019.04 クックパッド新卒入社 ・2019.05~ 買物事業部 佐藤 敦也 (@n_atmark) さとう あつや クックパッド株式会社
買物事業部 エンジニア
この講義の目的 • GitとGitHubの基本的な使い方と開発ワークフローを理解する • 特に10 Dayの後半のOJTやPBLで重要になってきます
バージョン管理 • ファイルやファイルの集合に対して、日々の変更を記録するシステム・ツールの こと • 変更を取り消したり、過去のと特定のバージョンを呼び出すということも可能
Git • 分散型のバージョン管理システム ◦ 他の分散型ではMercurialなど • 対して中央集権型のバージョン管理システムもある ◦ Subversionなど •
Linuxの作者であるLinus TorvaldsがLinuxの開発のために作った • GitHubの存在もあり、ほぼデファクトと言ってもいい状態
中央集権型 • 分散型が主流になる前 • ネットワーク上にあるサーバーに変更をコミッ トしていく • 開発マシンがオフラインだったり、サーバーが ダウンしているとコミットすることができず開発 が継続できない
分散型 • 最近の主流 • ローカルにリポジトリをコピーするため、ローカ ルでも履歴を持つことができる • とはいえ、オリジンとなるリポジトリは必要 ◦ 例えばGitHubにあるリポジトリ
• ローカルで履歴を持つため、ローカルでコミッ トすることが可能
Gitの操作
初期設定 • コミットに記録される名前とメールアドレスを設定します • git config --global user.name “Your Name”
• git config --global user.email “Your email”
リポジトリの作成とファイルの追加 • リポジトリの作成 ◦ mkdir -p ~/works/git-handson ◦ cd ~/works/git-handson
◦ git init • ファイルを追加 ◦ echo “# README” > README.md ◦ git add README.md ◦ git commit -m “Add README.md”
3つのエリア • Working Directory ◦ ディスク上に配置されているファイル 郡がある場所 • Staging Area(.git/index)
◦ 次のコミットに含まれる情報が蓄えら れている場所 • Repository(.git/objects) ◦ リポジトリのデータベース ◦ メタデータやオブジェクトなどが格納さ れている
ブランチ • 本流(master)から分岐して履歴を記録することができる機能 • 複数のブランチを作ることができるので、並行して複数機能の開発も可能 • git branch new-feature •
git checkout new-feature • echo “## New Heading” >> README.md • git add README.md • git commit -m “Update README.md”
merge • ブランチでの開発が完了したら、変更をmasterに取り込む • git checkout master • git merge
--no-ff new-feature
fast forward • 雑に表現するとmerge時にmergeコミットを作るか、作らないか • --no-ff の場合、「必ず」mergeコミットを作る ◦ git log
を叩いて、mergeコミットができることを確かめよう • --no-ffをつけない場合、Gitがfast forwardできるか判断する ◦ git reset --hard HEAD^ ◦ git merge new-feature ◦ git logを叩いて、mergeコミットができていないことを確かめよう
fast forwardの仕組み • fast forwardの場合、実はマージ処理をしていない ◦ masterが示すリビジョンが変わっているだけ ◦ リビジョン=特定のコミットを認識するための一意な文字列
ff or no-ff • 個人的にはno-ffの方がよく使う ◦ GitHubのPull Requestのmergeもno-ff • mergeコミットが存在していると、その機能の差し戻し(revert)がラク
• ローカルでの開発でfeatureブランチから更に派生させたブランチをfeatureブラ ンチに手元でmergeする時に使う
rebase • git checkout feature-branch • git rebase master •
ブランチの派生元を変更するイメージ ◦ masterの変更をブランチに反映させる ときなどに使う • 親コミットが変わるため、コミットのリビジョン が変わることに注意
rebase vs merge • masterの変更を反映させるならmergeする方法もある • rebase ◦ ツリーがまっすぐキレイになる ◦
fast forwardでmergeできるようになる ◦ リビジョンが変わるため、リモートにforce pushするしかなくなる • merge ◦ コンフリクト解消がrebaseよりラク ◦ mergeコミットが多いと、履歴が順に読みづらくなる • コンフリクトが少ない & 人とブランチを共有していない状態ならrebase ◦ とは言え、結構どちらでもいいと思っています(個人の意見)
チーム開発
GitHub • 開発に多数の人間が関わる場合、リポジトリの管理や変更の取り込みの管理 などが大変 • GitHubを使うことで管理の手間を減らす • GitHub = ソースコードホスティングと表現されることもあるが、どちらかというと
開発のやり取りをする場 • オマケ: クックパッドではGitHub Enterpriseを使用 ◦ GitHubとは若干の違いがあったりします(新しい機能がまだ使えないとか)
GitHubでのチーム開発の全体象
GitHubでのチーム開発の全体象 1. 対象プロジェクトをGitHub上でforkする a. gitにforkという機能は実はないが、慣習的な理由もあり人のリポジトリの コピーを作ることをforkと言う 2. forkして出来たリモートリポジトリをローカルにclone 3. ローカルでbranchを切り、変更作業を行いコミット
4. ブランチをリモートリポジトリにpush 5. GitHub上でPull Requestを作成する 6. CIの確認、コードレビューなどをし、問題がなければマージする(or してもらう)
ローカルリポジトリとリモートリポジトリ • ネットワーク上にあるリポジトリをリモートリポジトリと言う • GitHubにあるリポジトリとローカルにあるリポジトリは別のものなので区別する ために使う • 1つのローカルリポジトリに複数のリモートリポジトリを設定することが可能 • 慣習的に以下の名前をつけることが多い
◦ upstream : forkの元となったオリジナルのリモートリポジトリ ◦ origin : cloneの元となったリモートリポジトリ
Pull Requestを送ってみよう • https://ghe.ckpd.co/yuki-akamatsu/2019-summer-intern-git をfork • cd ~/works • git
clone https://ghe.ckpd.co/[your-name]/2019-summer-intern-git • cd 2019-summer-intern-git • git branch add-my-readme • git checkout add-my-readme • vim [your-name].md ◦ 今回のインターンの意気込みを書こう • git add [your-name].md • git commit -m “Add [your-name].md” • git push origin add-my-readme • GHEからPull Requestを送ろう
Upstreamの更新をローカルに反映させよう • git remote add upstream
[email protected]
:yuki-akamatsu/2019-summer-intern-git.git • git remote
-v • git fetch upstream • git checkout master • git merge upstream/master
重要だけど話していないこと
わかりやすいコミットを作る • コードを読む時間は書く時間より長いという話もある • コードを読む際にコミットはとても貴重な情報源となる ◦ 例えば「ここはなぜこうなっているのだろう?」という疑問があったときにgit blameでコミットを見にいくとか • コードレビューの時にもまずザッとPRに含まれているコミットを眺める人も多い
コミットメッセージ • 「fix」というメッセージのコミットが一杯並んでいてもなにもわからない • コミットメッセージのタイトルには概要を簡潔に書く ◦ 「Use foo method instead
of bar method that deprecated」 • コミットメッセージの本文には「なぜ」を書くことを意識する ◦ 実際にどうやっているかはコードを読めばわかる ◦ 「なぜ」はコードを読んでもわからない ◦ タイトルで説明が済んでいれば本文はなくても良い
コミットの粒度 • 適切な粒度を説明するのは難しいが、少なくとも「大きすぎる」より「小さすぎる」 コミットの方がよい ◦ 迷ったら小さくする • 意図が伝わるコミットを目指す ◦ やりたいことに対して本質的な変更のみにする
◦ たまたま見つけたからと言って、関係のないtypoなどを一緒にまとめたりし ない
履歴を整える • とは言え、開発しながらコミットの粒度を保つのは大変 ◦ コミット後に修正漏れに気づくとか • 開発中はある程度適当にコミットしつつ、後で整える ◦ git rebase
-i ◦ git fixup
Pull Request • Pull Requestもコミット同様に大切 • Pull Requestも大きいより小さい方が良い ◦ レビュアーの負担が減る
◦ フォーマットの変更、リファクタリングなどは別に先に出す • Pull Requestのdescriptionを丁寧に ◦ Pull Requestの目的をちゃんと伝える ◦ Pull Requestを見る人が背景の事情を知っているとは限らない ◦ 画面の変更が入る場合、before / after のスクリーンショットを貼るなどす る