Podcast Search

Under the Radar

22: Version Control

Select a time to play from there. The line being spoken is highlighted as the audio plays.

0:00:00Welcome to Under the Radar, a show about independent iOS app development.

0:00:03I'm Marco Arment.

0:00:04And I'm David Smith.

0:00:05Under the Radar is never longer than 30 minutes, so let's get started.

0:00:09So today we wanted to talk about version control.

0:00:12And this is a great collaboration tool.

0:00:16And therefore, the two of us who work by ourselves

0:00:20are going to tell you all about it.

0:00:23Drawing on our vast experience about using version control

0:00:26with all the clever things you hear about with, like,

0:00:29git, and you can have merging and branching strategies and rebasing and all the things

0:00:34that thankfully I never have to deal with because I tend to just work by myself and

0:00:38I'm collaborating with myself. And so thankfully things typically, like merge conflicts, not

0:00:44a big problem for me, it turns out. But still, I think version control is a very important

0:00:49part of the discipline of software engineering. And so it seemed like it was something that

0:00:54was worth discussing, even if obviously, jokingly, some of the more collaborative parts of it

0:00:59aren't as relevant for us?

0:01:01- I mean, for me, I have mostly the same situation

0:01:03in that I'm mostly collaborating with nobody,

0:01:07but there have been times where I've seen

0:01:09a lot of the value of it.

0:01:09For instance, I used to work at normal jobs

0:01:11where I had other people working with me,

0:01:13so we would do things there,

0:01:14but that was back in the subversion days,

0:01:17and it was much simpler,

0:01:19and it was still very small teams.

0:01:22And these days, I mostly don't do any kind of collaboration.

0:01:27However, I do have a couple of open source projects

0:01:31that I run and most of them get no activity whatsoever,

0:01:36but a few of them do get third party contributions

0:01:38and I have done, you know, get pull requests

0:01:41and merges and stuff like that and those things,

0:01:45so I have minimal experience there

0:01:48and you and I actually just started accidentally

0:01:51collaborating on something and I don't think

0:01:53it's even worth mentioning what it is.

0:01:54It's a very, very narrow need that both of us

0:01:57happen to have and almost nobody else does.

0:02:00I committed to your code base the other day,

0:02:03and that was like the first time I've ever committed

0:02:06to someone else's iOS code base.

0:02:09And you said that was probably the first time

0:02:11that anyone's ever committed to yours, right?

0:02:13- It's been a very long time, since like 2011, 2012,

0:02:17I think was the last time I had any kind of collaboration.

0:02:21So yes, it is very much a rare thing,

0:02:24but it was kind of fun.

0:02:24Like I was like, oh, someone else,

0:02:26It's like I have to do a fetch and a pull

0:02:28rather than just a push.

0:02:29(laughing)

0:02:30This is novel and exciting.

0:02:32- Yeah, I don't know how I would deal with that in my apps.

0:02:35I'd probably fix all the style differences,

0:02:38which is like this huge faux pas to like

0:02:40restyle someone else's commit.

0:02:42- But yeah, version control, there is definitely,

0:02:45collaboration is an important part of that,

0:02:46and there are lots of different ways to deal with that.

0:02:49Like obviously, we're saying for us,

0:02:51we don't do as much from a collaboration perspective,

0:02:53but I've worked in companies where it's an important thing,

0:02:56And there's lots of great mechanisms for this now.

0:02:59Like this is something that I think back to.

0:03:01I think my first version control system was CVS, I think.

0:03:04- Yep.

0:03:05- And then I went to Subversion and then to Git.

0:03:08And every time, like the tool itself gets better

0:03:11and less awkward and less cumbersome.

0:03:13And I think about the things that are,

0:03:15even things like GitHub or Bitbucket,

0:03:18or there's lots of kind of these online

0:03:20backs or front ends for the repository,

0:03:24which makes so many of these things so helpful.

0:03:26And while I don't do a lot of it, whenever I've had to do something like that, where

0:03:30you have like, you submit a pull request, and you can have notes and code review, and

0:03:34a lot of these things are nice and clear and obvious, rather than just kind of sitting

0:03:38there at the command line trying to work out what's going on when someone else submits

0:03:44code, and it crashes into yours, and things are horrible and broken.

0:03:49And you can do some pretty powerful things too.

0:03:51I remember back with my early days of version control where you would check out specific

0:03:57files that you were going to change, and things like that that would be very cumbersome, and

0:04:02you'd be like, every now and then you'd go down the hall and ask Jim down the hall, "Hey,

0:04:06are you done with that header?

0:04:08Because I need to add something to it for my part of this app."

0:04:12And things like that which most modern version control systems can just deal with in terms

0:04:17of they'll, you know, if you edit the top and he edits the bottom, it just goes and

0:04:21that's fine. And, you know, that can sometimes be problematic if he's changing something

0:04:24in one way and you're changing it in another, but, you know, by and large, collaboration

0:04:29is much easier from a version control perspective than it used to be, because you can just,

0:04:34you have these nice visual tools and, you know, mechanisms by which you can, you know,

0:04:39each share access into a repository.

0:04:42- Yeah, I mean, it is so nice to have modern conveniences

0:04:46with these things and modern advancements.

0:04:49I mean, I too, I never did the systems where checkouts

0:04:53are exclusive to one person, but just basics of versioning

0:04:57and merging from all these systems are great.

0:05:00And especially branching became a lot easier with Git

0:05:04and the DBCS model, and these things, I mean,

0:05:08it just helps so much when you're working on a team.

0:05:10And also when you're working by yourself,

0:05:12and I think that's what we're gonna talk about too,

0:05:13is like even when you're working alone,

0:05:15these systems provide invaluable help,

0:05:18and I think every developer, this is actually,

0:05:22I know that not every developer who works for themselves

0:05:26does version control, and I think not doing it

0:05:28is a huge mistake.

0:05:29- Yes, I don't even know how, I mean,

0:05:31that just seems like, that's like the wild, wild west,

0:05:34where like, are you like copying folders,

0:05:36like anytime, you know, like it's when you have

0:05:38like version one, version two, version three,

0:05:40like, oh, that's chilling. Yes, use version control. Whatever it is, it's one of these

0:05:46it doesn't really matter which one you choose. Like, if you're a Git person, a Mercurial

0:05:50person, if you want to use subversion, if you want to do something else, that's fine.

0:05:53But you have to use something. Because I think the thing that you also can keep in mind with

0:05:59version control is it's a powerful development tool. In the way that you and I, we probably

0:06:05spend most of our development time in Xcode or in some ways in some like TextMate or something,

0:06:09if you're doing web programming. But the tool of version control is a pretty powerful one

0:06:18in terms of it being a part of your development process and allowing you to do things that

0:06:24would otherwise be really awkward. Like, I love in Git having lightweight branching of

0:06:28being able to be like, I have this idea for a way to kind of restructure something or

0:06:34or do a big refactor, or take some code and take it in a different direction.

0:06:40And I can just branch off from my main thing, try it for a few days, and if I end up, it

0:06:47turns out to be just this complete dead end, I can sort of just throw that away and go

0:06:52back to where I started from in a way that is nice and clean and reliable and isn't going

0:06:57to break something, or if I want to just cherry pick part of that in, I can do that in a controlled

0:07:02way.

0:07:04also just to look at what I've been doing. Like sometimes I'll, you know, it's being

0:07:08able to look at the, like in some ways you'd think like the blame part of version control

0:07:16if you work by yourself. And if you're not familiar, like blame in most version control

0:07:20systems, you can look at any line of code and see who created it and when that was created

0:07:25in the history of your project. You know, and so this is the classic, like if someone

0:07:28breaks the build, you can run blame on it and see who broke it. But even for myself,

0:07:33Like when the names are always me, it's often really helpful to be able to look back and

0:07:37be like, "Why am I doing this this way?"

0:07:40And I can go back and say, "Huh, interesting.

0:07:41I added this two years ago when I was working on X feature."

0:07:47And that's often really, really, really helpful to be able to look back and to understand

0:07:52my own code even better, and even more so if you're collaborating with someone else.

0:07:59And even just to be able to, like one thing I always do in my development cycle is I take

0:08:06the last commit that, like the version that I just released, and whenever I'm getting

0:08:11ready to submit to the app store, like the very last step before I hit actual archive

0:08:16and submit to the app store, is I always go and run a diff between the last submitted

0:08:21version and my current version of the code.

0:08:24And I just go through, like sort of line by line in all the changes, and make sure that

0:08:28that there's nothing in there that jumps out at me

0:08:30is like, whoa, why is this still in here?

0:08:33Or like, that doesn't seem right.

0:08:35And I've caught several bugs in my process that way

0:08:39by using version control as a tool

0:08:42to help me write better code.

0:08:44- Yeah, I mean, the biggest value of it as independent

0:08:47is that it's giving you a tool that can show you

0:08:50what you've changed and when you changed it,

0:08:53and possibly why you changed it.

0:08:55But that's like, just knowing what has changed,

0:08:57whether it's what did I do today to this one file

0:09:01so I know whether to even commit this change or not,

0:09:04or what has changed in the entire app

0:09:08between this version, which I know worked in this way,

0:09:11and the current version, which keeps having this weird bug

0:09:14that I can't figure out why it's happening.

0:09:16You can go and you can see, all right,

0:09:17well, here's everything that's different between these two.

0:09:19So the bug is because of some part of this.

0:09:22And it's so useful to know that stuff.

0:09:25Everyone can get value out of that.

0:09:27It also, it helps even if you have to work

0:09:29on multiple computers or if you're working on,

0:09:32like if you have a deployment on your server

0:09:34and one locally on your computers,

0:09:35you keep those synced up properly in a sane way.

0:09:39I mean, it's just so great.

0:09:41I'm still, I'm shocked that anybody still doesn't use it.

0:09:46But fortunately, most people do use it.

0:09:47I think most people have come around to it now.

0:09:49So we're mostly sane in that way.

0:09:52In an industry that's insane in so many other ways,

0:09:54we're mostly sane in that way.

0:09:56And it really helps in that regard that it's also become so much easier to do.

0:10:01Like I think in Xcode, it has full-on version control built into it, in terms of not even

0:10:07its weird snapshotting thing that it always asks me when I'm refactoring a project, and

0:10:12then it asks me, "Do I want to make a snapshot?"

0:10:13And I don't really know what that means, and I really don't think I do.

0:10:17But it has it built in.

0:10:18Like, all of my projects, whenever I'm changing something, it's really helpful in Xcode to

0:10:23just see what's changed.

0:10:24And once I change something, it gets a little M icon

0:10:27next to it that says it's modified,

0:10:28or if I've added a file to it, it's there.

0:10:31And so there's no reason not to be aware

0:10:33of this type of thing, 'cause the tooling is in place

0:10:37to make that just so easy and streamlined

0:10:40that you'd be a fool not to.

0:10:44- Yeah, and whether you do it on a hosted service

0:10:46like GitHub or Bitbucket, or whether you do it just locally,

0:10:49like you can, almost all these systems,

0:10:51you can have a local server if you want to,

0:10:54and not have it synced to any remote/paid web service.

0:10:59But I recommend, if you can swing it

0:11:01for regulatory reasons and for money reasons,

0:11:05I recommend just putting it on GitHub or Bitbucket.

0:11:07Put it on one of the big hosts,

0:11:08because it just, it outsources a class of problems

0:11:12that you don't need to deal with anymore,

0:11:13and also you get a whole lot of convenience

0:11:16for having that be on a hosted system.

0:11:17You have the nice web GUIs,

0:11:19you have the ability to access it from anywhere,

0:11:21multiple computers,

0:11:22have kind of this built-in backup. So it's, yeah, definitely host it if you can, and please,

0:11:29please use version control.

0:11:30>> Yeah, and that's getting to, I think, another kind of interesting aspect to version control,

0:11:35which is the, like, the backup portion of it.

0:11:37>> Yeah.

0:11:38>> Like, both in terms of, like, what you're saying, where, like, it's another physical

0:11:42backup, like, in the same way that you should have probably a clone of your main development

0:11:45hard drive running all the time, and, like, backup in that sense of, like, being able

0:11:49to not have -- if my computer dies, that's suddenly like, I'm out of luck, and that's

0:11:56it. The only copy of my code was sitting on that machine. That's terrifying. You have

0:12:04to have it backed up in a lot of ways, because the funny thing about doing the kind of work

0:12:10we do, there's no sort of tangible -- the only tangible outcome of our work is a collection

0:12:17of text files and images sitting on our hard drive. And so the amount of time and energy

0:12:23and money that goes into creating those, we have to treat them incredibly carefully. If

0:12:28we were at Coca-Cola and we have to keep -- I imagine the recipe for Coca-Cola is very well

0:12:35protected and backed up and guarded to make sure that they can keep making it, because

0:12:39if somehow it got lost and they didn't know the recipe anymore, that would be hugely problematic.

0:12:45And so as developers, our source code is that thing.

0:12:49Even if we have an old binary of our app, that doesn't do us any good, we can't change

0:12:55that.

0:12:56And so it's important to back it up, both in terms of that kind of backup.

0:12:59And then something else that I've found it so helpful for many times too, is it's having

0:13:05this, like, being able to go through, so it's like you have this little time machine that

0:13:10you can go back in time and say, "What was my app like at a particular time?"

0:13:15And like you were saying earlier, this is great for identifying weird regressions and

0:13:21bugs where it's like it worked in version 2, but it doesn't work in version 3.

0:13:25Why is that?

0:13:26And you can actually go back and what I'll often end up doing is I'll export the project

0:13:32from my version control at a particular milestone and change the bundle identifier and I can

0:13:38run them both at the same time.

0:13:39And I can kind of go back and forth and I can see why things are different and that kind of snapshotting is really helpful

0:13:47To be able to look back and then even one other thing that I've it's kind of more silly

0:13:51But I love sometimes being able to go back

0:13:54To like the verb like version one of a product after it becomes very mature both to kind of laugh at myself

0:14:01And just kind of look at it

0:14:03But also just to kind of for nostalgia reasons of kind of looking at it

0:14:06and it's nice to have a sense of, "Wow, I've really come a long way. This app used to be

0:14:11so simple and now it's so much more robust." That's fun to have this backup of it that

0:14:18never goes away in that way. This is why I also version control all my screenshots that

0:14:23I submit to the App Store. They're in there for that same reason, that sometimes it's

0:14:28really fun or useful, or I'm doing a retrospective post. When one of my apps hits a milestone,

0:14:35been, you know, it's, oh, it's five years old. Like, if it's, you know, hitting a milestone,

0:14:39it's kind of fun to, like, do a blog post or something like that to kind of talk about

0:14:42it and show screenshots or the icon from a long time ago. Like, Version Control is a

0:14:46great place to keep those things, so it's all in the same place and it, you know, as

0:14:50time marches on, you can keep a nice, accurate record of what's changed.

0:14:55All right, our sponsor this week is Braintree. Braintree is code for easy online payments.

0:15:01They're a full stack payment platform.

0:15:03And why make payment integration more difficult

0:15:06than it has to be?

0:15:07Brain Tree allows you to accept nearly any type of payment

0:15:10from any device with just one integration.

0:15:13They support PayPal, Bitcoin, Venmo, Apple Pay,

0:15:15Android Pay, cards, and they will support whatever's next,

0:15:19all with that one integration.

0:15:20It's flexible to your system's needs

0:15:22and supports most programming languages.

0:15:24So whether you're using Java, Ruby, or Python,

0:15:26you will always have a range of server side

0:15:29and client-side SDKs available.

0:15:31The Braintree client code supports Android,

0:15:33iOS, and JavaScript, and all of this takes

0:15:36just 10 lines of code to implement.

0:15:38Braintree makes payments and your job a whole lot easier.

0:15:42Learn more at Braintreepayments.com/radar.

0:15:46Once again, that's Braintreepayments.com/radar.

0:15:50Thank you very much to Braintree for sponsoring our show

0:15:52and all of Relay FM.

0:15:53- So I think what might make sense

0:15:56for the rest of the episode is to kind of talk

0:15:58about how this actually, what we do in practice, what the actual tools that we use, what that

0:16:06goes around, because I think there's certainly a degree to which version control can become

0:16:10a very personal thing. And some people like Mercurial, some people like Git, some people

0:16:15maybe even still love Subversion, or there's something new and fancier that I'm not aware

0:16:19of, but you end up with these kind of preferences, and at least I know for myself, I have workflows

0:16:24and things that I've built up over time that are part of this, that maybe are helpful,

0:16:29or if you're looking for a different way of doing Git or different tools for it might

0:16:33be helpful to discuss. So what is your typical, like, how do you actually interact with your

0:16:38version control system?

0:16:39>> So, on the server I just do it all via command line, and I use Git and I host on

0:16:44GitHub. I would imagine GitHub is probably one of the biggest reasons why people choose

0:16:49Git, and why it's so popular, because GitHub is just so convenient in many ways and so

0:16:54good in many ways and it isn't perfect but it's very good. I use GitHub again, private

0:16:59everything I pay for it, it's fine. It's been very secure for me and totally fine and honestly

0:17:05if somebody steals my source code somehow I don't really worry about that because source

0:17:10code is not very valuable. Like if you get somebody's source code to their entire app

0:17:14what do you do with that? Like you can upload it but that's illegal and they can easily

0:17:19get it taken down, so like, you know,

0:17:21you can make your own app again also illegal from that,

0:17:24get it taken down, so like, the actual value

0:17:27of stolen source code isn't particularly high

0:17:30for somebody's random iOS app.

0:17:31So anyway, back to how I use it,

0:17:34I use the command line for almost everything I do

0:17:37in general in development, so MySQL,

0:17:41I use the command line interface to that.

0:17:43If I'm doing development with other server side demons

0:17:46like memcache or redis. I will use the command line to interface with those to set them up

0:17:51to to do administrative tasks if I need to ever get. I usually don't do that anymore.

0:17:59Get is so complicated on the command line and so tedious on the command line that I

0:18:07usually just use get tower as my gooey, which is a Mac app. It's some price. It doesn't

0:18:15matter it's worth whatever price they charge it's worth it I think it's like

0:18:1850 bucks whatever it is totally worth it get because git is incredibly

0:18:24complicated and it doesn't need to be most in most use you can get by and it's

0:18:30it's totally fine and you'll be fine but sometimes you have to do something

0:18:34crazy with it or you have a weird error that you have to overcome and anything

0:18:40involving branching merging of branches certain advanced operations like

0:18:45committing only part of what you've changed or discarding only part of what you've changed.

0:18:50You can do all these things in the command line, but it's so obtuse to figure out how

0:18:55to do that on Git, and many times things can be multiple commands, and many times they're

0:19:00very error prone if you do them manually, and you could actually do some damage if you

0:19:04do it wrong. So typically now I just use Git Tower on the Mac, and I just don't do any

0:19:10kind of operations like that on the server.

0:19:12I'm exactly the same. I use Git Tower for probably like 99% of my Git. It just sort

0:19:17of works, it's very reliable, it's straightforward, and the way that they present Git I've always

0:19:24found kind of works with my head. Sometimes I've tried some other Git clients and they

0:19:30can get very... I don't even... They're showing me too much. Git has all kinds of crazy information

0:19:38and metadata and things about, especially when you have lots of branches, like things

0:19:42that are going on, and they just hurt my head.

0:19:45I liken the way that I use Git Tower, it's pretty straightforward.

0:19:50I open it up, I open a repository, it's like, "Here's the things that you've changed, and

0:19:54would you like to commit them?"

0:19:55And most of my process is that, and if I want to make a branch, I just pick the commit I

0:20:00want to branch from, I give it a name, and now it's created.

0:20:04And so it does a very good job of showing that to me

0:20:08in a way that, yeah, it's completely,

0:20:10it's one of those essential tools.

0:20:11Like if I'm setting up a new computer,

0:20:13there's a, like in that first five things

0:20:16that I will download onto it,

0:20:18one of them is going to be Git Tower,

0:20:19'cause I really can't work productively without it,

0:20:23which is probably saying a lot.

0:20:24- Yeah, yeah, I mean, again,

0:20:26I really do try to avoid GUI tools for developer stuff

0:20:30where there is a perfectly suitable command line version.

0:20:33But this is one of those things where it's so worth it.

0:20:36It is so, you know, not only does it save me a lot of time

0:20:39and it makes certain operations, you know,

0:20:41less error prone that are complex,

0:20:43but also it just gives me a really good view

0:20:46of what's going on.

0:20:47Like, you know, most of what we mentioned before,

0:20:49like a lot of what we were talking about is like

0:20:51how source control can show you and help you track

0:20:56what you're changing, what, you know,

0:20:57what has changed over time, how things used to be

0:20:59or how things are now.

0:21:01And git tower is, they just do a really nice job

0:21:05of showing the diffs, showing the various commits

0:21:07and what was in each commit, showing branches

0:21:10and letting you do that.

0:21:11And it isn't, I mean, there are certainly,

0:21:13there's certainly room for improvement in particular.

0:21:15I think the sub module area is,

0:21:19could use some improvement, but that's,

0:21:21most of the areas that I think tower could be improved,

0:21:25including sub modules, I think are at least partially

0:21:28or even mostly because the underlying Git feature

0:21:32is itself complicated and finicky.

0:21:35So like submodules suck.

0:21:38Everything about Git submodules is horrible.

0:21:40And so I can understand why the implementation

0:21:42of them in tower is also a little bit odd

0:21:45and a little bit finicky.

0:21:47But ultimately I think if I'm going to be using Git,

0:21:49this is the way to do it.

0:21:52- Yeah, and I agree.

0:21:53And I think it's also probably worth contrasting it to,

0:21:56I do use the version control integration in Xcode quite a bit, but it's through totally

0:22:03different things.

0:22:05Like I use the...

0:22:07So A, it's just useful to be able to see what's changed.

0:22:11And often what I'll end up doing is, if in the...

0:22:13What's it called?

0:22:14The navigator view?

0:22:15Like, the bottom left part of the Xcode browser, you can say, "Show me only files that have

0:22:22changed, that have an active version control status."

0:22:25And that's really helpful.

0:22:26I'll find when I'm working on something and I can kind of just see the files that I've

0:22:31been working on, and it collapses a big project into a nice small list, and it's also kind

0:22:36of just, if I see something that doesn't look right, often I'll find a nib file that has

0:22:41changed for some reason that I don't understand. I opened it up once and touched it, and then

0:22:47horrible things happen, and being able to be aware of that earlier in the process is

0:22:52helpful, but most of what I do is very helpful, like version control, I'm sure these have

0:22:58fancy names, but where you can compare inside of Xcode your current version to a past version.

0:23:05So it's like in the top right corner of Xcode, there's the three views, there's the regular

0:23:10view, the companion view, and then the version control view.

0:23:13And in that, I'm so often in there, where I'm looking at code and trying to see what's

0:23:18changed, how is this different, how did I used to do this, like if I have a problem

0:23:23that I've solved once before, I go in there and compare them, and then like I was saying

0:23:27earlier, surprisingly often for working just myself, I'll use blame, so I'll switch it

0:23:34into blame mode and look through the source file and say like, when did this change, when

0:23:39did I start doing it this way, what was that around, and those kinds of tools, and having

0:23:44them built right into Xcode is really useful. I go to tower regularly, but it's when I'm

0:23:52done with something, or when I'm getting ready to do a release, or in these big strategic

0:23:58operations. But I love that Xcode has integration at the tactical level, where I'm actively

0:24:05coding, and in that process I don't have to context switch to some other app to look this

0:24:10I can very easily just be like, "Huh, why am I doing it this way? When did this change?"

0:24:14And that sort of thing. And so I use those tools in Xcode a lot, but I hardly ever commit

0:24:20to any of those types of operations from Xcode. It has them, I'm sure they're there, and I'm

0:24:25glad they exist in some ways, so that out of the box you can do basic version control,

0:24:29but in Xcode I find it really helpful at that basic, the actual line of code level, and

0:24:37And then I go to tower whenever I want to do actual operations, like things that I would

0:24:41go to a command line and type, you know, git clone, git branch, git merge, git whatever.

0:24:45I don't actually know what half of them are because I just use tower instead.

0:24:50So I didn't even know this version view was here. I just open it up now and I'm like,

0:24:56my mind is blown, like, oh my God, this is so useful.

0:24:59So someone has not been watching what's new in developer tools sessions at WWDC for the

0:25:04last few years. I think we just discovered that live on air.

0:25:08Does that surprise anybody? I didn't read the manual. This is great!

0:25:12This is amazing! All I ever really used in Xcode was the little

0:25:17M indicators on the sidebar to know what I've changed.

0:25:19Well, there you go. Now you know that you can do some of these basic operations live

0:25:23at Xcode, and like I said, they're really helpful. They're not...

0:25:27Yes! It turns out!

0:25:30Turns out. Alright, anything else this week?

0:25:34No, I think that's it. Mostly, I guess, just to say, make sure you're using version control,

0:25:38please, please, please, make sure you're using version control. It's one of those things

0:25:41that if you're not, and version everything, I version stuff, I don't do a lot of Photoshop

0:25:49work, but when I do, I just put my PSDs into version control. And it doesn't do all the

0:25:55cool fancy diffing, it's not fancy in that way, but I don't care. I can always go back

0:26:00in time, I can always snapshot things.

0:26:02Like whatever you're doing, try and version control it.

0:26:05I version control my blog, I version control anything I can because once you get into the

0:26:09discipline and the habit of doing it, it's just so much better.

0:26:13And it's probably worth saying, I'm terrible about commit messages because I'm just working

0:26:17by myself, and it's hilarious.

0:26:21Most of my commit messages are often just like, "stuff, kind of works now, hmm, this

0:26:25seems to be better."

0:26:26- Fix, fix, fix. - Fix, fix.

0:26:28But that's enough.

0:26:30Like, it's, 'cause I'm still creating snapshots.

0:26:33Like, I'm not necessarily communicating as well

0:26:35to my future self, which is maybe, you know,

0:26:37like, problematic to, you know, in some ways,

0:26:41but just having it.

0:26:42Like, just putting random gibberish in there

0:26:44and just like, you'd be better off if you just like,

0:26:47had Git, take a, you know, take a commit snapshot

0:26:49once an hour would be, you know,

0:26:52even if you didn't want it to do anything.

0:26:53Like, having just some kind of resource

0:26:55to be able to go back in time is so valuable

0:26:57and I think can make you such a better developer,

0:27:00especially when you use the Xcode integration tools.

0:27:03- To understand how-- - To watch the videos.

0:27:05- If you watch the videos,

0:27:06you can really do some powerful things.

0:27:08So I highly recommend them.

0:27:10- All right, thanks a lot.

0:27:10That's all the time we have this week.

0:27:12So thanks for listening, everybody.

0:27:13Thanks to our sponsor, Braintree,

0:27:15and we will see you next week.

0:27:16- Bye.

0:27:17I can't believe you didn't know those were there.

0:27:21(laughing)

0:27:23How did you not know those were there?

0:27:30There's a lot of Xcode I haven't explored yet.

0:27:34There's only, in the default nav bar, there's only six buttons.

0:27:40I just never clicked on those two.

0:27:41Yeah, the one next to it with the semi-circles, the Venn diagram one, the assistant editor,

0:27:45I don't know what that does either.

0:27:46Well, that one is mostly just useful for if you have a nib in one view and the related

0:27:51file in the other one.

0:27:52Oh, okay, yeah.

0:27:53Like, it's designed to have two things compared to, like, next to each other, so that's useful

0:27:58if you're, like, dragging outlets or things, you know, from, if you're dragging outlets

0:28:02from a nib file into a source file, use the companion one.

0:28:05But yeah, you know, there's this whole world of version control that's been waiting for

0:28:11you this whole time.

0:28:13Oh, I'm so glad we captured that on...

0:28:16(laughing)

0:28:18[BLANK_AUDIO]