SPEAKER: All right,
welcome to this seminar. It's going to be about Git and
GitHub, which are technologies that you can use to do what's
called version control, keeping track of different
versions of your program, testing out new changes, et cetera. All right, so before we get started,
we'll do a quick introduction into kind of what Git and GitHub it is all
about, and what it can be used for, and then we'll go more
specifically into of the command line commands that you would use in
order to use some of this technology and leverage it for projects
that you're working on, or projects that you're
collaborating on with other people. So first of all, what is Git? What can it do? The first, and one of the most
important features for Git, is that it can keep track
of changes to your code. So if you have code, you create a
file, and maybe you're making changes, Git will keep track of all
of the different changes that you've made to your
code such that, at any point, you can kind of go back and
see the history of whatever it is that you've been working on to
see what were your earlier changes and when did you make those changes. And that can sometimes help when
you're going back, and trying to debug, and figure out what went
wrong at some stage in the code process. So that's one thing that
Git can be useful for. Another thing that it can be
useful for is synchronizing code between different people. Especially when you're
collaborating with other people, Git is valuable for trying to make
sure that your code potentially matches the code that
someone else is working on. And at any point, absolutely feel free
to interrupt me if you have questions. If something doesn't make sense, I'd
be happy to field questions as we go. So imagine that you and
a collaborator are both trying to work together on the same
piece of code at the same time. So maybe that code lives
somewhere on some server, and there are a whole
bunch of servers that can host what we call
get repositories, just folders that contain files
that are tracked via Git. GitHub is one example of that. So maybe both you and your partner
need access to the same file. Maybe you both make
changes to that same file. And what Git allows
you to do is Git makes it very easy to then take those changes
that you both have made independently and then kind of merge them back
together when you push them back online to the same file and then pull
those back down to your own computers. So that you both have
the latest changes, not only what you've changed
on your file, but also what a potential collaborator
has made changes to as well. And you both have the most recent,
up to date version of the code. And so synchronizing code
between different people is another really valuable
thing that Git can be used for. A third valuable thing that get
can be fantastic for is to test changes your code without
losing the original. It's all too common that,
before I started using Git, would try making changes to
code to try to make it better and then suddenly find out
that the code no longer works. And so my original solution
to this was to do something like make a copy of my
original file, save the old one and then make changes so
that, if it messed up, I could go back to the original
one and not lose the original. And that ends up getting
very, very messy. Especially if you get into
larger projects, and working with multiple people, you'll end up
with a lot of different old versions and it might be hard to keep track of. So Git makes it very easy to save
an original version of your code, test out new changes that
you might want to add, and, only when you're sure that
you like these changes, that they work that you want to
what's called merge them back in with your original file, can you
merge them back with the original file that you were working
on in the first place. And the fourth and very valuable
thing that Git can be useful for is for reverting back changes
to older versions of your code. Say you made a change to your
code somewhere along the way and realized later on that that's
not the change that you actually wanted to make, and that you would
want to go back to an older version. Git makes it very easy. As long as you know which
version you want to go back to, you can just go back to that
old version and kind of start over from wherever you were previously. So that's sort of an overview
of kind of what Git is and the things that Git can do for you
if you leverage its functionality well. And now we'll begin to go
into the actual commands that you would need to use
and need to type in order to make all of this kind of work. Questions Before we go on? OK, fantastic. So first command that will
be really valuable to know is what's called git clone. git clone is a command you
would type at the command line, and I'll show you how
this works in a moment. And essentially, what
git clone does is you type git clone followed
by some git URL where that URL is the address of some GitHub
repository-- and remember a repository is just a collection of files and
folders that are being tracked by Git-- and it'll don't make a copy of that
repository that lives somewhere on the internet, potentially
on GitHub, but there are also other services that do similar things. And it will make a copy of that
repository on your computer. So you can begin to make
changes on your own computer. And side note, you can
also do something called Creating a fork of a repository,
where if someone else owns a repository online
somewhere, you can fork it, which just means you create kind of
your own copy of that repository that also lives online. But we'll get to that potentially later. So if this is Github, imagine
this being some kind of server, and this is a file that's being
tracked via Git in some Git repository. If I were to type git clone followed
by the URL of that repository, then this file, I would
clone it, and it would make a copy of the entire repository
that is now saved on my own computer. Make sense? OK, fantastic. The next thing that's important to
know is a command called git add. So git add is what you would do
after you've cloned a repository and so now you have a copy of
that repository on your computer and say you're making changes to
that repository, changing the files, changing the code, and now you want
to say that the next time that git saves a change to this
repository, you want git to save the change that
you made to that file. So let's show you what I mean by this. Let's say that we've
just cloned this file. So this file now exists
on your computer. It's being tracked by a repository. If I make a change to the code,
maybe add a line to that code, and I want to say that, the next time
you save a change to this repository, I want you to track
that change, you would say git add followed by the
name of the file, whatever that file happens to be named. And then, it would, say
change is to be committed. And it would track that this is a change
that you now want to make to that code. So let me show you what
that looks really quickly. I have here GitHub repository. So they usually live at
some link, like github.com, slash some user name-- my
user name is [? BrianU28 ?] slash whatever the name
of the GitHub repository. Is in this case, this repository
is just called seminar. Up in the upper right
hand corner, you'll see a button that says
clone or download. And if you click on that
link, it will give you a link that you can
copy in order to clone this repository to my own computer. And so I could copy this. And then I could go in to CS50 IDE. And then, if I were to type
git clone followed by that URL, it would clone the repository
and save it to my computer. In this case, I've already done it,
so I'm not going to do it again. But you'll see, here, I have
this folder called seminar. And that folder is just my copy of
the repository that exists on GitHub. So we'll take a look at
the file that's in here. There's two files in here. But [? swap.c ?] is the
one that I'm interested in. You might recognize this
file from a previous lecture. It was just the file
where we kind of set two variables equal to two different
numbers in C, and we want to swap them. But what you'll notice here is
that this code is incomplete. It says swapping right now, but we
don't actually swap the values just yet. So what I'd like to do now is
I'm going to change this code so that it actually
swaps the two numbers. And then I want to git
add those changes so that git knows that this is
a new version of the file that I want to save. So I'll just quickly
add the necessary code, and those three lines are
going to swap the file. And so now if I cd into the
seminar directory, what I can do is I can add the changes
that I just made, and git will then track those changes
so I can save them in the future. And in fact, one kind of little
tip that might be helpful is that if I ever type
[? git dif ?] at the command line, it will show me all of the changes that
I've made that I haven't tracked yet. So I type git dif, and
it shows me down here that these are the three lines
highlighted in green that I've added. I added this in temp equals x,
x equals y, and y equals temp. And those are now changes that,
the next time I add a file, they're going to be tracked by git. So I can do something
like git add swap.c, and that will add the
swap.c file as a file that I now want to track the
next time I save a change. So git add swap.c. And so that now has been added to
the changes that I want to track. So what's the next step? The next step is called git commit. Once I've added all the files
that I now want to save, now I need to actually make the Save. So git commit you might think of
as the equivalent of telling git to save a version of this repository. So the syntax looks something like this. You would type git commit
followed by -m, and then, in quotation marks, some message. And that message is just going to be
usually some summary of the changes that you've made in
this particular change so that if anyone were to go
back and look at what we call the commit history, they would
be able to see all the changes, and when you made those changes,
and what changes you made at any given stage in this program. So that's what git commit is. And it saves those new revisions
of a repository and kind of records a message along with it. And just as a side note, if
you'd like to combine the adding and committing steps
together into one step, this command right here git commit
-am, a for all, or a for add, will automatically add all
the files that you've changed, and also commit it
with a commit message. So you can combine both
of these steps together. So I'll show you what this looks like. When I type git commit and follow
it by kind of a message suggesting what it is that I've changed, then what
git will do is it will take my file, and it will save kind
of a new version of it. It'll save this version, which
says that I've added a line. It saves the message
along with the commit. But it also still
remembers that old version. Such that if I ever wanted to
go back to that old version, I could still do that. So I'll show you what
that looks like right now. So I'm back here, and
I've made these changes. I've already added them. So I can do git commit -m. And then, in quotation marks,
actually swap the values. And that's going to
be my message saying, here's the change that I made when I
just made these changes to the code. And so I see this what's
called a commit hash, which is just an identifier about the commit. And it says I've changed
one file and added three lines, which is indeed true. I added three lines to
this file in swap.c, and those are the changes
that I have just now saved. So what can I do now? git status is a helpful command,
where, at any stage in working on a git repository, if you ever want to see kind
of what's currently going on in the git repository, you can use git status
to gain some kind of insight into what's currently happening,
what are the changes that I've made to my current repository. And so the way that works is
that if I were to type git status into the command line, I
would see a message show up that says, what is the current
status of my repository, and the message might look
something like on branch master, and git ads has a feature which we'll
get to in a moment called branching, which basically lets you keep track
of different versions of your code, so you can have kind of different
separate tracks of your codes. So if you want to test changes, or
try and to implement new features, you can do that separately from
kind of the main part of your code, where master we consider to
be kind of the default code. And the second line here says, your
branch is ahead of origin master by one commit, which is just kind
of a fancy way of saying that, that version up here on
the server, this version that we have is one commit, or one
version, ahead of that version. So we've saved one change
that the server up on GitHub doesn't yet know about. Clear so far? OK. And I'll show you exactly
what that looks like. I can type git status right now, and
it will tell me that exact same thing. I'm currently on branch
master, and CS50 IDE is really nice in that it actually
tells me, right here in my prompt, what branch I'm currently. I'm on the master branch. And it says that I'm ahead of origin
master, which is the version that lives up on GitHub by one commit. So one revision ahead. So now, now that I'm one revision
ahead, how do I then take those changes and, what we call, push
them back up to GitHub so that the online version that can be
accessible by anyone looking online, or accessible by collaborators who are
also using the same online repository, can then see? And that git push is the
comment that we would use. And so the syntax for that
is just git push, which will send whatever committed
changes we've made up to the remote repository up on GitHub. I can be very explicit and
state exactly what branch I want to push to, as in git
push origin master, meaning push these changes to the master branch. But generally, you wouldn't need
to do this for normal purposes. So I would say something
like git push, and then this new change, the change
that I made on my computer, would then get pushed up to GitHub
so that anyone looking online would then be able to see
those changes that I just made. And so I'll show you what
that looks like right now. If I go back here. So again, I did git status. I'm ahead by 1 commit
because right now I've added these three lines that
actually perform the swap. And on GitHub, if I were to look at
swap.c, this is online on GitHub, swap.c doesn't have
those lines right now. On the online GitHub version,
it just says swapping. But if I go back into CS50
IDE, and I type in git push, those will push those
changes back up to GitHub. And if I go back to GitHub
and refresh the page now, I'll see that, indeed, these
three lines that I just added have now been pushed up online. And if you actually go to github.com
slash [? brianu28 ?] slash this whole link, you'll be able
to see this exact same thing because this repository is public. So those changes have
now been pushed online. Questions on how that worked? Fantastic. OK. So now git pull is
another valuable command. git pull is kind of the
opposite of git push. If git push means I made
changes on my computer, and I want to send them up to GitHub so
that the online version knows about it, git pul is GitHub contains a more
recent version of the repository than I have on my computer. And I'd like to take
those changes from online and pull them down onto
my computer so that I can see the most recent version
of the repository that's currently reflected on GitHub. And so the way that
would work is, if someone were to make a third
change to this repository, and my computer only had these
two revisions to the repository, I could say something like git
pull, and this third change to the repository that was added would
then be pulled down onto my computer so that my computer now has all the
versions that are matched on GitHub. So I've actually set up
a second IDE workspace. So this version has all
the changes we just made. In this version of my
workspace over here, which is a completely different
workspace, inside swap.c, I haven't updated it to
the latest changes yet. Because I haven't done a git pull. So it still says
swapping, and it doesn't have the latest version of the code. So if I want to pull from
GitHub, get the latest version, I would cd into the seminar directory. And then I could say git pull. And so it will pull the
latest changes from GitHub. And you'll see that it says,
fast forwarding this swap.c file. It changed one file, added three lines. And indeed, if I go to swap.c now,
that file that I just changed, you'll see that those three
lines that were on GitHub but weren't on my computer
before are now on my computer because I did git pull, and so those
changes are now reflected there. Clear on that? Fantastic. All right, let's talk
about merge conflicts. This is the part of git that
can often scare a lot of people. But don't worry. It's actually quite manageable. So here comes the question of, Git
seems to be very good at automatically tracking what changes I've made to
a file-- where I've added new files, where I've removed lines,
I've added new lines to code. But what happens if I'm working
on code, on a particular line, and I make a change to line 28,
say, and some collaborator also makes a change to that
same line, and we both try and push that code up to GitHub? Git's not going to be able to know
what to do about that situation because it doesn't kind of which version
of the code to believe, so to speak. So this creates what we
call a merge conflict, when, in trying to combine two different
versions of the repository, there's some sort of problem that
Git can't automatically resolve. And so you, the programmer,
need to figure out how to resolve that conflict. And so here's what that might look like. Maybe if you try and git pull,
and you're pulling in new changes from GitHub, but those
changes conflict with changes that you've made on
your computer, you might get a message that looks like this--
conflict, the merge conflict failed. You need to fix the conflicts
and then commit the result. And so this might be
what your file would look like after you get this merge conflict. You might get a situation where you
have a whole bunch of lines of code, and then this weird kind of series
of less than signs followed by head, a bunch of equal signs, and then
a bunch of greater than signs, followed by some weird sequence
of numbers and letters. This is what a merge conflict
might actually look like. And just to break this down for
you, here's what all this means. Everything between head and the set
of equal signs are all of the changes that you made that are in conflict. So changes that you've
made on your computer. Everything between all
of these equal signs and this series of greater than
signs are all of the changes from GitHub that you're trying to
pull down that are in conflict. So what happened here seems to
be that the online version seems to have said in b equals 0,
but my version, on my computer, I've committed, that b
should be equal to 2. And those were the same line. So when git tried to
merge those two together, it didn't know which line to go with. And so that's why we're
getting this conflict. And this random sequence
of numbers and letters right there is the conflicting commit. Every single commit gets
a unique identifier, just a sequence of numbers
and letters, and so this is telling me which is the
commit from GitHub that is causing this conflict,
that is the reason why I'm not able to merge these two together. And so what do you do in
a situation like this? To resolve this merge
conflict, all you need to do is get rid of this head line,
the equal line, the greater than line, and then figure out what
to do about these conflicting lines. You might delete one set
and only use the other. You might somehow find a way to
combine the two, but, in some way, you need to tell git what the actual
version of the code should look like. So in this case, we might
get rid of all the lines except for b equals 2 because b equals 2
is the version that I know that I want. You can get rid of
the extra space there. And after that, I
could commit this file, and now that would be
the version that's saved. I've now resolved the merge
conflict by specifically telling Git which version of
the code that I want to use. So let's try and create a
merge conflict right now so we can see what that looks like. In one version of my IDE, I'm going
to take this x, which is right now 28, and I'm going to set it to--
pick a number, any the number. 51. 51. And I'm going to git commit am. And I'll say so, what I'm doing here is
I'm adding this change that I just made and committing it, saying
I'm going to change x to 51. So I've made that commit. It notes that I've
only changed one file. It says one insertion, one deletion. What that means is I deleted the
line that says int x equals 28, and I added the line that
says int x equals 51. It doesn't know that I
changed two characters. It knows that I got rid of a
line and replaced it with a line. I can git push now. And so that change [? pushing ?]
[? changing ?] x to 51 is now online. So if I go to GitHub, and I
refresh this, right now x is 28. Now I see that x is 51 because
that's the change that I just pushed. Now, in this other
version of the repository, where x is still 28-- why don't
you pick a different number? AUDIENCE: 17. SPEAKER: 17. And I'm going to say git
commit -am change x to 17. So I'm saving that change. And let's say now I wanted to
pull the changes from GitHub, make sure I have the
latest version of the code. I've changed x to 17 here. The version on GitHub has
a recent change that says, we've changed x to be 51. So when I git pull, watch
what's going to happen. I'll close this file for
now, but I press git pull. And it says conflict,
merge conflict in swap.c. The automatic merge failed, so
git couldn't merge these two files automatically. I need to fix the conflicts
and then commit the results. So let's open up swap.c
and see what's going on. And you'll see, oh,
and CS50 IDE actually adds some nice little markers that
help us understand what's going on. But we see this head, and
we see this commit hash, and we see what the
different versions are. This is my version that
says int x equals 17. And this is their version
that says int x equals 51. That's the version that we
just pulled down from GitHub. So I need to decide kind of
which version of the code that I actually want to use. Maybe I don't know. And maybe I just want to go with, I
don't know, the average of the two. We'll do like, what is it, 34? And then I would get rid of
these lines that are conflicting. I'm not too used to the
syntax, but-- oh here we go. So I would just say int x equals 34. And I'll get rid of
all those extra lines. And so I've now changed this code,
gotten rid of all those excess lines, and just replaced it
with kind of the line that I actually want-- in this case,
the one that says index equals is 34. At this point, I can do git status,
just to see what's going on. It says that I have unmerged paths. I need to fix the conflicts
and run git commit. I will do git commit, -am, and I'll
say, I'm going to commit these changes. I just fixed the merge conflicts. So now it says I fixed it. I can now git push, which
takes these changes I just fixed the merge conflicts. I'm going to push them
back up to GitHub. I git push. And now, after that's done, I can
go back to GitHub, refresh the page, and x is now 34. And this is my resolution
to this merge conflict. Kind of a lot of stuff happening
simultaneously, but that makes sense? Any questions on how that merge
complex happened, why it happened, or what we were able to
do in order to fix it? All good? Fantastic. OK. Let's move on then. git log is another very useful feature. And git log's job is,
basically, it will tell you kind of the history of all of the
commits that you have made previously. So it shows the history of the
commits and their messages. So if I do something like git log,
and type that into my terminal, then something like this will
show up, where it will show me a history of all the
commits that I've made. It will show me the kind of
commit ID, or the commit hash, that identifies that commit. It will tell me who made that commit. So if multiple people are
collaborating together, it will tell you who
made the change, when they made the change,
on a particular date, and then this message here is whatever
you said was the commit message. So that's why a commit message
can be very, very important. Because when you use git log, you'll
see all the changes that were made, and the message is a very
good indicator as to what was changed in this particular version. So make sure you use good commit
messages if you're going to use git. Questions on git log? I'll show you what that looks
like in the actual terminal. I can type in git log at the terminal. And it will show me all
these changes that I've made. So I added the swap file, changed x
to 17, fixed these merge conflicts. Those are all the changes, and you can
see kind of when I made those changes and who made those changes. Clear? Fantastic. All right, so now let's
say I made a change, but I didn't mean to make that
change, and I want to kind of go back to a previous version of the code. That's what git reset is for. That allows I mean to kind of roll
back, these changes didn't work, I want to go back to an older version. And here's how that works. So recall that every
one of our commits has a commit hash, some
unique identifier that says this is how we identify
this particular change. And down here, next to
the commit messages, I've included the first couple
characters of those commit hashes. If I type git reset [? dash dash ?]
--hard, followed by some commit hash-- and usually you don't need to include
the entire commit hash because usually it's dozens upon dozens of characters. Usually just a couple of characters,
at least enough to uniquely identify that commit so that no other commit
has those same initial characters is sufficient-- if you type that,
it will revert your code back to that previous version, and
you will lose all of the changes that you've made sense that version. So do this only if you
were sure that you want to go back to the previous version. In addition to going back to a previous
version in your commit history, you can also go back to the version
that currently exists on GitHub. So if there were a version on
GitHub, which is our origin, in this case, the origin
of the repository, and we've made changes on
our computer, and now we realize those changes really don't
work, and really want to go back, you can use git reset
--hard origin slash master, to go back to the version
that's on GitHub and its master branch. And again, we've only been
working on the master branch so far, so that's the only thing
that we really have to work with. So I can type git reset
--hard followed by 476 1626, where that is the beginning
of the commit hash for this version of the repository. And again, if I don't know
what the identifier is, I can always use git log,
that code, that command that shows me the history
of all the comments that I've made along with when
I made any particular commit and what changes were
made in that commit. So that can give me the
identifier, and if I do git reset, then these changes that I've made
after that file will kind of go away, and I'll be left with this
being the most recent version. And so that's what I'm
going to have left over. Any questions on that? OK, let's get into
talking about branching. So branching is a very,
very valuable feature in git that basically allows you,
in a single repository, to have a couple different kind
of versions of the code that are going on simultaneously. So maybe you have one version of
your code, your master branch, that's generally the one
that works perfectly, or that does what you need
it to do, and maybe you want to add new features
to your program, or you want to add something
brand new to your code, but you don't want to
potentially mess up the master branch because that one you know works. So one thing you can do is
you can kind of branch off, creating a new branch that
you're making new changes to, testing out new features, while keeping
your original master branch identical. And then you can make
commits to this new branch. You can roll back those commits
and do all the same things that we were just talking about
previously in the seminar. And then only when you feel ready that
this new branch has all the things that you want it to have and is ready
to kind of become the official version, can you then merge it back
into the master branch so that you then have
the one working version. So let's explore how
you do that branching. So just to recap, branching is
a version of the repository. Each branch has its own commit
history, and each branch has its own kind of most
recent version of the code. So git branch is the
command that you would use in order to create a new branch. So if I just type git branch, it will
show me all of the current branches that I have on the repository. But if I want to create a new
branch, I would type git branch followed by the name of the branch. And I could just make up
any branch name I want, so long as it's not a name that
already exists as a branch. And then, once I've
created a new branch, if I want to switch to that new
branch, I would use git checkout. So git checkout, followed
by the name of the branch, will switch me to that
new branch that are going to be working on that other branch. And side note, if you want to kind of
combine these two steps to check out a new branch and create
it at the same time, you can use git checkout -b, and
then followed by a new branch name, and that will both create a new
branch, and it will switch you to it. That can just be a little
time saving feature. So right now, I just have
one version of the code. It's the master branch, the
original version, by default. And if I were to tight git branch
tests, that would create for me a new branch called tests that
basically will just be a copy of master, at least for the time being, creating
that new version of the code. So then, I can make new
changes to this test. I can add files to it. I can make commits, so saving
reversions of this test branch, and then later, once test
is the way I want it to be, I can merge it back in with master. And so we'll look at that right now. Git merge is the command
that we would use to merge two different
branches together, and the way that works is like this. git merge, followed by some branch name,
merges that branch with whatever branch I am currently on. So what that means is that if I
am currently on the master branch, and the tests branch now has
kind of a whole bunch of versions to the code that have been made so it's
got a whole bunch of files that have been changed, and I now want
to take those changes and say, I want to bring them
into the master branch. Then the command that
I would use here would be something like git merge tests. And that would take all these
changes to the test branch. And it would merge them
with the master branch so that the master branch now
reflects all of those changes. Now, there may be the possibility
that, on the master branch, I've made changes to
the same lines of code that the test branch
also made the changes to. And in that case, when you try and
merge tests into the master branch, you're going to run into
another merge conflict, and we've talked about
how to resolve those. But basically, it involves getting
rid of those lines you don't want, and then figuring out
how to take the two kind of different versions
of the code and figure out which version you actually want. So that's, oftentimes, a possibility
that you'll run into, especially on larger projects, where multiple
people are working on the code simultaneously, and potentially
working on different branches, it may very well be the case
that merging two branches can result in a merge conflict. So let's take a look
at how this might work. So as you can see, right now, I'm on
the master branch of this repository. And I can see this even more clearly,
if your terminal doesn't display what branch you're on,
just by typing git branch, and that will tell me that there is
only one branch in this repository, and it is called master. So let's say I want to
create a new branch. Let's say I want it to separate out this
code, the code that does the swapping, into its own function. But that seems like it has
the potential to go wrong. It might not necessarily work. So I don't want to
just change this file. I want to create a new branch that
will let me test out those changes without worrying about whatever
is happening in master. So I'm going to create a
new branch via git branch, and I'll call it function just
because the purpose of this branch is I'm going to be creating a new
function in order to perform the swap. So I type git branch function. And now, if I were to
type git branch, you'll see that I have two branches going here. I've got a master
branch, and it's green, so that says that's the
branch I'm on right now. But there's also a function
branch that appears now. That's the branch that
I've just created. And if I want to switch
to that branch, I would type something like
git checkout function. And it says, switched
to branch function. And so now, if I type git branch, I
would see there are two branches still, function and master, but function is now
the green one with the star next to it. That's the branch that I'm currently on. So now I'm on this function branch,
and I can add this swap function, void swap, int star A, int star
B, and in temp equals star a, star a equals star b,
and star b equals temp. And I can now replace this with just
swap address of x, address of y. That should work, right? Hopefully, it works. I'm going to commit those changes. I'm going to say add a swap function. And so that change was just made,
and so it says one file changed, I added eight lines,
removed three lines. And so that commit is there. But now, if I type git branch, I can say
I'm currently on the function branch. If I were to check
out the master branch, the git checkout master, what you'll
notice is that swap.c changes. It changed back to the version
that's on the master branch because the master branch
doesn't have new function. It just has these three
lines of code that are right inside the main function. Watch again, if I git checkout
back to the function branch, watch what happens to swap.c. It will just immediately
show me, here's the version that's on the function branch. And so those are those changes. Question? [INAUDIBLE] Yeah, so on the Mac Finder,
if you do a git checkout, and maybe this new branch
has, like, has a file that didn't exist on the
other branch, that file will appear in your file system. So it absolutely works. And so now maybe I'm
happy with those changes, and I want to-- let's
actually make sure it works. [INAUDIBLE] [? 34505034. ?] Fantastic. That did in fact work. So now I feel comfortable merging those
changes back into the master branch. So I'm going to go to the master branch
via git checkout master, and notice, once again, this is the version
that's currently in the master branch, and my function branch has that
new commit that I want to merge in. If I type git merge function,
what that's going to do is it's going to take the
changes on the function branch, and it will merge them
into the master branch so that that new commit, that version
where I made the new function, will now become part of master. And there shouldn't
be any merge conflicts because I haven't changed master. So I press Return. It makes those changes. And now this is my master branch,
and I have that swap function. And you can show, if I type git
branch, I'm still on the master branch. But that new function that I
created in the function branch now exists in master. And at this point, if I wanted to,
I could delete the function branch, because I no longer need it. And the command to do that is git
branch dash-- capital -D, for delete, followed by the name of the branch. So git branch dash -d function
deleted branch function. So now, if I type git branch again,
I only have the master branch, and if I were to git log to look
at all the commits that I've made, I would see that out
of swap function is now there as a commit in the master
branch because I merged those commits into that particular branch. Any questions on how that works? And so merging and having branches
is a very, very powerful tool. And I would highly recommend it when
you're working on your final projects. Because if you want to kind
of be a little bit ambitious and potentially test
new changes to the code, this can be a good way of
making sure that you still hold on to the original
while still allowing yourself the creative freedom to experiment, and
make changes, and mess with the stuff that you've already written. All right, and last thing
I'll kind of briefly touch on but won't do a demonstration of
something called pull requests. This happens very frequently in
open source projects, especially. But if you've made a change to a
repository, either in a separate branch or potentially in a fork, like I
mentioned earlier, where a fork is just kind of your version of
someone else's repository, sometimes you may want to request
to kind of merge those changes back into the original version. And so this would be when
you would submit a pull request, as the terminology goes. And so if you hear that,
know that all that means is that you've made
changes to some repository, either in a different branch, or in a
different forked repository altogether, and you would like to
then kind of merge it back into whatever the original version was. And this is typically
done via a pull request. And GitHub has functionality built
into it to allow for pull requests to happen and to allow for whoever owns
the repository to kind of review pull requests, look at the changes
that people have made, and either decide to approve
or reject those changes. So once again, Git is
a very valuable tool that helps you keep track
of different changes your code, makes sure different
collaborators can work together on the same repository, makes
sure you can be ambitious and test new changes without losing the
original copy of your code, and also allows you to, if
you ever do make a mistake, to go back to a previous version. So as long as you are kind of frequently
making commits, saving the work that you're doing, this can
be a very, very valuable tool for keeping track of the
different versions of your code and making sure that your
project is under control. I'll take any questions now, but
that's what I had for you today. All good? All right, fantastic
thank you both for coming. AUDIENCE: Oh, question. [INAUDIBLE] SPEAKER: Oh, yeah. So submit 50 is-- OK, let me make
sure I'm remembering this correctly. Submit 50 is, basically
what that's happening is, every time you submit 50 something,
you are submitting kind of a new branch to your submit 50 repository. So when you type in
something like submit 50 p set 7, what was happening
is, behind the scenes, we were creating a new
branch called p set 7. And we were kind of pushing
all of those changes to GitHub as a brand new branch. So if you were ever to go to GitHub.com
slash submit 50, slash your username, that, in itself, is a repository. Each student in the
class has a repository. And within that repository,
there are branches for each of the different times you submit 50. So there's a submit 50 for
Mario, there's a image 50 for 15, there's a submit 50 for the test. And each one of those are
just different branches that are named with whatever
the name of the problem is and the name of the problem
set, or the name of the test. And so whenever you do a Submit 50,
it pushes those to a new branch. And then what we do is we, like,
tag those changes as a new release such that it makes it easy for us to
kind of look at all of the changes that you've made. We didn't go into tagging
and releases in this seminar. But it's just yet another
way of kind of keeping track of different versions of code
and keeping track of different changes to it. AUDIENCE: [INAUDIBLE] SPEAKER: Yeah, yeah. That's typically what
it would be used for. Exactly. And so when you submit
something, that's kind of our semantic equivalent of saying
that you've now supposedly gotten your problem set working, and this
is the version that you want graded. And if so, we'll tag those. That's kind of the way it works. Good question, though. OK, thank you so much.