Under the Radar

22: Version Control


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

00:00:03   I'm Marco Arment.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

00:01:17   and it was much simpler,

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

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

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

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

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

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

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

00:01:45   so I have minimal experience there

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

00:02:28   rather than just a push.

00:02:29   (laughing)

00:02:30   This is novel and exciting.

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

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

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

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

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

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

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

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

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

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

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

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

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

00:03:04   - Yep.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

00:05:15   these systems provide invaluable help,

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

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

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

00:05:28   is a huge mistake.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

00:07:02   way.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

00:11:21   multiple computers,

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

00:11:29   please use version control.

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

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

00:11:37   >> Yeah.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

00:12:55   that.

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

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

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

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

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

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

00:13:25   Why is that?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

00:15:06   than it has to be?

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

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

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

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

00:15:19   all with that one integration.

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

00:15:22   and supports most programming languages.

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

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

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

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

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

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

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

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

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

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

00:15:52   and all of Relay FM.

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

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

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

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

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

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

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

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

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

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

00:16:38   version control system?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

00:18:18   50 bucks whatever it is totally worth it get because git is incredibly

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

00:20:59   or how things are now.

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

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

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

00:21:10   and letting you do that.

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

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

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

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

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

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

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

00:21:32   is itself complicated and finicky.

00:21:35   So like submodules suck.

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

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

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

00:21:45   and a little bit finicky.

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

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

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

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

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

00:22:03   different things.

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

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

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

00:22:13   What's it called?

00:22:14   The navigator view?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

00:25:27   Yes! It turns out!

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

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

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

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

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

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

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

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

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

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

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

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

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

00:26:25   seems to be better."

00:26:26   - Fix, fix, fix. - Fix, fix.

00:26:28   But that's enough.

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

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

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

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

00:26:41   but just having it.

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

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

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

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

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

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

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

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

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

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

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

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

00:27:08   So I highly recommend them.

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

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

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

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

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

00:27:16   - Bye.

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

00:27:21   (laughing)

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

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

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

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

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

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

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

00:27:51   file in the other one.

00:27:52   Oh, okay, yeah.

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

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

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

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

00:28:11   you this whole time.

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

00:28:16   (laughing)

00:28:18   [BLANK_AUDIO]