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
とりあえずこれだけ知っていればお仕事ができる(であろう)gitガチ入門
Search
Infiniteloop
August 17, 2023
Programming
0
110
とりあえずこれだけ知っていればお仕事ができる(であろう)gitガチ入門
1月29日にインフィニットループ社内勉強会で使用した、git入門用スライドです。
Infiniteloop
August 17, 2023
Tweet
Share
More Decks by Infiniteloop
See All by Infiniteloop
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
0
370
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
0
460
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
infiniteloop_inc
0
600
詫び石の裏側
infiniteloop_inc
0
500
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
7
28k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
170
ADRという考えを取り入れてみて
infiniteloop_inc
0
160
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
130
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
110
Other Decks in Programming
See All in Programming
Kubernetes History Inspector(KHI)を触ってみた
bells17
0
200
知られざるDMMデータエンジニアの生態 〜かつてツチノコと呼ばれし者〜
takaha4k
4
1.3k
Flutter × Firebase Genkit で加速する生成 AI アプリ開発
coborinai
0
150
iOSエンジニアから始める visionOS アプリ開発
nao_randd
3
120
ISUCON14公式反省会LT: 社内ISUCONの話
astj
PRO
0
180
SwiftUIで単方向アーキテクチャを導入して得られた成果
takuyaosawa
0
260
Amazon Q Developer Proで効率化するAPI開発入門
seike460
PRO
0
110
Formの複雑さに立ち向かう
bmthd
1
720
DROBEの生成AI活用事例 with AWS
ippey
0
130
SRE、開発、QAが協業して挑んだリリースプロセス改革@SRE Kaigi 2025
nealle
3
4.1k
CNCF Project の作者が考えている OSS の運営
utam0k
5
690
【PHP】破壊的バージョンアップと戦った話〜決断と説得
satoshi256kbyte
0
120
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
244
12k
Music & Morning Musume
bryan
46
6.3k
Rails Girls Zürich Keynote
gr2m
94
13k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
99
18k
BBQ
matthewcrist
86
9.5k
Designing Experiences People Love
moore
139
23k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Faster Mobile Websites
deanohume
306
31k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2.1k
Facilitating Awesome Meetings
lara
51
6.2k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.4k
Transcript
とりあえずこれだけ知っていれば お仕事ができる(であろう)gitガチ入門 〜ソースのクローンからコミットのプッシュまで〜
gitってなんすか? ('A`)y-~
wikipediaより
なんでこういう技術的な事って わざわざ難しく書くの?
バージョン管理を使ってないソース管理の事例
個人用PC 個人用PC 個人用PC 共有PC WEBサーバー 直接改修 直接改修 直接改修 デプロイ (FFFTP)
('A`)y-~ 私の前職での環境です
今日の目標 無理に使い方を覚えようとするのではなく、興味を持って頂く事。 使い方の解説も行いますがこんなスライドのみで使い方を覚えるなんて無理な話なので こんな使い方出来るんだよ〜、という事を知って「使ってみたい」と思って頂きたいと。
結局gitって何よ? とにかくわかりやすく、乱暴に解説 ファイルに対して「誰が」「いつ」「何を変更したか」というような 情報を記録することで、過去のある時点の状態を復元したり変更内容の差分を 表示できるようにするシステムのこと。
よくわからないから図で見せて ひのきのぼう と きのたて 買った なんか女の子仲間になった レベル10まで上げた お墓のボス倒した 女の子に危ない水着買ってやった ひとりになった
gitのリポジトリ関係図 ローカル リポジトリ ローカル リポジトリ リモートリポジトリ ソースの 作成・改修 ソースの 作成・改修
ローカル環境 コミット作成 コミット作成 コミットのpush コミットのpush コミットのclone merge / rebase コミットのclone merge / rebase
実際にやってみます ※注意※ 解説中に出てくるorigin/masterというブランチ名はプロジェクトによって異なる可能性があります。 その際は脳内で読み替えてください(・∀・)
git clone
ローカル リポジトリ リモートリポジトリ ローカル環境 コミットのクローン https://github.com/vjsigsig/testhoge.git リポジトリURL ひのきのぼう と きのたて 買った なんか女の子仲間になった レベル10まで上げた
お墓のボス倒した 女の子に危ない水着買ってやった ひとりになった
git log
git log プロジェクトの歴史が表示されます。下であれば古く、上に行くほど新しくなります。 一つ一つのコミットそれぞれにソースコードの改変や新規作成をしたんだよ。という歴史の単位と認識頂ければわかりやすいと思います。 正確にはコミットを表すものは黄色い文字の「239b4fc787・・・・」ですが、これだけだとなんのコミットなのか意味がわからないので 「Logクラスの実装」などわかりやすく名前をつけてあげます。(コミットメッセージ) コミットメッセージのガイドライン ✔コミット名と本文の間は一行空けよう ✔コミット名は50文字以内で!(つまり日本語だと 25文字までって事ですね)
✔本文は一行72文字以内で!(つまり日本語だと 36ry) ✔「何をしたか」よりも「なぜそうしたか」を書くように意識しよう
git status
ファイルの状態 [modified:] 既存のファイルに変更があったよ、という状態です。 [Untracked] gitの管理下に無いファイルが存在してるよ。という状態です。 つまり新規作成されたファイルですね。 [both modified:] 取り込んできたコミットの内容と自分が編集した(だけではありません)箇所等で 変更内容が重複しており、どちらを反映させればよいか
gitだけでは判断ができず ユーザーの修正を待っている。という状態です。コンフリクトと言います。 git status 現在の状態から、どのファイルが変更されたか。どのファイルが新たに追加されたか。という情報を閲覧できます。 こちらのコマンドは恐らくgitで最も使うコマンドかと思います。 コミットを作成する前や作成した後など、何かしらの変更を加えた際は都度git statusで確認する癖をつけると安心です。
git add / git commit
git add 新規作成されたファイルや、変更のあったファイルをインデックスに追加、ステージングに追加など難しい言い方をされることが多いですが 簡単に言うと次回コミットの対象にするファイルを選択するコマンドです。 modified: wasshoi1.txt modified: wasshoi2.txt Untracked files
./wasshoi7.txt modified: wasshoi4.txt modified: wasshoi5.txt new file: wasshoi8.txt wasshoi4,5,8を修正・追加 #modified: wasshoi4.txt #modified: wasshoi5.txt #new file: wasshoi8.txt なんか一人になった #deleted: onnna.txt add前の編集中のファイル ステージングに登録中の ファイル ローカルコミット git commit git add で登録したファイルをコミットという単位にパッケージ化して登録するコマンドです。 1コミットはなるべく規模を小さく区切ると、バグの調査やコミットの取り消しが容易になるというメリットがあります。
git fetch
git fetch ローカルリポジトリをリモートリポジトリと同期させます。 つまり自分の環境にリモートリポジトリの情報を取ってくるコマンドです。 ただし、実行した時点でコミットが反映されるわけではなく、あくまで後程ご紹介するコミットを反映させる準備を整えるだけです。 リモートリポジトリ リモートの状態を fetch ローカル リポジトリ
git rebase
git rebase rebaseは少し複雑で、リモートリポジトリから取得したコミット(正確にはorigin/masterに格納されているコミット)をローカルリポジトリに 反映させるコマンドですが、もう一つ役割があります。 リモートからコミットを反映させる際、ローカルのみに存在しているコミットがあった場合、一旦そのコミットを亜空間に移します。 その状態でリモートからのコミットを反映させ、先程亜空間に送ったコミットを元にコミット内容を忠実に再現し、現在のコミット群の上に 積む。という複雑な事をしています。 亜空間から取出したコミットはあくまで再現なので、コミット識別番号(ハッシュ値)はrebase前のものとは異なります。 ローカル ゲームオーバーになっ
た ひとりになった 危ない水着買ってやっ た origin/master お金が無くなった イケメンになった ひとりになった 危ない水着買ってやった rebase origin/master ローカル ひとりになった 危ない水着買ってやっ た ゲームオーバーになった ローカルのみの コミットを亜空間へ 合体後ローカル お金が無くなった イケメンになった ひとりになった 危ない水着買ってやっ た ゲームオーバーになった 再現 合体
git push
ローカル リポジトリ リモートリポジトリ ローカル環境 コミットのプッシュ https://github.com/vjsigsig/testhoge.git リポジトリURL git push ローカルにて作成したコミットをリモートリポジトリに反映させるコマンドです。改修・追加したコミットは最終的にこのコマンドによって
リモートリポジトリに送られ、改修を終えます。(現実的にはレビューや新たに発生したバグで更にコミットを追加するのですが…) ローカル ゲームオーバーになった ひとりになった 危ない水着買ってやった 女の子仲間になった リモート ひとりになった 危ない水着買ってやった 女の子仲間になった ゲームオーバーになった push
その他便利なコマンド
git branch ブランチの概念は麻雀に於ける平和のようなもので、gitでの基本概念ではあるのですが、実際にgitを運用せずに理解するのは 非常に難解です。今回の解説では、あえてブランチについては触れないようにさせて頂きました。 ぜひ実際に自分自身で運用し、ブランチの便利さと面白さを知って頂きたいと。 こちらのコマンドでは、そのブランチ名・ブランチの状態を確認することができます。 大まかにブランチは3種類あり、それぞれオプションを指定することで確認可能です。 ローカルブランチ story character
master_test master トラッキングブランチ origin/story origin/character origin/master git branch git branch -vv リモートブランチ origin/logic origin/story origin/character origin/master git branch -r
git stash 改修中のファイル(例によって厳密にはファイル単位ではありませんが)を亜空間に送り込むコマンドです。 modifiedやdeleted状態のファイルが、移動元・移動先何れかにしか存在していないコミットの中に含まれていた場合、ブランチ間の移動が 出来ないなど、改修の真っ只中の状態は割と制約を受ける事が多いです。 こちらのコマンドで今の変更を一時的に亜空間に送り込みましょう。 もちろん後から取り出せるのでご安心を。 ただ、stashは割と信用できない所があり、個人的にはstashに頼りすぎずこまめにコミットしてしまう事をおすすめします。 modified: wasshoi1.txt modified:
wasshoi2.txt deleted: wasshoi3.txt add前の編集中のファイル nothing to commit, working directory clean 未編集状態 『体験した事故事例』 うっかりHEADコミットで1000行程改修してしまったので、目的のコミットに反映させるため手動rebase(rebase -i)を行う。 目的のコミットをHEADにし、stash popした時点でちょっと用事を思い出し、手動rebase取消(rebase --abort)。 stash pop → No stash found. → 地獄 ①git stash ①git stash ②git stash pop ②git stash pop
git diff 現在行っている修正を、指定の箇所・ファイル・状態と比較して確認できるコマンドです。 デフォルトでは、最新のコミットとの比較に見えるのですが、正確にはインデックスとの比較です。addでインデックスに登録した後再度同じ ファイルを修正し、git diffを使用すると再現できます。 様々な対象との比較が出来るので汎用性が高く、こちらもよく使うコマンドの一つです。 @@ -308,28 +308,28
@@ class Team /** * フィーバータイムログ structure形式に変換する - * @param array $fever_time_log フィーバータイムログ - * @param int $fever_interval フィーバーの時間 - * @return array <structure name="FeverLog">型 + * @param array $fever_time_log フィーバータイムログ + * @param int $fever_interval フィーバーの時間 + * @return array <structure name="FeverLog">型 */ - static public function toFeverLogStructure($fever_time_log, $fever_interval) + public static function toFeverLogStructure($fever_time_log, $fever_interval) 現在の修正 と インデックスとの比較 $ git diff 現在の修正 と HEADコミットとの比較 $ git diff HEAD^ インデックス と HEADコミットとの比較 $ git diff --cached 特定のファイル と 特定のファイルとの比較 $ git diff ./hoge1.txt ./hoge2.txt
その他コマンド、ざっくり紹介 $ git checkout 1.ローカルブランチを切り替える 2.ローカルブランチを作成して切り替える 3.ファイルをHEADコミット時の状態に戻す これ以外にもたくさんの機能があり、覚えたての頃は、わかりにくいからコマンド分けろや!! と思っておりましたw $ git
reset 1.指定のコミットまで打ち消す 2.ファイルのインデックス登録を取り消す こちらもcheckoutと同じく、似てるようで全く違う事をやる系です。 $ git cherry-pick 別のブランチからコミットを引っ張り込みます。 masterに居ながらorigin/characterなどのトラッキングブランチからも直接取り出す 事も可能ですが、元となるファイルが無かったり、あまりにも差分が大きい場合はコンフリクトしたり等、すんなりいかない事が多い です。
まとめ ・後半は割と突っ込んだコマンドの紹介をさせて頂きましたが最初は clone ~ pushまでの 流れを覚えておけば OKです。 使っていくうちに自然と身についていきます。 ・繰り返しになりますが、こんなスライドだけで全部覚えようとしても難しいです。 実際に手を動かして実行結果を自分で確認しながら学ぶ学習法に勝るものは無いです。 ・gitが楽しく感じてきたら後は時間の問題。
参考資料 サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 http://www.backlog.jp/git-guide/ Gitがこわくて触れなかったけど、このスライドで 理解できるようになったよGitサイトまとめ http://programmerbox.com/2013-07-17_git_summary/ Git ワークフローとそのチュートリアル | アトラシアン https://www.atlassian.com/ja/git/workflows