SlideShare a Scribd company logo
1 of 194
Download to read offline
Get Along With
Git 
早速ですが質問です
どうしてGit を使っているのですか??
Git以外...選択肢あるの? 🤔
Git以外...選択肢あるの? 🤔


安心してください。Git でOKです💁🏻‍♂️
ソースコードを管理するなら

現時点での最善はGitだと思います



しかし、まだまだGit ではない現場というのもあるのです…
これに対して

「なんだ、時代遅れの会社か🤷🏼‍♂️
」

と言う人は、大体何もわかってない人です。

無視しましょう🙆‍♂️
どうしてGit が使われているのか

Git以外の選択肢は何があるのか

余談ですが少〜しお付き合いください
What's VCS
Version Control System
電子的なファイルの変更履歴を残しておき、

過去の状態に戻したり変更内容を確認できるようにするソフトウェアの総称
音楽・写真・テキスト・書類など電子的な記録全てが対象
数あるVCS ソフトウェアのうちの1つがみんな大好きGitです
Git 以外にも有名なバージョン管理システムがいくつかあります

いまでも選択肢に上がる現役バリバリなものは以下の3つです
Git / Subversion / Mercurial
といっても、Mercurial を使っている人をみたことがないので

実質Git vs Subversion です。
Google Trends
ご覧の通りGit が流行る前はSubversion が最強でした🏋️‍♀️
まだSubversion が現役の組織もたくさんあります(弊社でも現役です)

では、なぜここまでGit が普及したのでしょう
もともとGit はLinux 開発者のLinus Tovalds が
「オープンソースでLinux作りたいんだけど
良いVCSないわ〜、作るわ〜」

と言い出してサクサク作ったものだそうです
(二週間で作ったという話です… 🙈)
もともとGit はLinux 開発者のLinus Tovalds が
「オープンソースでLinux作りたいんだけど
良いVCSないわ〜、作るわ〜」

と言い出してサクサク作ったものだそうです
(二週間で作ったという話です… 🙈)
そう、オープンソースのために作ったの
です。
どうしてオープンソースにはGitが良いの?
Git は分散型だからです
Subversion は中央集中型です
Subversion Git
オープンソースでSubversionを使うと



みんなで1箇所のサーバーに集中アクセスすることになります



ログを見るだけでもサーバーにアクセスです



サーバー死んじゃう!!😨
 じゃあGit 最強やん
Git is Champion?
🙅NO 🙅
”Git + GitHub” is Champion!!
🙆‍♂️
YES 🙆‍♂️




知らんけど🤪
GitHub  makes Git  Champion
GitHub の登場によってオープンソース活動が世の中に急速に拡大しました。
その結果「Git 最強じゃね?」となったのです。
GitHubのサービススタートが2010年です
Gitの大逆転が始まっていますね
長くなりましたが四方山話はこれでおしまいです
実用的な話をしましょう
実用的な話をしましょう
適当なフォルダでgit log とたたくと
fatal: not a git repository (or any of the parent directories): .git
と怒られます
not a git repository
gitリポジトリって何か説明できますか?
git commit って何か分かりますか?
分からなくなってきませんか? 😵‍💫
実際分からなくてもコードはかけます🤫
Gitの仕組みがわかると...🤔
Gitの仕組みがわかると...🤔
Gitの操作に自信が出る😎
.git の中身を見てみよう
.git ?? 🤔
Gitリポジトリであるかどうか...
それは.git があるかどうかです!
.git はGit リポジトリの情報をすべて保持している隠しフォルダです
Unpack the .git
git init から見ていきましょう
` `
~/.git $ tree -L 1
├── HEAD
├── config
├── description
├── hooks
├── info
├── objects
└── refs
8 directories, 17 files
git init で作ったgit リポジトリです
さっそくREADME.md をつくってコミットしてみましょう
~/gitdir $ echo test > README.md <-- README.mdを作って
~/gitdir $ git add README.md <-- ステージングにして
~/gitdir $ git commit -m "initialize repository" <-- コミット
[main (root-commit) d041e09] initialize repository
1 file changed, 1 insertion(+)
create mode 100644 README.md
[main (root-commit) d041e09] initialize repository
~/gitdir $ echo test > README.md <-- README.mdを作って
~/gitdir $ git add README.md <-- ステージングにして
~/gitdir $ git commit -m "initialize repository" <-- コミット
1 file changed, 1 insertion(+)
create mode 100644 README.md
[main (root-commit) d041e09] initialize repository
最初のコミットができましたね
~/gitdir $ echo test > README.md <-- README.mdを作って
~/gitdir $ git add README.md <-- ステージングにして
~/gitdir $ git commit -m "initialize repository" <-- コミット
1 file changed, 1 insertion(+)
create mode 100644 README.md
~/.git $ tree
// ~~~省略~~~
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── main
├── objects
│ ├── 9d
│ │ └── aeafb9864cf43055ae93beb0afd6c7d144bfa4
│ ├── c1
│ │ └── 2d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
│ ├── d0
│ │ └── 41e090b548f4ab7c11848384f9e171e728fc3d
│ ├── info
│ └── pack
└── refs
├── heads
│ └── main
└── tags
.gitにいろいろ増えました
Commit
[main (root-commit) d041e09] initialize repository
1 file changed, 1 insertion(+)
create mode 100644 README.md
.git/objects
├── objects
│ ├── 9d
│ │ └── aeafb9864cf43055ae93beb0afd6c7d144bfa4
│ ├── c1
│ │ └── 2d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
│ ├── d0
│ │ └── 41e090b548f4ab7c11848384f9e171e728fc3d
│ ├── info
│ └── pack
Commit
[main (root-commit) d041e09] initialize repository
.git/objects
├── objects
│ ├── 9d
│ │ └── aeafb9864cf43055ae93beb0afd6c7d144bfa4
│ ├── c1
│ │ └── 2d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
│ ├── d0
│ │ └── 41e090b548f4ab7c11848384f9e171e728fc3d
│ ├── info
│ └── pack
1 file changed, 1 insertion(+)
create mode 100644 README.md
Commit
[main (root-commit) d041e09] initialize repository
.git/objects
│ ├── d0
│ │ └── 41e090b548f4ab7c11848384f9e171e728fc3d
1 file changed, 1 insertion(+)
create mode 100644 README.md
├── objects
│ ├── 9d
│ │ └── aeafb9864cf43055ae93beb0afd6c7d144bfa4
│ ├── c1
│ │ └── 2d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
│ ├── info
│ └── pack
Commit
[main (root-commit) d041e09] initialize repository
.git/objects
│ ├── d0
│ │ └── 41e090b548f4ab7c11848384f9e171e728fc3d
おや、一致したID が見つかりましたね
1 file changed, 1 insertion(+)
create mode 100644 README.md
├── objects
│ ├── 9d
│ │ └── aeafb9864cf43055ae93beb0afd6c7d144bfa4
│ ├── c1
│ │ └── 2d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
│ ├── info
│ └── pack
解析してみましょう🥳
├── d0
└── 41e090b548f4ab7c11848384f9e171e728fc3d
git cat-file で解析できます
$ git cat-file -p d041 <-- 最初4文字くらいでOK
tree c12d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
author SuGit <sgmt.snj@gmail.com> 1626708424 +0900
committer SuGit <sgmt.snj@gmail.com> 1626708424 +0900
git cat-file で解析できます
tree c12d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
$ git cat-file -p d041 <-- 最初4文字くらいでOK
author SuGit <sgmt.snj@gmail.com> 1626708424 +0900
committer SuGit <sgmt.snj@gmail.com> 1626708424 +0900
git cat-file で解析できます
tree c12d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
│ ├── c1
│ │ └── 2d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
こちらも.git/object に同じIDのものがありますね。
$ git cat-file -p d041 <-- 最初4文字くらいでOK
author SuGit <sgmt.snj@gmail.com> 1626708424 +0900
committer SuGit <sgmt.snj@gmail.com> 1626708424 +0900
├── objects
│ ├── 9d
│ │ └── aeafb9864cf43055ae93beb0afd6c7d144bfa4
│ ├── d0
│ │ └── 41e090b548f4ab7c11848384f9e171e728fc3d
│ ├── info
│ └── pack
これもcat-file しましょう
$ git cat-file -p c12d
100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 README.md
これもcat-file しましょう
100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 README.md
$ git cat-file -p c12d
これもcat-file しましょう
100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 README.md
│ ├── 9d
│ │ └── aeafb9864cf43055ae93beb0afd6c7d144bfa4
ほう… 次は君ですね
$ git cat-file -p c12d
├── objects
│ ├── c1
│ │ └── 2d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
│ ├── d0
│ │ └── 41e090b548f4ab7c11848384f9e171e728fc3d
│ ├── info
│ └── pack
これもcat-file しましょう
$ git cat-file -p 9dae
test




これは・・・、README.md の中身だ!!
まとめると
├── 9d
│ └── aeafb9864cf43055ae93beb0afd6c7d144bfa4
├── c1
│ └── 2d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
├── d0
│ └── 41e090b548f4ab7c11848384f9e171e728fc3d
$ git cat-file -p 9dae
test
$ git cat-file -p c12d
100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 README.md
$ git cat-file -p d041
tree c12d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
author SuGit <sgmt.snj@gmail.com> 1626708424 +0900
committer SuGit <sgmt.snj@gmail.com> 1626708424 +0900
3種類の情報が記録されている、と言うことのようですね。
type: commit
$ git cat-file -p d041
tree c12d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1

// c12d のツリーにコミットをつんだよ
author SuGit <sgmt.snj@gmail.com> 1626708424 +0900

// コミットの著者はSuGit だよ
// 時刻は1626708424 +0900 = 2021/7/20 00:27:04 だよ(UNIX時間)
committer SuGit <sgmt.snj@gmail.com> 1626708424 +0900
// コミッターは... 以下同文
type: tree
$ git cat-file -p c12d
100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 README.md
// README.md を圧縮して9dae に保存したよ
type: blob
$ git cat-file -p 9dae
test
// README.md の中身だよ
つまり
commit: コミットの情報
tree: コミット履歴の情報
blob: ファイルのバックアップ




が、特定のコミットに対して記録されていると言うことがわかりました。
次はログをみましょう
│ ├── HEAD
│ └── refs
│ └── heads
│ └── main
~/.git $ tree
// ~~~省略~~~
├── logs
├── objects
│ ├── 9d
│ │ └── aeafb9864cf43055ae93beb0afd6c7d144bfa4
│ ├── c1
│ │ └── 2d7c0ed49ad9c7aa938743ba6fdee54b6b7fe1
│ ├── d0
│ │ └── 41e090b548f4ab7c11848384f9e171e728fc3d
│ ├── info
│ └── pack
└── refs
├── heads
│ └── main
└── tags
log が1つでは寂しいので、コミットをもう一度追加しておきましょう
📄README.md
- test
+ # Abs.
+ This repository is just for testing the git behaviour
log が1つでは寂しいので、コミットをもう一度追加しておきましょう
📄README.md
- test
+ # Abs.
+ This repository is just for testing the git behaviour
せっせとコミット
~/gitdir $ git add README.md
~/gitdir $ git commit -m "update README.md"
[main dd96c8f] update README.md
1 file changed, 3 insertions(+), 1 deletion(-)
~/gitdir$ git log
commit dd96c8f8bbcff86922b3db1f94aa38c4c6f3d633 (HEAD -> main)
Author: Sugit <sgmt.snj@gmail.com>
Date: Tue Jul 20 01:09:32 2021 +0900
update README.md
commit d041e090b548f4ab7c11848384f9e171e728fc3d
Author: SuGit <sgmt.snj@gmail.com>
Date: Tue Jul 20 00:27:04 2021 +0900
initialize repository
新しいコミットが増えました
commit dd96c8f8bbcff86922b3db1f94aa38c4c6f3d633 (HEAD -> main)
Author: Sugit <sgmt.snj@gmail.com>
Date: Tue Jul 20 01:09:32 2021 +0900
update README.md
新しいコミットが増えました
~/gitdir$ git log
commit d041e090b548f4ab7c11848384f9e171e728fc3d
Author: SuGit <sgmt.snj@gmail.com>
Date: Tue Jul 20 00:27:04 2021 +0900
initialize repository
このときのログファイルは...
~/.git/logs $ tree
├── HEAD
└── refs
└── heads
└── main
~/.git/logs $ cat HEAD
0000000000000000000000000000000000000000
d041e090b548f4ab7c11848384f9e171e728fc3d
SuGit <sgmt.snj@gmail.com> 1626708424 +0900
commit (initial): initialize repository
d041e090b548f4ab7c11848384f9e171e728fc3d
dd96c8f8bbcff86922b3db1f94aa38c4c6f3d633
Sugit <sgmt.snj@gmail.com> 1626710972 +0900
commit: update README.md
このときのログファイルは...
0000000000000000000000000000000000000000
d041e090b548f4ab7c11848384f9e171e728fc3d
SuGit <sgmt.snj@gmail.com> 1626708424 +0900
commit (initial): initialize repository
~/.git/logs $ tree
├── HEAD
└── refs
└── heads
└── main
~/.git/logs $ cat HEAD
d041e090b548f4ab7c11848384f9e171e728fc3d
dd96c8f8bbcff86922b3db1f94aa38c4c6f3d633
Sugit <sgmt.snj@gmail.com> 1626710972 +0900
commit: update README.md
分解すると
0000000000000000000000000000000000000000 ## <- 1つ前のコミットハッシュ
d041e090b548f4ab7c11848384f9e171e728fc3d ## <- 自身のコミットハッシュ
SuGit <sgmt.snj@gmail.com> 1626708424 +0900 ## <- コミット情報
commit (initial): initialize repository with ## <- メッセージ
分解すると
0000000000000000000000000000000000000000 ## <- 1つ前のコミットハッシュ
d041e090b548f4ab7c11848384f9e171e728fc3d ## <- 自身のコミットハッシュ
SuGit <sgmt.snj@gmail.com> 1626708424 +0900 ## <- コミット情報
commit (initial): initialize repository with ## <- メッセージ
1つ前のコミットハッシュ
コミット1つ目
0000 d041
0000000000000000000000000000000000000000 ## <- 1つ前のコミットハッシュ
d041e090b548f4ab7c11848384f9e171e728fc3d ## <- 自身のコミットハッシュ
SuGit <sgmt.snj@gmail.com> 1626708424 +0900 ## <- コミット情報
commit (initial): initialize repository ## <- メッセージ
コミット2つ目
d041 dd96
d041e090b548f4ab7c11848384f9e171e728fc3d
dd96c8f8bbcff86922b3db1f94aa38c4c6f3d633
Sugit <sgmt.snj@gmail.com> 1626710972 +0900
commit: update README.md
コミットは「自身のハッシュ値」と「ひとつ前のハッシュ値」を持ちます
git graph はこの連結によって作られます
0000 d041 dd96 .....
これを踏まえて、いろいろなコマンドをみていきましょう
git branch test
test ブランチの作成

実態は・・・
コミットハッシュに名前をつけて保存しただけ
~/.git/refs/heads $ cat test 

dd96c8f8bbcff86922b3db1f94aa38c4c6f3d633
0000 d041 dd96 .....
test
git commit --amend -m "hogehoge"
コミットの修正は...
単にlog のファイルを書き換えているだけ
SuGit <sgmt.snj@gmail.com> 1626708424 +0900 <-- ここを書き換える
commit (initial): initialize repository <-- ここを書き換える
0000000000000000000000000000000000000000 ## <- 1つ前のコミットハッシュ
d041e090b548f4ab7c11848384f9e171e728fc3d ## <- 自身のコミットハッシュ
git merge test
test ブランチのマージは…?
git merge test
test ブランチのマージは…?




2パターンに分かれます
それぞれのbranchが独自に進化している場合
main
0000 d041 dd96
9437
a79b
test
マージコミットが増えてmain の位置が変わります
main
0000 d041 dd96
9437
a79b
88a0
test
testだけが進化している場合
main
0000 d041 dd96 a79b
test
git merge してもmainの位置が変わるだけです
main
0000 d041 dd96 a79b
test
Git のマージが2 種類ありますね
アンケートの内容をやっと回収🤫
①マージコミットが作られるgit merge
②main の位置だけズラすgit merge
どっちが良いんだろう🤨??
ケースバイケース🤓
ケースバイケース🤓
ですが、
どちらかと言えば①の方が良い
①non-first-forward
②first-forward
といいます
何が違うの?
①non-first-forward
0000 d041 dd96
9437
a79b
88a0
②first-forward
0000 d041 dd96 a79b
①non-first-forward
0000 d041 dd96
9437
a79b
88a0
②first-forward
0000 d041 dd96 a79b
 マージコミットが無い= マージしたぞという"歴史が無い"
歴史は大事にしようぜ😎
②は①にできる🤗
--no-ff オプション
$ git merge branch-name --no-ff
これで強制的にマージコミットを積むことができます
多くの場合、マージコミットは残しておいた方がベターです
多くの場合、マージコミットは残しておいた方がベターです
ひ○ゆき氏😏... それってあなたの感想ですよね?
はい、残念ながら私の感想です😥
世の中には一定数いるのです。
 正しい歴史<<<美しいコミットグラフ派が...
コミットグラフの美しさを意識するのは

OSSにPRを出すときだけで良い!! 派です
OSSコントリビューションのお作法については後ほど🙌
git reset
これは歴史を書き換える危険なコマンドです☠️
👽👽ローカルのコミットを取り消すくらいならOKです👽👽
👽👽ローカルのコミットを取り消すくらいならOKです👽👽
OKじゃない!!

めっちゃ注意して!!
git reset は"まだリモートに入れていない" 

ローカルのコミットに対してだけ安全です
コミットはハッシュの連鎖でしたね。
push済みのコミットに対してgit reset をするということは、
リモートで既に構築されたコミットの連鎖を破壊するってことですね。
あ、"dd96" のコミット、ミスってるわ〜
git reset しよ
REMOTE
0000 d041 dd96
LOCAL
0000 d041 dd96 staging
git reset したったぜ
REMOTE
0000 d041 dd96
LOCAL
0000 d041 staging
新しい変更をコミットだ!!
REMOTE
0000 d041 dd96
LOCAL
0000 d041 e292
リモートにプッシュだ.... あれ?!
REMOTE
0000 d041 dd96
LOCAL
0000 d041 e292
コミット= 自身のハッシュ+ 直前のハッシュ
ハッシュでつなぐと…
REMOTE
0000 d041 dd96
LOCAL
0000 d041 e292
2つに分離してしまう…
これはpush error
REMOTE
0000 d041
dd96
e292
「push errro 対応」ググる


git push -f でできるんだって!!
「push errro 対応」ググる


git push -f でできるんだって!!
↑犯罪です👮🏻‍♂️
git reset は明らかにpush してないことを事前に確認
よくわからないまま使うと大変なことに…
ちょっとコマンド集から脱線して…(後で戻ります)
「git push -f した若手を怒るのはやめよう」

について
※ 適切な指導は必要ですよっ
「今度来た若いのいきなりmain にgit push -f してさ〜」😤
「いや、管理側にも大いに問題あるよそれ」🤨
大事なbranch は設定で守ろう!!
GitHub Branch Protection
🌐GitHub のブランチ保護ルールを活用しましょう。


CI が通っていないマージはNG
Approve 必須
main への直接push はowner のみ
などなど
若手が安心してgit を使えるようにしてあげよう😎
では、いろいろなコマンドをみていきましょう(再開)
git cherry-pick
つまみ食いコマンド
BRANCH-A
a901 d041 dd96
BRANCH-B
a901 d041 e292 41d2
A にB からe292 だけ取り込みたい
git cherry-pick e292...
cherry-pick は競合しやすいので、我慢して手作業で修正しましょう。
別のブランチで作業したコミットにおける変更を
"別のコミットとして" 取り込みます。
e292に対してcherry-pickを実行
BRANCH-A
a901 d041 dd96
BRANCH-B
a901 d041 e292 41d2
e292からパッチを作って...
BRANCH-A
a901 d041 dd96
BRANCH-B
a901 d041 e292 41d2
パッチを作る
e292 patch
mainブランチにパッチを適用してコミットを作る
BRANCH-A
PATCH
a901 d041 dd96 ae22
コミットハッシュが異なるところがポイントです
e292 != ae22
コミットハッシュが異なるところがポイントです
e292 != ae22




もしハッシュが一緒だったら??

何がやばいか考えてみてください🤔
このコマンドは歴史を書き換えないので安心です



リリースコントロールのために使ったり



別ブランチで誰かがやった神対応が欲しかったり



そんなときにつかいます
git stash
これはめっちゃ使います。
新機能の作業用ブランチで作業中… 



🥸「急で悪いけど、このバグ直して欲しいんや」


とか言われた時に



🥺「うぅぅぅ・・・まだコミットしたくないんだよなぁ・・」


ということがあります。
そんなときにgit stash です。
git stash save
git stash list
git stash apply
git stash drop
git stash pop (apply してdrop する)
git rebase
ちょっと危険なヤツ
ちゃんと理解しておこう
rebase はあるブランチのコミットを別のブランチの歴史につなげます
topic でrebase してみましょう
topic
main
8a24
52b1
a311 92fb e21b
31c2
同じ変更を別のコミットに変換して、繋げます(ハッシュが異なる)
topic
main
c1be
52b1
a311 92fb e21b
8ab2
31c2
8a24
rebase 後は一直線になります
topic
main
c1be
52b1
a311 92fb e21b 8ab2
平行線の歴史を一直線にすることができます
つまり、「歴史を書き換えます」
リモートへの影響は常に意識しましょう(何度でも言います)
git rebase はいつ使うのか?
OSS へのPull Requestのときです
main へのマージ前にするケースもあるようです。

これは組織の方針に合わせてください。




私はあまりしません🙄
レビュワーの気持ちになろう
PRを受け取ったら、そのPRはちょっと昔のコミットから生えていた。
😑「おいおい、マージすんの俺かよ・・・」
🤪「だるいしPR 断ろwww」




というのが割とあります。
事前にリベースして、コンフリクトのないPRを作りましょう。
ありのままの歴史を残すことは大切です



でも、OSSの場合は、
歴史の管理者は自分ではありません
いくらコントリビューターと言えども、配慮が必要です。
git commit --squash
複数のコミットを1つにまとめる
コミットが細かくバラバラと切られたPRは

なかなかレビューが大変です




レビュアーの気持ちになって、1 Issue - 1 Commit を心がけましょう。

でも、作業中は細かくコミットしておきたい。

そんな時はsquash でまとめましょう
git merge --squash topic
0000 d041 dd96
9437
a79b 88a0
これを…
0000 d041 dd96
9437
a79b 88a0
b1d9
こう
せっかくOSS へPR を投げる話になったので、
コントリビューションマナーについて紹介します
まずこれを読む
https://github.com/github/opensource.guide




https://opensource.guide/how-to-contribute/
この記事がとてもよかったので引用して紹介します
https://qvault.io/open-source/contributing-to-open-source/
👕Tシャツ事件をご存知だろうか...
👕Tシャツ事件
Hacktoberfest という団体がやったイベントで
"なんでもいいからOSS にPR を4つ作ったらTシャツあげます!!"
が事件を起こしました
残念なPR の大量発生💩
憤怒するOSSメンテナー🤬
ちなみにこの記事はこの事件がきっかけで生まれました
6 Things to Avoid When Contributing to OSS
1. Pull Requests Should Handle ONE Thing
2. Don’t Break Consistency
3. Don’t Start Work Without Approval
4. Don’t Re-Open Known Problems/Solutions
5. Squash Those Commits
6. Be Meaningful
1. Pull Requests Should Handle ONE Thing
PRでは1つのトピックに関するもののみ
1. Pull Requests Should Handle ONE Thing
PRでは1つのトピックに関するもののみ




バグAを修正したよ
ついでにxxx の書き方が非効率だったから直してやったぜ
1. Pull Requests Should Handle ONE Thing
PRでは1つのトピックに関するもののみ




バグAを修正したよ
ついでにxxx の書き方が非効率だったから直してやったぜ




いやぁぁぁぁぁぁ!!!😱
2. Don't Break Consistency
一貫性を守ること(空気を読んでくれ…)




コーディングスタイルを守って欲しい、ということです。
3. Don't Start Work Without Approval
急にPR送ってこないで…
まずはIssue たてて、コミュニケーションとってからやで…
4. Don't Re-Open Known Problems/Solutions
Issue立てる前に似たIssueが既に無いか確認しておいてや…
5. Squash Those Commits
PR内のコミットはsquash でまとめておいて欲しい…
6. Be Meaningful
なるべく意義のある提案をして欲しい
そんなんどうでもええねん!!って言わさないで欲しいということ。
いいコントリビューションはいいIssue から
コントリビューションマナーを見ると、Issue の大切さがよくわかると思います
良いIssue を目指しましょう
Issue を立てる時に気をつけることチェックリスト
1. Issue の重複はなるべくやめて…
2. 感想?観測?どっち?
3. テンプレート使ってよ… 🥺
4. 情報が少なすぎる
5. タイトルから中身が分からない
1. Issue の重複はなるべくやめて…
完璧でなくて良いですが、似たIssue が無いかなるべく検索しましょう。
もし見落としても怒られないので、あくまで親切心で😊
2. 感想?観測?どっち?
Edge のときにXX っていうエラーがでます!!
(… Safari, Chrome, Firefox 確認してない)
これが感想
正しくは
「XXっていうエラーが出ます。私の環境はEdge です。」
3. テンプレート使ってよ… 🥺
Issue のテンプレートが用意されている場合があります。なるべく探しましょう。


📄bug_report.md
## Steps to Reproduce
1. Run `flutter create bug`.
2. Update the files as follows: ...
3. ...
**Expected results:**
**Actual results:**
Logs...
参考: https://github.com/flutter/flutter/issues/59842
4. 情報が少なすぎる
5W1H を意識して書こうね
5. タイトルから中身が分からない
TITLE:「コンポーネントAでエラーが出る」
なんの?
最後のトピック
Git flow について
Gitっていろんなことができるんだなぁ😗
そう、いろいろできるんです
そう、いろいろできるんです
できちゃうんです… 😇
運用ルールがない無法地帯Gitプロジェクトは本当に危険です
作ろう運用ルール👨🏻‍🔧
有名な運用ルールに習おう
それが"Git flow"
Git flow
Git flow


 GitHub flow
 GitLab flow


という派生もありますよ
Git flow
A Successful Git Branching Model
https://nvie.com/posts/a-successful-git-branching-model/
拡大!!
Branch
master (main) : 製品リリース版のブランチ。リリースに合わせてTagをつける。
develop : 開発ブランチ。リリース前の最新情報はここにある状態にする。
feature : 追加機能、バグ修正などの小テーマごとに用意するブランチ。
release : リリース直前(develop以上、master以下)の微調整作業用ブランチ。
hotfix : masterブランチで発生した緊急修正用のブランチ。
え、、ややこし… 😦
私もそう思います



一方で、とてもよくできた運用でもあります


「知って使わない」と「知らない」は大違いなのでぜひ覚えておいてください
そこで、私の推奨はこちら
人が頑張るのはもうやめよう
細かすぎるルールはだいたい上手くいかない
私が業務で扱っているリポジトリは100人近くのメンバーが参加しています。
優秀な人材が集まろうが、ルールの徹底など不可能です😭
Git flow が提唱されたのが2010年です
GitHubのリリースとおよそ同時期ですね
10年あればソフトウェア業界は別世界になります
10年前: よく考えられたルールに準じて運用しよう
現代: 全てのルールは人ではなく、システムで担保する
ルールはシステムで担保する時代
ルールはシステムで担保する時代
CI/CD の時代!!
CI/CD はありとあらゆる組織(個人開発含め)で
なるべく早い段階で導入することを
強くお勧めします(経験に基づく)
保険と同じ。何かあってからでは遅いのです。
Git 
と仲良くなれましたか?

More Related Content

Similar to Get along with Git

20120324 git training
20120324 git training20120324 git training
20120324 git training
Takeshi AKIMA
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
Yohei Fushii
 

Similar to Get along with Git (20)

実践 Git - 低レベルに知る Git
実践 Git - 低レベルに知る Git実践 Git - 低レベルに知る Git
実践 Git - 低レベルに知る Git
 
20120516 第7回ウフィカ社内ハンズオン Git基礎
20120516 第7回ウフィカ社内ハンズオン Git基礎20120516 第7回ウフィカ社内ハンズオン Git基礎
20120516 第7回ウフィカ社内ハンズオン Git基礎
 
Gitの便利ワザ
Gitの便利ワザGitの便利ワザ
Gitの便利ワザ
 
Gitを使ってみませんか
Gitを使ってみませんかGitを使ってみませんか
Gitを使ってみませんか
 
Git 仕組み 入門
Git 仕組み 入門Git 仕組み 入門
Git 仕組み 入門
 
15分でわかるGit入門
15分でわかるGit入門15分でわかるGit入門
15分でわかるGit入門
 
Git 勉強会
Git 勉強会Git 勉強会
Git 勉強会
 
20120324 git training
20120324 git training20120324 git training
20120324 git training
 
Python for Data Analysis第1回勉強会(+git入門)
Python for Data Analysis第1回勉強会(+git入門)Python for Data Analysis第1回勉強会(+git入門)
Python for Data Analysis第1回勉強会(+git入門)
 
Gitの紹介
Gitの紹介Gitの紹介
Gitの紹介
 
Git入門 (Windows)
Git入門 (Windows)Git入門 (Windows)
Git入門 (Windows)
 
Git (実践入門編)
Git (実践入門編)Git (実践入門編)
Git (実践入門編)
 
Git
GitGit
Git
 
Gitの使い方あれこれ
Gitの使い方あれこれGitの使い方あれこれ
Gitの使い方あれこれ
 
Git勉強会
Git勉強会Git勉強会
Git勉強会
 
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
わしわし的おすすめ  .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会わしわし的おすすめ  .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
 
Git勉強会 2016 Gitで卒論を管理しよう回
Git勉強会 2016 Gitで卒論を管理しよう回Git勉強会 2016 Gitで卒論を管理しよう回
Git勉強会 2016 Gitで卒論を管理しよう回
 
Git講習会
Git講習会Git講習会
Git講習会
 
Gitとちょっと仲良くなるために覚えたことまとめ
Gitとちょっと仲良くなるために覚えたことまとめGitとちょっと仲良くなるために覚えたことまとめ
Gitとちょっと仲良くなるために覚えたことまとめ
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 

Get along with Git