SlideShare a Scribd company logo
photo: https://cdn.pixabay.com/photo/2014/10/01/17/59/
my-little-pony-468916960720.jpg
logs are magic!
john sj anderson | @genehack | lfnw 2017 | 7 may 2017
1 — LFNW 2017 – 7 May 2017 – @genehack
photo: https://cdn.pixabay.com/photo/2014/10/01/17/59/
my-little-pony-468916960720.jpg
why git workflows
& commit structure
should matter to you
john sj anderson | @genehack | lfnw 2017 | 7 may 2017
2 — LFNW 2017 – 7 May 2017 – @genehack
hi, i'm john.
a/k/a @genehack
3 — LFNW 2017 – 7 May 2017 – @genehack
In my day job, I'm the VP of Technology for Infinity, a small
IT consultancy.
vp, tech
infinity
interactive
4 — LFNW 2017 – 7 May 2017 – @genehack
I wanted to give this talk because I love revision control. I've kept my home directory under
revision control for over a decade, I maintain a Perl git wrapper module, and I wrote this thing
called GitGot to automate batch ops across multiple Git repos (but that's a different talk)
i ❤
revision
control5 — LFNW 2017 – 7 May 2017 – @genehack
I liked CVS...
cvs6 — LFNW 2017 – 7 May 2017 – @genehack
I liked SVN a bit more...
svn7 — LFNW 2017 – 7 May 2017 – @genehack
Hell, I even liked RCS
rcs8 — LFNW 2017 – 7 May 2017 – @genehack
Actually, that's a lie -- I don't think
anybody liked RCS.
Anybody here remember RCS?
Anybody still using RCS?
rcs9 — LFNW 2017 – 7 May 2017 – @genehack
And now we have git
git10 — LFNW 2017 – 7 May 2017 – @genehack
I love git. Git makes me happy
i ❤ git
11 — LFNW 2017 – 7 May 2017 – @genehack
How many people have used git at least once?
How many people feel comfortable in git?
How many people would call themselves git
"experts"?
quick
poll!
12 — LFNW 2017 – 7 May 2017 – @genehack
So, if you're not at least a little familiar with git, this talk is probably not going to that
interesting -- most of the stuff I'm going to talk about does apply to all revision control
systems, but my examples and recommendations are all git-based
what this
talk isn't13 — LFNW 2017 – 7 May 2017 – @genehack
I'm also not going to be claiming to dispense any universal
truths in this talk...
nouniversal
truths14 — LFNW 2017 – 7 May 2017 – @genehack
I'm not even going to try to convince you that anything I'm telling you is a "best practice".
Pretty much anything I advocate in here, I'm sure people will be able to come up with an
example where I'd say, "yeah, for that, don't do it"
not even
"best
practices"15 — LFNW 2017 – 7 May 2017 – @genehack
So what is this talk about then?
what this
talk is16 — LFNW 2017 – 7 May 2017 – @genehack
Opinionated commentary on some aspects of using
revision control systems...
some
opinions
17 — LFNW 2017 – 7 May 2017 – @genehack
...based on things I've seen over the past mumble years making
extensive use of revision control on personal, open source, and
commercial software projects
photo modified from http://i2.kym-cdn.com/photos/images/original/
001/044/247/297.png
backed up with
experience
18 — LFNW 2017 – 7 May 2017 – @genehack
Some of this stuff may be more important for larger projects
with multi-person teams ...
maybe more
important for
larger projects
19 — LFNW 2017 – 7 May 2017 – @genehack
...but it's also important if you've just started a project that you're thinking might grow into
something bigger. Having a solid project history from the get-go can make it a lot easier
for contributors to come on board and start pitching in
but also good for projects
that aspire to be
bigger20 — LFNW 2017 – 7 May 2017 – @genehack
maybe more
relevant for
coding projects
21 — LFNW 2017 – 7 May 2017 – @genehack
but also
applicable for
doc or config repos
22 — LFNW 2017 – 7 May 2017 – @genehack
Eventually we're going to talk about how to make better use
of the history in your repos ...
making better
use of history
23 — LFNW 2017 – 7 May 2017 – @genehack
...but first, we're going to talk about ways to make better
history
making
better
history24 — LFNW 2017 – 7 May 2017 – @genehack
For all these things, there are a few common elements
prerequisites
25 — LFNW 2017 – 7 May 2017 – @genehack
For maximum value, you're going to want to apply them
consistently
consistency
26 — LFNW 2017 – 7 May 2017 – @genehack
Make them into habits
habits
27 — LFNW 2017 – 7 May 2017 – @genehack
They're pretty much all the type of thing that if you do them
all the time...
do it all
the time28 — LFNW 2017 – 7 May 2017 – @genehack
...you eventually will just do them without thinking too much
about it
then you
don't have
to think
about it29 — LFNW 2017 – 7 May 2017 – @genehack
or even better, if you're the right kind of twisted...
even
better30 — LFNW 2017 – 7 May 2017 – @genehack
...you'll automate things. for example, i periodically run some scripts to find repos in a
"dirty" state, or that have local commits that haven't been pushed to a remote, and then
clean them up
automate
it
31 — LFNW 2017 – 7 May 2017 – @genehack
so, moving on to how to make better history
how to
make
better
history
32 — LFNW 2017 – 7 May 2017 – @genehack
if you're going to talk about git, you almost have to talk about workflows. potentially one
of the more contentious aspects of starting a new project is deciding what your workflow
is going to be
workflows
33 — LFNW 2017 – 7 May 2017 – @genehack
workflows can range from the very simple -- just a single branch in
a local-only repo, just adding commits onto the HEAD of that branch
photo credit: modified by https://www.flickr.com/photos/appleboy/
5488984566/in/photostream/
no remote
no branches
master only
34 — LFNW 2017 – 7 May 2017 – @genehack
or you can have that basic setup, but with a remote that you push things to every so
often. this is basically the simplest possible branching workflow -- when you have
local commits you haven't pushed to the remote yet, that's (if you squint, a bit) a
branch
photo credit: modified from https://www.flickr.com/photos/appleboy/5488387469/in/
photostream/
local master
no branches
& periodic pushes
35 — LFNW 2017 – 7 May 2017 – @genehack
all the way up to fairly complicated workflows like git
flow, where you have multiple branches in flight at any
given point.
anybody using git flow, or anything equivalent?
photo credit: https://www.flickr.com/photos/appleboy/
5488984404/in/photostream/
git flow
36 — LFNW 2017 – 7 May 2017 – @genehack
some
notable
antipatterns37 — LFNW 2017 – 7 May 2017 – @genehack
squashed
branches
38 — LFNW 2017 – 7 May 2017 – @genehack
fast
forward
merges39 — LFNW 2017 – 7 May 2017 – @genehack
this is basically doing extra work to mimic what a fast
forward merge probably would have done
rebase
before
merge40 — LFNW 2017 – 7 May 2017 – @genehack
all
destroy
history41 — LFNW 2017 – 7 May 2017 – @genehack
all
destroy
history
needlessly
42 — LFNW 2017 – 7 May 2017 – @genehack
a linear
commit
history
is a lie43 — LFNW 2017 – 7 May 2017 – @genehack
a linear
commit
history
is a lie
(probably)
44 — LFNW 2017 – 7 May 2017 – @genehack
instead
45 — LFNW 2017 – 7 May 2017 – @genehack
some good
patterns46 — LFNW 2017 – 7 May 2017 – @genehack
branch
47 — LFNW 2017 – 7 May 2017 – @genehack
branch
for
errythang48 — LFNW 2017 – 7 May 2017 – @genehack
(specifics
will vary)49 — LFNW 2017 – 7 May 2017 – @genehack
have a
release
branch50 — LFNW 2017 – 7 May 2017 – @genehack
release may be master
release may be another branch
51 — LFNW 2017 – 7 May 2017 – @genehack
(again,
specifics
will vary)
52 — LFNW 2017 – 7 May 2017 – @genehack
merging to
the release
branch is
a release53 — LFNW 2017 – 7 May 2017 – @genehack
(ideally,
automatically)
54 — LFNW 2017 – 7 May 2017 – @genehack
make all
merges
non-FF55 — LFNW 2017 – 7 May 2017 – @genehack
an aside
56 — LFNW 2017 – 7 May 2017 – @genehack
~/.gitconfig
57 — LFNW 2017 – 7 May 2017 – @genehack
git config --global merge.ff false
git config --global pull.ff only
58 — LFNW 2017 – 7 May 2017 – @genehack
[merge]
ff = false
[pull]
ff = only
59 — LFNW 2017 – 7 May 2017 – @genehack
maximal
historical
information60 — LFNW 2017 – 7 May 2017 – @genehack
keep it
clean61 — LFNW 2017 – 7 May 2017 – @genehack
~/.gitconfig
aliases
62 — LFNW 2017 – 7 May 2017 – @genehack
[alias]
br = branch
ci = commit -v
co = checkout
st = status
63 — LFNW 2017 – 7 May 2017 – @genehack
clean up
remote
branches
64 — LFNW 2017 – 7 May 2017 – @genehack
git push origin --delete <branch>
65 — LFNW 2017 – 7 May 2017 – @genehack
nuke = push origin --delete
66 — LFNW 2017 – 7 May 2017 – @genehack
clean up
orphaned
remote-tracking
branches67 — LFNW 2017 – 7 May 2017 – @genehack
git remote prune origin
68 — LFNW 2017 – 7 May 2017 – @genehack
prune = remote prune origin
69 — LFNW 2017 – 7 May 2017 – @genehack
find
unmerged
branches
70 — LFNW 2017 – 7 May 2017 – @genehack
git branch --no-merged master
71 — LFNW 2017 – 7 May 2017 – @genehack
git branch --no-merged --remote master
72 — LFNW 2017 – 7 May 2017 – @genehack
unmerged = branch --no-merged
unmerged-remote = branch --no-merged --remote
73 — LFNW 2017 – 7 May 2017 – @genehack
keep it
clean74 — LFNW 2017 – 7 May 2017 – @genehack
one final
note on
branches75 — LFNW 2017 – 7 May 2017 – @genehack
branch
names76 — LFNW 2017 – 7 May 2017 – @genehack
a branch
equals
a ticket77 — LFNW 2017 – 7 May 2017 – @genehack
the ticket id
should be in
the branch name
78 — LFNW 2017 – 7 May 2017 – @genehack
along with
something
for the
humans79 — LFNW 2017 – 7 May 2017 – @genehack
put the number
at the end of
the branch name
80 — LFNW 2017 – 7 May 2017 – @genehack
good:
fix-login-864
81 — LFNW 2017 – 7 May 2017 – @genehack
meh:
fix-864
82 — LFNW 2017 – 7 May 2017 – @genehack
bad:
864-crap
83 — LFNW 2017 – 7 May 2017 – @genehack
!!!:
foobar
84 — LFNW 2017 – 7 May 2017 – @genehack
just.
don't.
85 — LFNW 2017 – 7 May 2017 – @genehack
when merging
include the
branch name86 — LFNW 2017 – 7 May 2017 – @genehack
default message
works nicely
87 — LFNW 2017 – 7 May 2017 – @genehack
Merge branch <name>
88 — LFNW 2017 – 7 May 2017 – @genehack
maximal
historical
information89 — LFNW 2017 – 7 May 2017 – @genehack
to review
90 — LFNW 2017 – 7 May 2017 – @genehack
don't squash
91 — LFNW 2017 – 7 May 2017 – @genehack
don't fast forward
92 — LFNW 2017 – 7 May 2017 – @genehack
don't rebase before merge
93 — LFNW 2017 – 7 May 2017 – @genehack
don't destroy your history
94 — LFNW 2017 – 7 May 2017 – @genehack
use branches
95 — LFNW 2017 – 7 May 2017 – @genehack
use a release branch
96 — LFNW 2017 – 7 May 2017 – @genehack
use no-ff to make merge commits
97 — LFNW 2017 – 7 May 2017 – @genehack
keep your repo clean
98 — LFNW 2017 – 7 May 2017 – @genehack
let's get
more
granular
99 — LFNW 2017 – 7 May 2017 – @genehack
structuring
individual
commits100 — LFNW 2017 – 7 May 2017 – @genehack
a commit
equals
one "change"101 — LFNW 2017 – 7 May 2017 – @genehack
important:
at each commit
the software
must work102 — LFNW 2017 – 7 May 2017 – @genehack
git bisect
103 — LFNW 2017 – 7 May 2017 – @genehack
smaller >> bigger
104 — LFNW 2017 – 7 May 2017 – @genehack
whitespace
& formatting
105 — LFNW 2017 – 7 May 2017 – @genehack
always
go in
distinct commits106 — LFNW 2017 – 7 May 2017 – @genehack
remember!
107 — LFNW 2017 – 7 May 2017 – @genehack
revision
is also a
thing108 — LFNW 2017 – 7 May 2017 – @genehack
what you
eventually
push109 — LFNW 2017 – 7 May 2017 – @genehack
!=110 — LFNW 2017 – 7 May 2017 – @genehack
your
commits
while
working
111 — LFNW 2017 – 7 May 2017 – @genehack
develop a habit of using checkpoint commits instead of the
stash
savepoints
112 — LFNW 2017 – 7 May 2017 – @genehack
every
working
micro
step
113 — LFNW 2017 – 7 May 2017 – @genehack
single "change"
10-15 commits
114 — LFNW 2017 – 7 May 2017 – @genehack
git add --patch
115 — LFNW 2017 – 7 May 2017 – @genehack
git add -p
116 — LFNW 2017 – 7 May 2017 – @genehack
editor
support117 — LFNW 2017 – 7 May 2017 – @genehack
magit
fugitive118 — LFNW 2017 – 7 May 2017 – @genehack
magit
119 — LFNW 2017 – 7 May 2017 – @genehack
don't push
first drafts
120 — LFNW 2017 – 7 May 2017 – @genehack
tell a
story
121 — LFNW 2017 – 7 May 2017 – @genehack
git rebase -i
122 — LFNW 2017 – 7 May 2017 – @genehack
may be useful
to preserve
dead ends123 — LFNW 2017 – 7 May 2017 – @genehack
photo credit https://pbs.twimg.com/media/
CPlr0tQWcAAZPjf.jpg
...as a
warning
for others
124 — LFNW 2017 – 7 May 2017 – @genehack
commit
messages125 — LFNW 2017 – 7 May 2017 – @genehack
ticket
numbers
in the subject
126 — LFNW 2017 – 7 May 2017 – @genehack
(at the end)
127 — LFNW 2017 – 7 May 2017 – @genehack
you can customize
the template for
the commit message
128 — LFNW 2017 – 7 May 2017 – @genehack
if you get to this point, you're also going to want to script
the repo setup process
git config --local commit.template ./.template
# edit .template to add whatever you want...
129 — LFNW 2017 – 7 May 2017 – @genehack
examples
130 — LFNW 2017 – 7 May 2017 – @genehack
good:
make login form use POST instead of GET [#864]
131 — LFNW 2017 – 7 May 2017 – @genehack
meh:
fixed form [#864]
132 — LFNW 2017 – 7 May 2017 – @genehack
bad:
#846 fix
133 — LFNW 2017 – 7 May 2017 – @genehack
!!!:
foo
134 — LFNW 2017 – 7 May 2017 – @genehack
( °□°
135 — LFNW 2017 – 7 May 2017 – @genehack
this
is why
daddy drinks
136 — LFNW 2017 – 7 May 2017 – @genehack
to review
137 — LFNW 2017 – 7 May 2017 – @genehack
1 commit == 1 change
138 — LFNW 2017 – 7 May 2017 – @genehack
photo credit https://imgs.xkcd.com/comics/git_commit.png
and https://xkcd.com/1296/
commit
messages
matter!
139 — LFNW 2017 – 7 May 2017 – @genehack
when in doubt make it
smaller
140 — LFNW 2017 – 7 May 2017 – @genehack
segregate
formatting
changes141 — LFNW 2017 – 7 May 2017 – @genehack
use
checkpoint
commits
as savepoints
142 — LFNW 2017 – 7 May 2017 – @genehack
don't push
first drafts
143 — LFNW 2017 – 7 May 2017 – @genehack
revise to
tell a
story144 — LFNW 2017 – 7 May 2017 – @genehack
or at least make yourself look
smart145 — LFNW 2017 – 7 May 2017 – @genehack
using
history
better146 — LFNW 2017 – 7 May 2017 – @genehack
jfri147 — LFNW 2017 – 7 May 2017 – @genehack
just
friggin'
read
it148 — LFNW 2017 – 7 May 2017 – @genehack
~/.gitconfig
(again)
149 — LFNW 2017 – 7 May 2017 – @genehack
color
support150 — LFNW 2017 – 7 May 2017 – @genehack
[color]
branch = auto
diff = auto
grep = auto
interactive = auto
showbranch = auto
status = auto
ui = auto
151 — LFNW 2017 – 7 May 2017 – @genehack
[color "status"]
added = green bold
changed = red bold
untracked = cyan bold
152 — LFNW 2017 – 7 May 2017 – @genehack
git blame
153 — LFNW 2017 – 7 May 2017 – @genehack
git blame -w -M
154 — LFNW 2017 – 7 May 2017 – @genehack
[alias]
praise = blame
155 — LFNW 2017 – 7 May 2017 – @genehack
editorintegration156 — LFNW 2017 – 7 May 2017 – @genehack
git blame -L <line>,<line> <file>
git log -L <line>,<line>:<file>
157 — LFNW 2017 – 7 May 2017 – @genehack
git blame -L 1,1 index.html
158 — LFNW 2017 – 7 May 2017 – @genehack
git blame -L 10,50 index.html
159 — LFNW 2017 – 7 May 2017 – @genehack
git blame -L 20,+10 index.html
160 — LFNW 2017 – 7 May 2017 – @genehack
git log -L 1,1:index.html
161 — LFNW 2017 – 7 May 2017 – @genehack
git log -L 10,50:index.html
162 — LFNW 2017 – 7 May 2017 – @genehack
git log -L 20,+10:index.html
163 — LFNW 2017 – 7 May 2017 – @genehack
git log -S <string>
164 — LFNW 2017 – 7 May 2017 – @genehack
git log --follow
165 — LFNW 2017 – 7 May 2017 – @genehack
git lg
166 — LFNW 2017 – 7 May 2017 – @genehack
log --graph --abbrev-commit --date=relative --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'
167 — LFNW 2017 – 7 May 2017 – @genehack
168 — LFNW 2017 – 7 May 2017 – @genehack
--graph
169 — LFNW 2017 – 7 May 2017 – @genehack
--abbrev-commit
170 — LFNW 2017 – 7 May 2017 – @genehack
--date=relative
171 — LFNW 2017 – 7 May 2017 – @genehack
SHA in red,
branch name (if any) in yellow,
commit subject,
date,
author
`--pretty=format:
'%Cred%h%Creset
-%C(yellow)%d%Creset
%s
%Cgreen(%cr)
%C(bold blue)<%an>%Creset'`
172 — LFNW 2017 – 7 May 2017 – @genehack
173 — LFNW 2017 – 7 May 2017 – @genehack
takeaways!
174 — LFNW 2017 – 7 May 2017 – @genehack
history
is
important175 — LFNW 2017 – 7 May 2017 – @genehack
it's probably
worth more
of your time176 — LFNW 2017 – 7 May 2017 – @genehack
both
creating it
and
using it
177 — LFNW 2017 – 7 May 2017 – @genehack
don't just stop
when the
software
works178 — LFNW 2017 – 7 May 2017 – @genehack
software
development
is hard179 — LFNW 2017 – 7 May 2017 – @genehack
be kind
to others180 — LFNW 2017 – 7 May 2017 – @genehack
be kind
to your
future
self181 — LFNW 2017 – 7 May 2017 – @genehack
thanks!
lfnw organizers &
volunteers
linus & others for git
YOU!
182 — LFNW 2017 – 7 May 2017 – @genehack
183 — LFNW 2017 – 7 May 2017 – @genehack
questions?
(ps: please fill out the talk eval form!)
184 — LFNW 2017 – 7 May 2017 – @genehack

More Related Content

Similar to Logs Are Magic: Why Git Workflows and Commit Structure Should Matter To You

Similar to Logs Are Magic: Why Git Workflows and Commit Structure Should Matter To You (7)

A static site generator should be your next language learning project
A static site generator should be your next language learning projectA static site generator should be your next language learning project
A static site generator should be your next language learning project
 
JSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your LifeJSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your Life
 
Old Dogs & New Tricks: What's New with Perl5 This Century
Old Dogs & New Tricks: What's New with Perl5 This CenturyOld Dogs & New Tricks: What's New with Perl5 This Century
Old Dogs & New Tricks: What's New with Perl5 This Century
 
Wordcamp Kanpur 2017
Wordcamp Kanpur 2017Wordcamp Kanpur 2017
Wordcamp Kanpur 2017
 
apidays LIVE Hong Kong - Let's get started development of API client library ...
apidays LIVE Hong Kong - Let's get started development of API client library ...apidays LIVE Hong Kong - Let's get started development of API client library ...
apidays LIVE Hong Kong - Let's get started development of API client library ...
 
#speakerlife
#speakerlife#speakerlife
#speakerlife
 
De git à la blockchain
De git à la blockchainDe git à la blockchain
De git à la blockchain
 

More from John Anderson

A Modest Introduction To Swift
A Modest Introduction To SwiftA Modest Introduction To Swift
A Modest Introduction To Swift
John Anderson
 
JSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your LifeJSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your Life
John Anderson
 
Old Dogs & New Tricks: What's New With Perl5 This Century
Old Dogs & New Tricks: What's New With Perl5 This CenturyOld Dogs & New Tricks: What's New With Perl5 This Century
Old Dogs & New Tricks: What's New With Perl5 This Century
John Anderson
 
A Modest Introduction to Swift
A Modest Introduction to SwiftA Modest Introduction to Swift
A Modest Introduction to Swift
John Anderson
 
Friends Don't Let Friends Browse Unencrypted: Running a VPN for friends and f...
Friends Don't Let Friends Browse Unencrypted: Running a VPN for friends and f...Friends Don't Let Friends Browse Unencrypted: Running a VPN for friends and f...
Friends Don't Let Friends Browse Unencrypted: Running a VPN for friends and f...
John Anderson
 

More from John Anderson (18)

Introduction to Git (even for non-developers)
Introduction to Git (even for non-developers)Introduction to Git (even for non-developers)
Introduction to Git (even for non-developers)
 
A static site generator should be your next language learning project
A static site generator should be your next language learning projectA static site generator should be your next language learning project
A static site generator should be your next language learning project
 
Do you want to be right or do you want to WIN?
Do you want to be right or do you want to WIN?Do you want to be right or do you want to WIN?
Do you want to be right or do you want to WIN?
 
An Introduction to Git (even for non-developers)
An Introduction to Git (even for non-developers)An Introduction to Git (even for non-developers)
An Introduction to Git (even for non-developers)
 
You got chocolate in my peanut butter! .NET on Mac & Linux
You got chocolate in my peanut butter! .NET on Mac & LinuxYou got chocolate in my peanut butter! .NET on Mac & Linux
You got chocolate in my peanut butter! .NET on Mac & Linux
 
A static site generator should be your next language learning project
A static site generator should be your next language learning projectA static site generator should be your next language learning project
A static site generator should be your next language learning project
 
Introduction to Git for Non-Developers
Introduction to Git for Non-DevelopersIntroduction to Git for Non-Developers
Introduction to Git for Non-Developers
 
A Modest Introduction To Swift
A Modest Introduction To SwiftA Modest Introduction To Swift
A Modest Introduction To Swift
 
JSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your LifeJSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your Life
 
Old Dogs & New Tricks: What's New With Perl5 This Century
Old Dogs & New Tricks: What's New With Perl5 This CenturyOld Dogs & New Tricks: What's New With Perl5 This Century
Old Dogs & New Tricks: What's New With Perl5 This Century
 
A Modest Introduction to Swift
A Modest Introduction to SwiftA Modest Introduction to Swift
A Modest Introduction to Swift
 
Friends Don't Let Friends Browse Unencrypted: Running a VPN for friends and f...
Friends Don't Let Friends Browse Unencrypted: Running a VPN for friends and f...Friends Don't Let Friends Browse Unencrypted: Running a VPN for friends and f...
Friends Don't Let Friends Browse Unencrypted: Running a VPN for friends and f...
 
A Modest Introduction To Swift
A Modest Introduction To SwiftA Modest Introduction To Swift
A Modest Introduction To Swift
 
JSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your LifeJSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your Life
 
Automate Yo'self -- SeaGL
Automate Yo'self -- SeaGL Automate Yo'self -- SeaGL
Automate Yo'self -- SeaGL
 
JWT! JWT! Let it all out!
JWT! JWT! Let it all out!JWT! JWT! Let it all out!
JWT! JWT! Let it all out!
 
A Modest Introduction to Swift
A Modest Introduction to SwiftA Modest Introduction to Swift
A Modest Introduction to Swift
 
Modern Perl for the Unfrozen Paleolithic Perl Programmer
Modern Perl for the Unfrozen Paleolithic Perl ProgrammerModern Perl for the Unfrozen Paleolithic Perl Programmer
Modern Perl for the Unfrozen Paleolithic Perl Programmer
 

Recently uploaded

Article writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptxArticle writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptx
abhinandnam9997
 
audience research (emma) 1.pptxkkkkkkkkkkkkkkkkk
audience research (emma) 1.pptxkkkkkkkkkkkkkkkkkaudience research (emma) 1.pptxkkkkkkkkkkkkkkkkk
audience research (emma) 1.pptxkkkkkkkkkkkkkkkkk
lolsDocherty
 
Production 2024 sunderland culture final - Copy.pptx
Production 2024 sunderland culture final - Copy.pptxProduction 2024 sunderland culture final - Copy.pptx
Production 2024 sunderland culture final - Copy.pptx
ChloeMeadows1
 

Recently uploaded (16)

Cyber Security Services Unveiled: Strategies to Secure Your Digital Presence
Cyber Security Services Unveiled: Strategies to Secure Your Digital PresenceCyber Security Services Unveiled: Strategies to Secure Your Digital Presence
Cyber Security Services Unveiled: Strategies to Secure Your Digital Presence
 
Premier Mobile App Development Agency in USA.pdf
Premier Mobile App Development Agency in USA.pdfPremier Mobile App Development Agency in USA.pdf
Premier Mobile App Development Agency in USA.pdf
 
The Use of AI in Indonesia Election 2024: A Case Study
The Use of AI in Indonesia Election 2024: A Case StudyThe Use of AI in Indonesia Election 2024: A Case Study
The Use of AI in Indonesia Election 2024: A Case Study
 
Statistical Analysis of DNS Latencies.pdf
Statistical Analysis of DNS Latencies.pdfStatistical Analysis of DNS Latencies.pdf
Statistical Analysis of DNS Latencies.pdf
 
Case study on merger of Vodafone and Idea (VI).pptx
Case study on merger of Vodafone and Idea (VI).pptxCase study on merger of Vodafone and Idea (VI).pptx
Case study on merger of Vodafone and Idea (VI).pptx
 
iThome_CYBERSEC2024_Drive_Into_the_DarkWeb
iThome_CYBERSEC2024_Drive_Into_the_DarkWebiThome_CYBERSEC2024_Drive_Into_the_DarkWeb
iThome_CYBERSEC2024_Drive_Into_the_DarkWeb
 
Bug Bounty Blueprint : A Beginner's Guide
Bug Bounty Blueprint : A Beginner's GuideBug Bounty Blueprint : A Beginner's Guide
Bug Bounty Blueprint : A Beginner's Guide
 
Topology of the Network class 8 .ppt pdf
Topology of the Network class 8 .ppt pdfTopology of the Network class 8 .ppt pdf
Topology of the Network class 8 .ppt pdf
 
How Do I Begin the Linksys Velop Setup Process?
How Do I Begin the Linksys Velop Setup Process?How Do I Begin the Linksys Velop Setup Process?
How Do I Begin the Linksys Velop Setup Process?
 
Article writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptxArticle writing on excessive use of internet.pptx
Article writing on excessive use of internet.pptx
 
audience research (emma) 1.pptxkkkkkkkkkkkkkkkkk
audience research (emma) 1.pptxkkkkkkkkkkkkkkkkkaudience research (emma) 1.pptxkkkkkkkkkkkkkkkkk
audience research (emma) 1.pptxkkkkkkkkkkkkkkkkk
 
Pvtaan Social media marketing proposal.pdf
Pvtaan Social media marketing proposal.pdfPvtaan Social media marketing proposal.pdf
Pvtaan Social media marketing proposal.pdf
 
Thank You Luv I’ll Never Walk Alone Again T shirts
Thank You Luv I’ll Never Walk Alone Again T shirtsThank You Luv I’ll Never Walk Alone Again T shirts
Thank You Luv I’ll Never Walk Alone Again T shirts
 
Production 2024 sunderland culture final - Copy.pptx
Production 2024 sunderland culture final - Copy.pptxProduction 2024 sunderland culture final - Copy.pptx
Production 2024 sunderland culture final - Copy.pptx
 
Development Lifecycle.pptx for the secure development of apps
Development Lifecycle.pptx for the secure development of appsDevelopment Lifecycle.pptx for the secure development of apps
Development Lifecycle.pptx for the secure development of apps
 
Reggie miller choke t shirtsReggie miller choke t shirts
Reggie miller choke t shirtsReggie miller choke t shirtsReggie miller choke t shirtsReggie miller choke t shirts
Reggie miller choke t shirtsReggie miller choke t shirts
 

Logs Are Magic: Why Git Workflows and Commit Structure Should Matter To You