WEBVTT 0 00:00.360 --> 00:06.420 So in the last few lessons we looked at implementing source control locally using the command line as 1 00:06.420 --> 00:10.520 well as using Xcode and also remotely using GitHub. 2 00:10.770 --> 00:17.490 So now I want to take you a little bit further and I want to talk about collaboration using remote repositories 3 00:17.610 --> 00:25.770 and GitHub because this is one of the best ways to start working in a team of programmers and to contribute 4 00:26.010 --> 00:28.570 your skills to open source projects. 5 00:28.620 --> 00:34.500 So we've seen all of these four areas, the working directory, the staging area, the local repository as 6 00:34.500 --> 00:36.230 well as the remote repository. 7 00:36.420 --> 00:40.320 And you should be pretty familiar with all four of these areas by now. 8 00:40.320 --> 00:48.130 Now in the next scenario let's shift over to just look at the local and remote repository that you own. 9 00:48.360 --> 00:50.470 So let's say that Angela 10 00:50.550 --> 00:53.390 so myself, I own this repository. 11 00:53.400 --> 00:58.540 I created it locally and then I pushed it to my remote repository on GitHub. 12 00:58.830 --> 01:04.570 Now let's say that I have an evil twin who's called, I don't know, 13 01:04.800 --> 01:07.470 Bangela, that's a terrible name. 14 01:07.830 --> 01:12.120 Let's say that she also wanted to make changes to my repository. 15 01:12.120 --> 01:13.540 She looking at my code base 16 01:13.560 --> 01:19.290 and you know she wants to add some features or fix some bugs or do something. 17 01:19.290 --> 01:27.540 Now because I own this remote repository over here, in order for her to work on it she could make a copy 18 01:27.540 --> 01:30.730 of it that exists on her GitHub account. 19 01:30.930 --> 01:38.490 So remember this is different from git clone. Git clone is just grabbing at the entirety of the repository 20 01:39.000 --> 01:42.600 and then cloning it to your local work environment. 21 01:42.600 --> 01:48.300 Now in this case we're basically just copying a repository that's hosted on GitHub and we're keeping 22 01:48.300 --> 01:52.740 the copy under our own GitHub account where we can make changes to it. 23 01:53.040 --> 01:56.970 So this in terms of GitHub lingo is called forking. 24 01:56.970 --> 02:04.290 Now once you fork a remote repository, then you now own it. You have full permissions to do whatever 25 02:04.290 --> 02:07.810 it is that you like with this copy of the repository. 26 02:07.830 --> 02:14.940 Because as you can imagine, it would be pretty crazy if everybody could modify your source code on all 27 02:14.940 --> 02:20.970 of your open source repositories because you know it would lead to maybe amateurs changing all sorts 28 02:20.970 --> 02:28.170 of things that you don't want them to or you know people making features that are incompatible with 29 02:28.170 --> 02:29.660 what you've got already. 30 02:29.670 --> 02:35.730 Basically you'd only give people who you have a trusting relationship with write access to your remote 31 02:35.730 --> 02:36.540 repository. 32 02:36.540 --> 02:43.110 So say if you work within a team and you're all working on a product then everybody in the team probably 33 02:43.110 --> 02:47.540 has both read and write permissions on a single remote repository. 34 02:47.580 --> 02:54.330 And that way they can get clone and work on it locally and then push it and resolve any sort of conflicts 35 02:54.360 --> 02:55.730 that way. 36 02:55.740 --> 03:00.060 But you don't want anybody on the Internet having those kind of permissions. 37 03:00.060 --> 03:04.090 So how do you implement this kind of open source collaboration then? 38 03:04.110 --> 03:07.660 Well it's through forking and making pull requests. 39 03:07.710 --> 03:13.020 So now let's say that evil Angela, Bangela, has forked my repository. 40 03:13.110 --> 03:17.940 So on her GitHub account she now owns a copy of my repository. 41 03:18.120 --> 03:24.280 And from this point she can then clone that repository to work on it locally. 42 03:24.480 --> 03:31.080 And if she decides to add some features to it maybe you know improve the code base or add some more 43 03:31.080 --> 03:34.620 code or do something crazy or whatever it is that she wants, 44 03:34.620 --> 03:41.610 then after she's happy with that and she's committed those changes then she can push it to her remote 45 03:41.610 --> 03:48.980 repository and then if she wants me or good Angela to incorporate those changes that she made, then the 46 03:49.060 --> 03:56.070 only option is to make a pull request if she is not within that trusted pool of people who all have 47 03:56.070 --> 03:59.100 read and write access to my remote repository. 48 03:59.100 --> 04:05.430 So say if she only has read access, then she would have to make a pull request and it's almost like making 49 04:05.460 --> 04:09.860 a suggestion. Here are some suggested changes that I've been working on, 50 04:09.870 --> 04:16.370 what do you think about it? If you ok it, then please you know merge it to your remote repository. 51 04:16.680 --> 04:23.070 So the reason why its called a pull request and not a push request is because the person who has the 52 04:23.070 --> 04:25.200 right permission to the repository, 53 04:25.230 --> 04:33.510 so I have write permission to my own remote repository which has been forked and duplicated by you know 54 04:33.870 --> 04:35.070 my evil twin. 55 04:35.070 --> 04:39.300 If she wants to incorporate those changes then I have the deciding vote. 56 04:39.510 --> 04:45.320 So I can review those changes and I can pull the changes over. 57 04:45.360 --> 04:51.690 So its not a push because you don't own the rights to the remote repository that you're trying to push 58 04:51.700 --> 04:53.010 to. 59 04:53.240 --> 04:59.600 In this case if I decide after code review that actually those features actually added were pretty great 60 04:59.690 --> 05:06.380 and it seems compatible with my code so far and doesn't break anything, then I would approve the pull 61 05:06.380 --> 05:12.320 request and merge her repository with my own. 62 05:12.320 --> 05:16.150 So the changes will be reflected in a new commit. 63 05:16.160 --> 05:18.340 So let's take a look at this in action. 64 05:20.010 --> 05:23.600 So here we've got our original story repository, 65 05:23.640 --> 05:30.390 so this is a remote repository remember because it's hosted online on on GitHub, and we've got a number 66 05:30.390 --> 05:37.780 of commits and we've been doing some modifications and writing to write our story line. 67 05:37.800 --> 05:40.830 Now I'm going to log out of my account. 68 05:41.010 --> 05:44.230 So that was the account that created the story. 69 05:44.490 --> 05:48.050 And then I'm going to sign in using a different account. 70 05:48.060 --> 05:52.170 So right now I'm signed into a different GitHub account. 71 05:52.170 --> 05:55.670 This account is named gilfoyleismyothername. 72 05:55.740 --> 05:58.850 And now I'm going to search for that repository. 73 05:59.160 --> 06:03.210 So I found the story repository by the user Angela Bauer. 74 06:03.210 --> 06:05.650 So that was the one that we saw earlier on. 75 06:05.700 --> 06:11.910 So I'm going to go into this repository and you can see that all of these lines and files are publicly 76 06:11.910 --> 06:18.300 visible and you can read through all of it even though you are now not signed in to the account that 77 06:18.300 --> 06:19.940 created this repository. 78 06:20.280 --> 06:25.660 So from here what I'm going to do is I'm going to fork this repository. 79 06:26.310 --> 06:34.350 So as we mentioned before, forking is simply making a copy or a duplicate of a remote repository and 80 06:34.350 --> 06:40.920 putting it under your own GitHub account. So that you can see this user that I've created is called 81 06:40.950 --> 06:42.500 gilfoyleismyothername 82 06:42.540 --> 06:47.950 and now I have this repository under my own username. 83 06:48.030 --> 06:52.550 So I've made a copy of it and you can see it's exactly the same as before. 84 06:52.710 --> 06:57.150 Everything's been copied over including all of the previous commits that were made. 85 06:57.570 --> 07:01.490 So now from here, I'm going to go-- From here 86 07:01.500 --> 07:03.780 I'm going to make some changes. 87 07:03.840 --> 07:11.860 So let's maybe change one of these storylines. So let's change chapter 4. 88 07:14.660 --> 07:22.040 So let's say that this other user, this other person, has some suggested improvements to my code or 89 07:22.040 --> 07:23.770 in this case to my writing. 90 07:23.940 --> 07:30.140 They're still keeping the spirit of the original repository alive because we are now converting into 91 07:30.170 --> 07:33.190 a space theme or an alien theme. 92 07:33.650 --> 07:40.850 So I've made my changes to chapter r and I'm going to commit those changes saying, 'Add more space 93 07:40.850 --> 07:45.490 theme to chapter 4.' 94 07:45.500 --> 07:48.540 So that's what I did and I'm going to commit to the master branch. 95 07:48.560 --> 07:54.730 This is the master branch of my own forked copy of the story repository. 96 07:54.800 --> 08:02.450 So once I commit those changes then we can view what it currently looks like and the graphs. 97 08:02.480 --> 08:13.250 So if we have a look at the network, you can see that this is the point where I forked the story repository. 98 08:13.460 --> 08:20.170 And that commit was created by Angela Yu which basically merged this branch to the master branch. 99 08:20.210 --> 08:23.090 So we did that two lessons back if you remember. 100 08:23.540 --> 08:30.260 So the latest commit though is made by this current user, gilfoyleismyothername, and you can see that 101 08:30.260 --> 08:36.930 I've added it to the master branch of my forked copy of that repository. 102 08:37.160 --> 08:47.030 So say if I now open up a incognito window and I log back in to the Angela account and go over to that 103 08:47.120 --> 08:56.530 story repository, you can see that if I have a look inside my graphs, go into network, that that latest change 104 08:56.570 --> 08:59.590 is not reflected on my master branch. 105 08:59.600 --> 09:05.670 It's showing up as a separate branch made by gilfoyleismyothername. 106 09:05.810 --> 09:09.540 And you can see the members who have forked your repositry. 107 09:09.920 --> 09:16.790 So this is a great way of collaborating because you can have contributors make edits or add new features 108 09:17.090 --> 09:21.600 to your preexisting code base or repository. 109 09:21.980 --> 09:30.070 And now what I can do if I head back to the Gilfoyle account, so I'm just going to flip through these 110 09:30.070 --> 09:37.860 two so that you can see right now I'm inside the Gilfoyle accounts and this is the Angela Bauer account. 111 09:38.170 --> 09:46.320 So now under the Gilfoyle account what I can do is I can make a pull request, so we can do that here. 112 09:46.720 --> 09:48.990 And you can see that it's able to merge. 113 09:49.480 --> 09:51.470 And these are the changes. 114 09:51.520 --> 09:55.400 So swapping that word for that word, swapping that word for that phrase. 115 09:55.630 --> 10:05.110 So now all I have to do is hit create pull request and tell the original author which is Angela Bauer 116 10:05.590 --> 10:15.070 what I've done, why I think my modifications or my features are worthy to be merged with the original 117 10:15.070 --> 10:16.270 repository, 118 10:16.270 --> 10:17.710 and you know any of the notes 119 10:17.710 --> 10:17.950 right? 120 10:17.950 --> 10:20.530 Any other comments that I have. 121 10:20.680 --> 10:21.700 Let's just say... 122 10:25.370 --> 10:26.710 Always helps to be complimentary. 123 10:26.840 --> 10:30.840 So now let's go ahead and create a pull request. 124 10:33.540 --> 10:35.580 So the pull request is done 125 10:35.640 --> 10:45.010 but if we have a look back into the story repository you can see that those changes are not made right? 126 10:45.030 --> 10:49.010 It's because I don't own this repository. I don't have write access, 127 10:49.020 --> 10:56.810 I only have read access as a member of the general public and not a member of the trusted inner circle. 128 10:57.180 --> 11:01.090 So I can only suggest my changes. 129 11:01.230 --> 11:07.680 Now if we head over back to the Angela Bauer account who owns this repository, 130 11:08.070 --> 11:14.350 now if I have a look under pull requests, I've got a brand new pull request right? 131 11:14.400 --> 11:15.760 So it previously was zero 132 11:15.780 --> 11:24.000 but now I have one and it's showing us one open pull request and this is added a minute ago by Gilfoyle. 133 11:24.120 --> 11:30.990 And if I look at, it I can see why he thinks that this modification is necessary 134 11:30.990 --> 11:33.170 and what were his commit message. 135 11:33.300 --> 11:40.320 And I can also take a look at the commits that he made and compared the differences, 136 11:40.320 --> 11:42.720 so review those changes. 137 11:47.690 --> 11:49.380 So I could say something like, 138 11:49.400 --> 11:50.610 'Great job! 139 11:51.840 --> 11:53.060 Great job 140 11:54.240 --> 12:01.410 Gilfoyle and I can submit this feedback to Gilfoyle and approve merging these changes. 141 12:03.750 --> 12:16.200 So now all I have to do is hit merge pull request and maybe add a 'Merged from Gilfoyle's modifications 142 12:16.530 --> 12:18.880 to chapter 4'. 143 12:19.290 --> 12:19.670 OK. 144 12:19.680 --> 12:28.750 So let's go ahead and confirm the merge. And now you can see that that commit is added to Angela Bauer 145 12:28.780 --> 12:29.970 master. 146 12:29.970 --> 12:40.060 So if I have a look inside my graphs now you can see that the latest commit was my merge and it 147 12:40.060 --> 12:42.160 was and you can see where it came from. 148 12:42.160 --> 12:48.820 It came from a fork made by Gilfoyle which shows up as a separate branch and then it got merged back 149 12:48.820 --> 12:52.030 into the main branch of the main repository. 150 12:52.060 --> 12:59.380 So some people use GitHub purely as version control for their own projects and use some of the features 151 12:59.380 --> 13:01.620 that we discussed in previous lessons. 152 13:01.810 --> 13:12.270 But there's also a huge community of awesome coders on here who have created really brilliant projects. 153 13:12.490 --> 13:19.810 And if you can see ways of improving it or contributing to it then it's a great way of starting to 154 13:19.810 --> 13:26.200 learn how to work in a team of programmers which is a really essential skill when you're working for 155 13:26.200 --> 13:28.680 a startup or for a company. 156 13:28.690 --> 13:34.870 So for example if we have a look at the Alamofire repository which is something that we've been using 157 13:34.870 --> 13:42.700 for quite a while, if you have a look at the contributions you can see that there have been loads and 158 13:42.700 --> 13:49.840 loads of other users who have looked at the code and done things you know or made suggestions and to 159 13:49.840 --> 13:55.480 steadily improve this framework that you know everybody else is benefiting off 160 13:55.480 --> 13:56.140 right? 161 13:56.140 --> 14:04.090 You can see that a total of 4300 forks have been made and there's currently 4 open pull requests 162 14:04.150 --> 14:07.790 but 559 pull requests were closed. 163 14:07.840 --> 14:09.160 So let's have a look. 164 14:09.160 --> 14:15.980 So for example in this case this guy updated the readme to the current version. 165 14:16.000 --> 14:18.220 So that's obviously just editing a text file 166 14:18.250 --> 14:21.660 and that's pretty much within anybody's capabilities right? 167 14:21.880 --> 14:26.120 And then it got merged by somebody who owned this repository. 168 14:26.590 --> 14:30.080 And you know they gave them a bit of feedback back right? 169 14:30.310 --> 14:36.880 But there's other things like you know code additions or code deletions or modifications that people 170 14:36.880 --> 14:37.780 have made. 171 14:37.810 --> 14:46.540 So this guy made some fixes and you know he's documented what were the goals what are the implementation 172 14:46.540 --> 14:47.310 details, 173 14:47.380 --> 14:49.390 what were the tests that he performed 174 14:49.480 --> 14:55.300 and then the guy who owned the repository said, 'Hey just, you know, maybe one thing that you need to change. 175 14:55.390 --> 14:56.390 Have a look in here.' 176 14:56.530 --> 15:01.410 And then once it was changed then it was approved and merged with the master branch. 177 15:01.660 --> 15:07.120 So have a look around on GitHub and see what are some of the cool projects that you could maybe get 178 15:07.120 --> 15:08.260 involved in. 179 15:08.260 --> 15:14.820 So to begin with you know some of these things that we've been using for example progress HUD 180 15:14.860 --> 15:15.290 right? 181 15:15.400 --> 15:17.950 We've been using inside Quizzler. 182 15:17.950 --> 15:24.250 You can actually have a look inside the code files and see, you know, what are the things that you would 183 15:24.250 --> 15:25.510 change about it. 184 15:25.810 --> 15:32.810 Obviously progress HUD is written in Objective-C, maybe choose one that is written in Swift. But have 185 15:32.820 --> 15:34.750 a look at the libraries that you've been using 186 15:34.780 --> 15:36.010 and if you want 187 15:36.010 --> 15:42.760 you can build on top of it either for your own goals and purposes but also you know if you're building 188 15:42.760 --> 15:48.700 on top of somebody else's open source code then it's a nice thing to contribute back to the open source 189 15:49.180 --> 15:57.740 world by forking and making a pull request to offer your improvements or bug fixes or new features. 190 15:57.910 --> 16:07.570 So as I said, it's almost like a social network for programmers and you can make a lot of great friends 191 16:07.570 --> 16:14.320 on here and you can also get a lot of help on here in your development journey. 192 16:14.320 --> 16:19.960 So the last thing that I wanted to say was that in this module I've mentioned a lot of different Git 193 16:19.960 --> 16:26.200 Hub or Git commands and it can be quite difficult to remember all of it just by watching these videos 194 16:26.200 --> 16:26.900 once. 195 16:26.950 --> 16:33.280 So remember you always have these videos so you can always come back and listen to my terrible jokes 196 16:33.340 --> 16:34.000 hum. 197 16:34.090 --> 16:37.350 But also the information again. 198 16:37.360 --> 16:40.580 So you can always re watch it and refresh yourself. 199 16:41.050 --> 16:46.870 But I've actually made a PDF cheat sheet of some of the most common 200 16:47.050 --> 16:52.290 Git and GitHub commands that you'll be using. 201 16:52.420 --> 16:58.060 And I've laid it all out in terms of arrows that we've explained before so that you'll know what I'm 202 16:58.060 --> 17:03.030 talking about and you can download this PDF inside this lesson. 203 17:03.190 --> 17:08.360 So I hope you enjoyed all of that and I will see you on the next lesson.