Hi, everyone, welcome. In this video we are
going to learn about Git and GitHub, why they are important and also how to use them. So we're going
to start off going over the terms and concepts that you will use in git, and the ecosystem
and then get into practical applications. This tutorial will include everything from basic Git
repositories, to what is GitHub, to some more intermediate concepts like branching and merging
and forking and that kind of stuff. I want to quickly introduce myself, my name is Gwen. And
I run a YouTube channel called Faraday Academy, where I upload coding tutorial videos. And
I also do a couple of live streams a week, mostly on Python and JavaScript topics, as well
as some more general purpose coding videos. You can also find me on Twitter, and Instagram and
pretty much everywhere by typing in Gwen Faraday. And let's get started with the tutorial. I want
to start off here by defining what Git is. Git is what we call a version control system that is free
and open source. And it's the most widely used version control system in development. Today, most
programmers interact with Git on a daily basis. So what is version control? version control is
basically a way that we as programmers track our code changes, we basically save an initial version
of our code into Git. And then when we update code, we can save it into Git again, and again and
again and again. And throughout time as our code continues to change, we can look back at all of
the changes we have made over time. This helps us to see and understand what we did when, as well as
track down bugs, or go back to a previous version of the code if we need to. So let's look at some
of the terms that you're going to see in this video. First of all, I use the term directory,
which is also known as a folder on your computer. When I reference the terminal or command line, I
basically mean an application that runs on your computer, which is just an interface where you
can type in text commands, you can navigate around files and folders, create files, change update
things, install and run programs, and much more. You might also hear me use the term COI, which
is just the command line interface. Many programs that you install, as a programmer will require
you to interact with them via text commands in the command line. So you will be typing out
some text and hitting Enter instead of say double clicking on a folder icon on your desktop.
Just think of it as another way to run a program. Now you might be wondering, why are we going to
use the terminal or command line instead of using one of these beautiful applications that handle
interacting with get for us? Well, as programmers, it's always good to use the terminal. So you learn
the Git commands in workflow of Git as well as become accustomed to it. As a developer, you are
going to be using the terminal a lot to install, see allies run programs, search for things,
etc. Throughout your development career. And learning Git is a great way to get started with
the command line. CD stands for change directory, it's basically the same thing as when you double
click on a folder using the icons on your desktop. While in the command line, if you want to move
into a folder, or even up to a parent folder, you'll use CD, followed by the directions
to get to whatever folder on your system you want to get to. A code editor, of course
is a place to write code. You'll probably see this in a lot of different programming videos.
But just in case you are unfamiliar with it, you can write code anywhere in a text document,
word processor anything. But there are special ones that are designed with lots of tools and
features for programmers. And these are called code editors. Now some people get confused by the
word repository because it has multiple meanings. But in the world of programming, it usually refers
to a git repository, which is basically just your project or the folder place where your project
is kept. You can call it a repository. People also sometimes confuse Git and GitHub. Now Git
is the tool that tracks the changes in your code over time. GitHub is a website where you host all
of your Git repositories. Being online, it makes it easy to work in groups with other people, and
organize your projects into a portfolio for you to show potential employers. So here are some of the
Git commands, we're going to cover in this video, which you will be typing into your terminal or
command line on your computer. They are clone, for example, if there's a repository that is not
on your local machine, but it's on GitHub, and you want to bring it down on your local machine, so
you can use it locally, you use the clone command. By the way, all of these commands are lowercase,
not uppercase, as we're going to see, as we go through the examples in this video, when you have
updated files, or created or deleted files and folders, you're going to want to tell get that you
made changes and that you would like Git to track those changes. So you use the Add command for
that. As I said earlier, Git is there for you to save the changes you make in your code. So you do
that through a commit, and we call it committing your changes. Once you have made changes locally
on your computer, and you're ready to put them in git, you tell Git to track them through the Add
command, you save your files to get through the commit command. And then you upload your files
to a place like GitHub, or another what we call remote repository, or GitHub alternative, like
Bitbucket, get lab, and there's many of them, you do this through the push command. When there
are changes to your code on GitHub, and you want to bring those to your local machine, then you use
the pull command, you pull down changes from the remote repository. Those are all the commands
that I want to cover. To get started. Again, we're going to go over examples of each of these.
The first thing you will need to do is of course, sign up for an account on GitHub. This is pretty
straightforward. You enter minimal information, and then you sign up for an account, you will get
an email that will ask you to verify and then you can log into your account. When you log in, you
will either be on this page, which is your profile page that you can access from this drop down menu,
or you might be on the dashboard page here. Either way, you will have access to this green button
here, or this plus sign and the drop down here where you can create a new repository. Now a
repository is basically a project. It's all of your coding files and folders for whatever kind
of application that you're building. For example, this is a repository that I have, it's for
a curriculum app that I've been building, you can see the mockups pretty straightforward
application. And in this repository, this is my complete project with the folders and all of my
coding files are inside of these folders. For this one application, each application or project
is in a separate repository. So I'm going to go ahead and create a new repository here, give it a
name demo repo. By the way repo is just short for repository. I'm going to leave these settings as
they are and click Create repository. Now you can create your files and folders for this repository
locally on your machine. Or you can create them straight in the online editor on the GitHub
website. So I'm going to go ahead and create a basic markdown file called a readme. And this is
the most basic file that you will find in almost every project that contains text to describe
what the project is about what it does, and any other relevant information. So I'm going to
click here, create a new file, I'm going to name it readme.md for markdown. markdown is basically
an easy way to format your text in these sort of files. So I'm going to come down here and type
some text. Now markdown has all the shortcuts like one hash tag for a main header. So I'm just
going to put demo here and then some plain text, so I'll put some description. And then I'll scroll
to the bottom to commit the file. In other words, save this file. I just want to point out really
quickly that this create readme.md is placeholder text. But if you don't write anything else here,
and when I commit this, it will use this text as the default. So let me commit. And you can see
here that this is the commit message from when I saved this README file. And now you can see the
readme file, which because it's named README, dot MD is the default file that GitHub always
shows down here. I can also go into the file here, which is the same thing, except with a few
different options here. And in either screen, I have this edit this file option. So I'm going to
go ahead and do that. I'm going to simply change this to an exclamation point. Now the default
text instead of create readme.md is now update readme.md, which isn't that descriptive, but it's
okay for right now. So I'm going to commit, and by committing, I saved my changes here. And if I go
to the demo repo, it shows my last commit message here as update readme.md. Now, if I want to see
my entire history of changes, in other words, every commit that I've made, I can come here to
commits. And each commit has a unique identifier. And I can also see the message or the title that
I wrote on these commits, I can come back to this one and see what was added this green with the
plus signs means these lines were added to this file. And then I'll go back, and in the updated
commit, it shows me this red with a minus sign, that means this line was deleted, and then the
green with the plus means this line was added, anything that's white means it stayed the same.
So this is a very basic view of seeing changes. Now what about using this on your local machine,
if you are using a Mac or Linux operating system, you should already have Git installed. You can
check this by opening your terminal or command line application and typing in get space dash
dash version. If Git is not already installed, I highly recommend checking out this tutorial by
Atlassian, which I will link in the description below. It walks you through how to install Git
on any operating system. Now I do want to note for the Windows installation, when you download
the get Windows Installer, I recommend you choose the Git Bash option from the install menu. You
can of course use Command Prompt and it will set up get in command prompt for you. But in the past,
I've had an easier time with Git Bash on Windows. for Mac, it gives you a few different options
for install. But I highly recommend you use the homebrew package manager if you can. And it takes
you through all of the steps here. But again, you probably already have Git installed if
you're using a Mac or Linux and don't need to worry about this. There's just one more piece
of setup before we continue with the rest of the Git tutorial. And that is getting a code editor.
Of course, you can write code in whatever you want. Any type of word processing software we'll
do from Notepad, Microsoft Word, but there are specific ones may for coding, and many of them are
really good and free. Visual Studio code is a free code editor made by Microsoft is widely used with
people learning to code and professionals alike. So you can install it for free from code dot
visual studio.com. It's available on every major operating system, Mac, Windows and Linux. Now
I have Visual Studio Code open with no files or folders inside. If you haven't used this before,
then all of these icons on the side are how you're going to navigate around your project and use your
tools. So I'm going to come to this top one. And this bar comes out where I'm going to see all my
files and folders, I'm just going to open a folder real quick. In this test folder, when you go to
my git, then this is an empty folder that I have, I'm going to click Open. And now I have a folder
that's open in Visual Studio code that I can actually add files and folders to but I'm not
going to right now because I'm actually going to pull the repo that we created at the beginning
of this tutorial here on GitHub, I'm going to pull that to my local system using Git. So in Visual
Studio code, I have access to a terminal from here that I'm going to use. If I come up to the top, in
the View menu, I'm going to come to terminal and select it. And now it opens this terminal here.
By the way, the only reason why this is good is because my folder is named Git. And because I've
opened the folder here, it automatically uses that as the directory for my terminal. So now I
want to clone down my repo to my local machine. I want to pull all that code down here so I can
work with it locally. I'm going to use a command called git clone. And then in clone or download
here, clone with SSH Exactly what we just set up. So I'm going to copy this, go back to my terminal
and paste. And I'll hit Enter. And now we can see a folder here, which is my repo from GitHub that's
pulled down into the directory that I'm in. So I'm going to move inside this folder real quick from
the command line, which I can just do by CD, and then the name of the folder to change directory
into the folder. So now I am inside of the folder demo repo, which was the name of the repository
we created on GitHub. So when it pulled it down, it gave the folder this name, so my whole
repositories inside of that folder, and now it says Git master. Now, this may look different
on your machine, this part looks different on every machine. I have a specific setup to make it
look like this. But either way, you will probably see some kind of indication that you are in a
git repository now. Now, how do you know this looks like a regular folder and a regular README
file? Well, there's actually a hidden folder that you can't see here. And that you won't see on
most operating systems unless you have selected to show hidden folders. And that is called the
dot get directory. So there's just a special command in my terminal that I will use to show you
that folder. Now the LA command that I use here is actually a Mac shorthand for ls space, dash l
A, which means list everything in the directory, including hidden files and folders. So if you're
not on a Mac, I don't think la will work for you. But you can use ls space dash LA to do the same
thing. So you can see, here's the readme file, and then there's something dot Git. And because it's
blue here, that means it's actually a folder. And this hidden Git folder, actually stores all of the
files that save your commits, or your code changes over time. It has all of the changes recorded in
the history of this repository, which includes the ones we made on github.com. So now let's make some
more locally, we're going to go into the readme file, and come here and add a sub header. Not too
creative, I'm just going to call it sub header, and then some more text. Now that I have changed
this file, I need to save the changes in Git. So I do that through a commit still. So first, I'm
going to use the git status command. Now the git status command shows me all of the files that were
updated or created or deleted, but haven't been saved in a commit yet. So for example, if I come
here, and I create a new file, I'm going to call this index dot HTML. And I'm just going to put a
quick div inside with nothing else. And now let me rerun the git status command. And now you can see
I have one file that's been modified. And one file that it says is untracked, meaning Git doesn't
know about this file yet. So you have to tell Git to track the file before you can save it to get
to do that, you need to use the git add command, and then tell it which files to track. Now most of
the time, or a lot of the time you see people use a period, which means you're telling Git to track
all of the files that are listed here, in both the untracked and the modified section. So both
the changes we made to read me and the new file index dot HTML would be staged with Git if we did
git add period, because includes all of the files, you could also optionally tell it just the names
of each individual file or folder that you want Git to track. In this case, I'm just going to use
the dot. Now I'm going to use git status again. And now you can see that all of the changes have
been tracked. That's why they show up differently now, and they are ready to be committed. So I'm
going to come here and do git commit dash m. now dash M is for message. And you need to have a
message in order to commit your files. The message could be one character in meaningless if you want,
but there needs to be a message. And ideally, that message should have something to do with the
what and why behind the commit you're making. So I'm going to add a message here. Added index dot
HTML. And this is just the title of the message. If you remember from the web interface, there
were two boxes, a title and a description. This first dash M and what's inside of the quotes
is a message You can add a second one for the description box. So I can say some description.
And I'll click Enter. And now it gives me some information, two files change five insertions.
But we've still only saved our code locally. The commit isn't live on GitHub yet. We make it live
by using another Git command called git push, which means I want to push this live to a
remote repository where my project is hosted. In order to push them to GitHub under your
account, you're going to have to prove to GitHub that you are the owner of your account.
So you have to connect your local machine to your GitHub account somehow. The way this is
done is by using SSH keys, you need to start by generating a key locally using the SSH key Gen
command, then you specify the type of encryption, and then the strength of encryption. And at
the end, you need to include your GitHub email address, this is just a test for me, because I
already have key set up. So I'm just going to put a fake email address. But make sure that the
email address you enter here is the same one you use to log into your GitHub account, click Enter.
Now, the default file for the SSH key is inside your user directory in the dot SSH directory, and
it will be called ID underscore RSA. I'm going to give it a different name here, because I already
have a key under that name. You can optionally enter a passphrase for your key here, or leave
it blank. So I'm just going to click Enter to leave it blank. And my key has been generated.
Now I am going to search for the key that I just generated. And now I find that there are two. So
there's test key and test key dot pub. So test key dot pub is the key that you're going to upload to
your GitHub interface. pub stands for public, it's called your public key, which means that it's okay
for other people to see this key. The key that was generated without the dot pub extension is called
your private key, and is the one that you have to keep secure on your local machine, you don't share
this key with anybody. How it works is that the public key you put on GitHub, and then every time
you want to connect to GitHub or push your code on GitHub or use your account via your local machine,
you use your private key to show GitHub, that you are the one that generated this public key. It's
a mathematical proof that only this private key could have generated this public key. I'm going
to print out this public key. And your key should look something like this SSH dash, RSA starts with
this, it has a bunch of characters in the middle and it ends with your email. Now you need to copy
this whole key, which you can do by highlighting it in your terminal or command line, which
automatically copies it, you don't need to do Ctrl or Command C, because Ctrl C actually means
something completely different in the terminal, not copy. There's also a terminal command that
allows you to copy it's called PB copy. And then you do the less than symbol and then the path to
your file. So it's in our user home directory. And I didn't actually push it, put it in the dot
SSH directory, but this is the directory you would have your key in. And then it's just test key
dot pub. And now it's copied to my clipboard on GitHub. I'm going to go to Settings. And in the
list of all settings, I'm going to go to SSH and GPG keys, and you can see any SSH keys associated
with your account. Then you just click on new SSH key, you can give it whatever title you want.
This is just for your reference. And then you paste your key in here. And I'm going to remove
the extra enter at the end. And now add SSH key to confirm my password. And now you can see
my key was successfully added. The only thing left to do is to make sure that your local Git
command line interface knows about the key you just generated. And I'm going to link all of these
steps in the description below. You need to start the SSH agent. Then if you're using version 10
point 12.2 or later, you will need to modify this file your SSH config and add this text to it. I'm
going to just show you how to get into that file. Now. Paste the location of the file in your SSH
directory and then anywhere in this file, perhaps at the end, you can paste in that information.
I'm not going to do that because I already have my file set up So I'm going to delete it. After
you do that, you'll run this SSH add command from your terminal. And then your key will be set up to
work with Git. Again, all of the information that I covered with keys here is going to be linked in
the description below. But this is the general way that you will do it with any operating system,
although there might be some slight variations. Now there are two more arguments we have to put
here. The first one is origin. And the second one is master. Now origin is an option set for us
here, and is basically a word that stands for the location of our Git repository. Master is the
branch that we want to push to. And we'll get into what that means in a minute. When I click Enter,
and now I'll refresh this page. And you can see my code changes are all live on GitHub. Now, you can
also see that there are three commits to that we made online on github.com, and one that we made
locally and pushed up to github.com. Of course, this was our commit message that we made locally.
And this was the description that we wrote, after that second dash m, we can see all of our
file changes that we made locally here as well. So this was to demonstrate how to create a new
Git repository using GitHub. But what about if you start a repo locally, so let me exit out
of these. And I will create a new folder here called demo repo to drag it outside. So now it's
in a completely separate folder from the other Git repository that we have. But this one's
not a git repository yet, and nothing's in there. So I'm going to move into that folder in
the terminal. Demo two. So now I'm in demo two, you can see it's not a git repository. Even if I
look for that hidden Git folder, it's not there. So let me first add a file in here. And I'm
again, going to add a readme file that MD and I'm going to add a header demo to and some text.
Now, if I want to turn this into a git repository, I can use the command line and say Git init. And
it says initialize Git repository in yada yada, this folder, and now you can see I have the
get keyword there. And if I do get status, I can see there's this untracked README file, I
will go ahead and add that file, either with the period or the name of the file. git status again,
okay, so the file is ready to be committed. And now I will do git commit dash m, created README.
And now I'll put a description here, and Enter. Now what if I want to push this live? Let's try
git push origin master. And now you can see it's giving me this error fatal origin does not appear
to be a git repository. Because we didn't clone this down from a git repository. We didn't already
create this repo on GitHub, we created it locally. So Git is saying I have no idea where to push this
to because it's not connected to anything. So we have to create that connection. And first, the
easiest way to do this is by creating an empty Git repository up on GitHub. So I'm going to come
here, create new repository, I'm going to call this demo repo to don't need a description, going
to leave all this here. Now I have another empty repository. So to start pushing here, I'm going
to copy this and say Git remote, now remote mean somewhere else, but not on this computer. We're
going to use this to add a reference to the remote repository on GitHub. And then I'm going to say
add origin and paste that link that I copied. And I can check that by saying Git remote dash V,
and it shows any remote repositories that I've connected to this repo. Now that these are set up.
I can now use git push origin, Master just as I did before. Now, there's a shortcut here, because
if I don't want to type out this whole thing, every time in the future, I can just use git push,
but I have to set something called an upstream, meaning this is where I want to push it to
by default. So I'm going to do dash u for set upstream and then enter In the future, I can just
use git push without typing out origin Master, it says to GitHub looks like everything was
pushed just fine, I will refresh this page, and I can see the readme that I just added. So
that's how you initialize a repository locally and push it to a remote location like GitHub. So let's
review the workflows that we've gone over so far, and compare the flow of adding code in the
GitHub interface versus writing it locally. So when we first started working in the GitHub
interface, we wrote some code in the readme, and then we committed our changes we saved them
to get now notice, there wasn't an added step here. And we never did a git add to stage changes.
Well, that's because GitHub handles that for us. So really, by committing in GitHub, we are adding
and committing at the same time. And then that was it really, because it was our repository, we
had full access to change whatever we wanted, we could just update the code just by committing
it in the GitHub interface. Of course, we didn't have to push the code because it was already live
on GitHub. There's no other remote repository, because it's already in the remote repository.
Now, if we didn't own the repository, or we didn't have access rights, or we needed other people
to review our code, before we merged it in with all the rest of the code, then we would also have
to take the extra step of making a pull request, which is something we're going to cover later
in this video. So let's compare this workflow if we're just writing code on GitHub, versus doing
it locally, and then pushing it up to GitHub. So luckily, in our text editor, we wrote the code.
And then we had to do git add to let get know about the changes. And then we saved them to get
using the git commit command. And then we push them to the remote repository on GitHub, using the
git push command, and that updated GitHub source code or the code in the GitHub repository with our
changes that were made locally. And then just like before, if we didn't have access rights, or we
needed a code review, before we merge changes in, we'll need to make a pull request. So these two
methods cover the most basic ways to use Git, by using the GitHub web interface and then doing
it locally. If you have any questions about this, then please leave them in the comments below.
Otherwise, let's move on to Git branching. Let's first go over some of the concepts
of branching, and then we'll dive into a practical example. Now, what is Git branching?
You seen in our examples that we're on something called the master branch. Now master is a naming
convention for the main or the default branch in a repository. So if you're just working off of one
branch, that's where your code will live, and all your code, all your commits, everything will be
in that one branch. Now, this is called branching, because it starts to look more like a tree when
you have multiple branches. So we saw earlier that we had a master branch, we were committing
to that master branch. But we could also make another branch. We'll call it feature branch. So
let's talk about what happens when we create a new branch. At first, the code on master and this
new feature branch will be exactly the same. But as you make updates to the feature branch, those
changes are only seen in the feature branch. So if you make changes on the feature branch, you make
a commit to save those changes on to that branch. And then you switch back to the master branch, you
won't be able to see any of the changes that you made on that feature branch. Each individual
branch has no way of knowing what commits or what changes have been made to any other branch.
Each branch is only keeping track of what changes are made on its own branch. Now you can continue
to change the code on master branch and save it through a commit to the master branch. And then if
you switch back to the feature branch, likewise, you will not be able to see the changes that you
just saved to master. Why is this useful? It's extremely useful because you will be building out
new features to applications that may break your code or they are not finished yet. And you don't
want to save them to the main master branch. You want to work on them in kind of a sandbox area. So
you can write all the code unit And get it correct and in the state that you want, before you merge
it back into the main branch of the code base. And this is really helpful when you have many
different people working in the same repository, or a lot of different branches going on at
once. One very common thing that you'll see in development is that you'll be working on let's
say, this feature branch for a week or more, and you have all of these changes that you've made.
And then you find out there's this major bug that you have to fix real quick. So for that, we make
this other branch called a hotfix branch here, represented by yellow. And you can see that I made
the change in one commit to fix whatever bug was wrong with the code on its own branch, I made sure
it was working correctly. And then I merged it back into the master branch. Now that we've gone
over the concepts of branching, let's dive into the command line and try it out. And now I'm using
a full screen terminal just so I have more space as I'm running different Git commands that are
going to take up more screen space to show you, but it works the exact same way as the terminal
inside of VS code. So I'm back in my terminal inside of my demo repo again. And you can see here
I have information about my git branch. Again, you might see this presented in different ways
it shows you're on the master branch. If I type in git branch, you can see that I currently only
have one branch and its master. And you can also see there's a star beside it. And that means that
I am currently on that branch. So I'm going to hit the letter Q here to get out of that. And now I'm
going to create a new branch. So I do that with git checkout. And git checkout is what you will
use to switch between branches. But to tell it to create a new branch, use dash B, and then you
give it the name of your branch. So in this case, I'm going to call it feature. Now if you're
working in real application with people, you want to make this name as descriptive as possible. Some
people like to use feature slash the ticket number or description, or you can use hyphen. And then
you could give it the issue number, like if it's a GitHub issue number 11, or whatever convention
you want to use. And then you can make this longer if you want and put some more details. I'm going
to call this feature dash README instructions, because I'm just going to be updating a section
of the readme. Click enter. And now it says I switched to a new branch, meaning I created this
new branch called feature README instructions. And now you see that my branch changed. So now if I
do git branch, again, I have two branches listed here, and the top one is starred and highlighted.
So it shows me which branch I'm currently on, I'm going to hit Q. And like I mentioned, git
checkout, will switch between branches. So now that I am on this feature reading instructions, I
can check out master. And now you see I switch to master. I'll do git branch shows them on master
now. And I will do another git checkout feature, README instructions, you see that I hit the tab
button, and it autofill the rest of the branch. So I didn't have to type out the whole long name,
you can also hit tab. Even if you don't start at the beginning, like in this case, I started
typing feature and then hit tab. But I could actually start typing instructions and hit tab
and it's still autocompletes. Now this is very useful. Because eventually, when you work in
a repo, you're going to start a lot of stuff with feature or with bug or hotfix or whatever.
So only your last few words will be unique. So that's just something useful to know. So now I'm
back on the feature README instructions branch, and I'm going to make some changes on this branch.
So I'm in my code here, I'm going to come into my README and make a new section. I'm going to say
just local development or something and then give it one step other than say open index dot
HTML in your browser, just as a demo. Alright, I save that. And you can see in VS code, it gives
me this m here meaning it's been modified. since I've last checked this into get. That's kind of
a nice feature to have to see which files you've added and which files you've modified right in
your text editor. Alright, now that I've modified some files, Here, I'm going to do the git status
command again. And it says I modified README. So first, I'm going to save things that have changed
on this branch. So I'm going to do the git add command. And I'm just going to stage the readme
changes. And now I will do a git commit, dash m, and say, A, oops, I have to put that in quotes. So
updated. README. Okay, so you can see I have one file changed for insertions. So now it's saved
to get, but it's only saved on this feature, README instructions branch. So if I do a git
checkout Master, come back to my code. And you can see the changes aren't here, because they're only
on that other branch. Now, if I want to here, I can go ahead and merge these two branches locally,
using the Git merge command. But before I do that, I just want to double check and see the code that
emerging in which I can do through the git diff command. Now, diff, or diffing, shows me what
changes have been made, it compares two versions of the code and shows me all of the lines that
have been changed. And you kind of saw this in the Git interface, because you saw a nice visual
representation of the diff, where it showed in green with a plus sign the lines that had been
added, and then in red with the minus sign the lines that had been removed. And let me say git
diff, and the name of the branch, hit Enter. And now you can see, it shows which file it's
talking about this readme.md file. And in white, it shows text that was already been there, that
hasn't been changed. And then it shows that my master branch doesn't have some of the changes
that are in my other branch. So I'm going to hit q here to get out of this. Alright, now I could go
ahead and like I said, use the Git merge command, passed in the branch, and it'll merge in those
changes. But the more common pattern that you are going to see is pushing these changes on that
branch up to GitHub, and then making a PR, so I'm going to change back to the feature branch, and
now do git status. And it says I have no changes to commit, because they've already been committed.
But I do need to push them up to GitHub. So let me run git push. And now you can see, since I'm on a
new branch, it says that I need to tell it which branch on GitHub I want to push to. Now the answer
is almost always that the branch will be named the same thing on GitHub, and on your local machine.
So I could copy this line. And now you'll notice this set upstream flag here is the same thing
that we were doing before with the dash U. It's just shorthand for set upstream. So I'm going to
hit enter here. And now it's pushed up to GitHub. And it's even giving me a hint for how to create
a pull request on GitHub, by giving me these instructions here. So what is a pull request or
a PR, it's basically a request to have your code pulled into another branch. In the example we're
using today, we have a feature branch, and we want to have our code pulled into the master branch. So
we make a PR from the feature branch to the master branch. Now once we have made a PR, anyone can
review our code, comment on it, ask us to make changes or updates. Now, after you make a PR, you
can also update the code just by making additional commits and pushing them up to GitHub, as long as
it's on the same branch that you're making the PR with. Once the PR is merged, you'll generally
delete your feature or source branch. And to switch back to the master branch. Then when
you want to make additional coding changes, you will create another new branch and start the
process over make your commits, make a PR and then merge again. And I could go straight to this URL,
but I'm going to show you how to do it manually on GitHub first. So I look at my GitHub interface.
And you can see already GitHub picked up on the fact that I just pushed a new branch. So now it's
asking me right here if I want to compare this new branch to another branch and create a pull
request, and it takes me to this screen here. Now sometimes this is confusing for people which
branch is being merged into which branch This GitHub interface does a pretty good job because
of the arrow. So you can see that the branch you're comparing this feature, README instructions
will be merged into the base. So there's always a base branch where all the code is going to get
merged into. And then there's the branch you're comparing. So now I have this message, I have
a title, it says updated README. And I can put some more description here. So usually, I'm going
to put a list of the changes that I've made and maybe some description as to why I made certain
decisions. So here, I'm just going to say added section about local development to the readme,
and I will create a pull request. Now that I've created a pull request, I can actually come here
in the interface, I can see any comments that people have made on the pull request, or I can
write more comments of my own, I can look through all the commits I've made that I'm trying to merge
into master right now. And I can also look at all the files that have been changed, and see the diff
of what's been added, removed or updated. Another thing I can do right here is if I want to make a
comment about a particular line of code that I've written, I can press the plus button, this blue
plus button. And now I can make a comment there, I'm just going to say, add a new sub header and
add it as a single comment. And you can see that the comment appears at the line of code where you
hit the plus button. This is a really nice way if there are multiple people working on a repository
to make comments about specific lines of code. And then usually the person who created this PR will
reply to them with an explanation or make another commit, if changes need to be made to the code
or something. Alright, so I'm going to go ahead and merge this PR. And you'll notice that I added
the single comment, it says resolve. Now because I'm the owner, here I have full permissions, I
don't have to resolve I can still merge the PR, if you don't have permissions or your repo set up
in a certain way, then you might have to resolve comments before you can merge. Anyway, I'm just
going to merge here, confirm and merge successful. Now that the PR is merged, I'm going to go over
to the code. And if I scroll down, you can see that I am on the master branch. And my changes
are also here. So the branch was successfully merged. So locally, now I'm going to switch to
the master branch. And if you look at the code, the changes aren't there yet. And that's because
they are only on GitHub, and I need to pull them down to my local environment. So to get the
changes on my local master branch from origin, I'm going to do Git pull. Now, if I didn't already
set the upstream, I would have to do Git pull origin master. But I already have an upstream
set here. So I'm just going to do Git pull, and then enter. And you can see one file changed
for insertions. And now if I look at my code, I can see my local master has also been updated
with the changes from the branch. And now that I am done with that feature branch, I'm going to do
git branch. And it's still there, even though I'm not going to be using it again, because you don't
really reuse branches that you've already merged into your master branch. So I'm going to go ahead
and delete this branch. So I'm going to do git branch, dash D, and then the name of the branch.
And again, I can tab over. So I'll hit Enter. And now it says I deleted that branch. So now if
I do git branch, and I only have master again, alright, well, that's all fine and great and works
well. But in real life, you're not always going to have such an easy time merging. There's something
called merge conflicts in git, where basically, you're building your own code writing a bunch of
code on your own branch. Maybe other people are writing code on their branches. And master is
getting updated from multiple different places. So it's possible for multiple people to change
the same files. And so sometimes Git doesn't know which code you want to keep, or which code is
redundant, or which code you want to get rid of. So you'll have to manually do that. Let's try that
out. Let me create another branch. I'm going to do git checkout dash B. And then I'm just going to
call this quick test. Alright, I'm on the quick test branch. Now I'm going to come into index dot
HTML. And I'm going to add a p tag here, and say world. And P. Alright, so I modified this file,
let me go ahead and do git status, it's always a good idea to do git status before you commit
anything looks good. What I can also do from here is do a git diff, enter, and it shows me all of
the changes that I've made since my last commit. So I'm going to hit Q, and now I will commit
these. Now generally, the workflow has been git add, and then file name or period dad, everything
in this directory. This time, there's a shortcut, because we've just modified one file. And the file
has already been committed to get in the past, which is why it says modified and not created.
So what I'm going to do is git commit. And then instead of dash m, I'm going to do dash A, which
stands for ad and M at the same time for message, then I'm going to put my commit message. So this
basically adds and commits at the same time. But it only works for modified files, not for newly
created files. Because if it's newly created, you have to stage that with Git and let get know
about it first. For my message, I'll just say added world. Okay, and now I have one file changed
to insertions. Now let me go to my master branch git checkout Master, you can see I don't have the
changes from my other branch there. But what if I updated the same line, so on Master, now I'm
updating line two. And here I'm going to put there so hello there. So now master has aligned to
but the new branch I created also has aligned to now everything is fine. Now because both branches
are separate. But what if I try to merge these two together, whose line two is going to be put there.
So let's try that. I'm going to go to my quick test branch. So I'm going to do git checkout.
quick test. And now it's actually giving me an error and not letting me change branches. Because
I have local changes that line to that I added in Master, it says it's going to be overwritten if
I change branches. So it's asking me to commit before I change, so that way that line two will
be saved to get in the master branch, and won't be lost when I change branches. Now stashing is
a little bit beyond the scope of this tutorial. But it's basically a way for you to stash your
changes somewhere. And then you can retrieve them later. But it's not making a commit to get.
It's like a temporary holding place. So we're not going to do that, I'm just going to go ahead and
commit. So let me do git status first. All right, and I'm going to use the shorthand because I only
have the modified file there. So I'm going to do git commit dash AM, and then a commit message,
I'm going to say added there. And now I should be able to check out and press the up arrow
key, I should be able to check out this quick test branch. And before I merge master into
this branch, I'm going to diff against master real quick. And it shows me the changes here. So
now I'm going to do merge, Master. So remember how I said before that merging locally wasn't
the regular pattern. While it isn't for merging branches into master. But Master gets updated as
you go along as you're working on your project, because maybe other people are merging into master
and you don't have those changes in your branch. But you don't want to get too far behind the
master as you're working because then it's going to be really difficult to merge later. So
as changes are made to master in the GitHub repo, you're going to want to pull those down to your
local master branch. And then whatever feature branch you're working off of like quick test here,
you'll want to use Git merge master to keep your branch up to date with what's going on in master.
So that's what we're doing here. Git merge Master, hit Enter. And now it says we have a conflict.
So we have a merge conflict in index dot HTML. So there are a couple of ways to fix merge conflicts.
interfaces like GitHub, give you an interface to fix them. You can also fix it in the terminal.
But the easiest way to fix merge conflicts is directly in your code. A nice code editor like vi
code will let you click buttons like accept the current change or accept incoming or take both
of these. But you can also come in here, make the changes that you want and delete these lines
that get added this, let's get know that there's a conflict. And first between this head and these
equal signs, it shows the code that we have on the current branch that we are on. And then it shows
the code coming from the other branch that we're trying to merge in. So in this case, I am just
going to delete these lines and save both of the changes. But in this case, one, two, line two and
one, two, line three. And this is just letting get know what we want to do, because it didn't know
how to handle the conflict. Now we have handled it and deleted the conflict markers, we can now look
here and see that we need to make another commit, even though it seems like we are adding and
subtracting the same things, we basically need to make a commit because we have fixed the
merge conflicts. So I'm going to say here, git commit dash a m, and I can say merged in Master,
or updated with Master or something like that. And now I've officially updated my branch with the
changes that have been happening on master branch, and I can continue coding whatever feature bug fix
or whatever I'm doing on this quick test branch. So what if we make a mistake? What if we
accidentally add something or commit something to get, and we didn't mean to do it, we can actually
undo our stages or our commits. So let me come to read me, I'm going to add another line here. And
say, have fun. Okay, so I've made a change here on line 12. And back in my demo rebill, I'm going to
do git status. So now let's say I want to git add this README. And let me do git status again, and
you can see before is that change is not staged, and now changes to be committed, meaning they've
been staged already. But what if I want to undo staging, what if I didn't mean to stage this
file, I can actually easily undo it by using the Git reset command. So I can either do Git reset
with no arguments, or I can say Git reset, and just the name of the file that I want to onstage.
So here, I'm just gonna do the plain Git reset, and it gives me a list of the files. So unstaged
changes after reset README. Now, if I do another git status, it shows me that this file is no
longer staged. So what if I want to undo a commit, so let me go ahead and add the readme file. And
then I'm going to come and commit, read me, and I'm going to say added install step. Now, if I do
git status, you'll see there's nothing to commit, because all changes have now been committed. Well,
if I made a mistake on that commit, I can use that same Git reset command. And this time, I'm going
to say Git reset head in all caps. And what head means to get is a pointer to the last commit.
So I'm telling it to do something with the last commit. And then I'm going to save till the one,
which is telling Git instead of pointing to this last commit that I just made, right here,
I want you to go back one commit further, and head will now point back one commit further
meaning it will completely undo the commit that I just made. Let me click Enter. And now you
can see it says I unstaged, the changes. So I'm going to say git status. And what happened
was that it unstaged and uncommitted, those last changes. So if I do git diff, you'll see that
Git picks this up as a new change now. Now, if you have many different commits, you might
want to go back to a specific commit or undo multiple commits. And for that there's no quick
pointer in Git like the uppercase head pointer, where you can just look at the last commit or
use that to undo the last commit. But you can see a log of all your commits. And you'll see that
these are arranged in reverse chronological order. So this is the latest commit that we made. And
you can see with the commit message, that's also why it's important to write a good commit message
because it's easier for humans to scroll through and see which commit is which to get these commits
are differentiated with this unique hash here. So if you want to go back to a certain commit, you
can copy one of these hashes. Let's say I want to go back to added world before I added the
there line. So I want to basically undo when I merged this there, from Master into this branch.
So let me copy this commit hash. And by the way, when you see all of these commits, you can scroll
down with spacebar, and now it shows this as the end. So I'll say quit. So I'm going to do Git
reset, and then the hash of that commit. And it's unstaged, any changes made to these files
after this commit. So you can see the changes are still there. I added have fun and this line
three in the index dot HTML, but they are just not saved in Git or stage with Git any longer.
So what if I was just testing something out, and I want to get rid of all of the changes after
a certain point? Well, I can do that by using the Git reset command as well. Let me just grab a
commit hash. So I'm going to go back just a couple of random commits to this commit right here, where
I said updated README, can I hit Q. And now I'm going to do Git reset dash dash hard, meaning I
want all of the changes to not just be unstaged, but to be completely removed. So head is now
pointing to a different commit, because I've undone several commits now. And if I look at my
files, we've just completely gone back in time and erased the latest updates. So those are the basics
of branching, merging, fixing merge conflicts, and undoing staging and commits that you've made.
One more thing that I want to quickly mention is forking, you may have seen this already in
the Git interface, you can hit fork here, and then it's going to make a complete copy of the
repository. Now, why would you want to fork? Well, you probably don't want to fork your own repo
because you already have full access to all of the code here, but you don't for other people's repos.
So let me find just a random repo on GitHub. Okay, so here's view, j, s. So let me click on this. And
I actually don't have access to change anything in this repo. So if I want to make a PR against
this repo, and request for my changes to be added, or if I just want to be able to branch off of the
code in this repo and do whatever I want with it, then I want to fork it. So I'm going to hit the
fork button here and fork it to my user account. These are just groups that I'm a part of on
GitHub. Sometimes it takes a minute to fork over all the code, especially with Vue JS because
it's a large repository. Alright. And now you can see the repo is no longer under the View, j. s
organization. Now it's under my personal GitHub. And now that I've forked this, I have complete
control to make any updates or changes that I want to this code. So if I want to come in to read
me, and hit the pencil, update this, I can say, Hi there. And now I can come to the bottom and commit
changes again. So I can say, updated README or whatever I want, I'm just going to leave it with
the default text, again, commit to the dev branch. So before we worked off the master branch as being
the default branch, but sometimes when you're working in a larger project with other people,
you're going to want to create multiple branches, like master staging, and dev for different kinds
of environments. So in this case, Dev is set to the default branch for this repository, instead
of master. So I'm just going to commit my changes directly to Dev. And you can see my changes here.
Of course, they aren't part of the main view j s view repository, but they're part of the one that
I forked because I forked a complete copy of that repository, including the branches associated with
it. And you can see dev is marked as the default. So now what if I wanted to get my changes back
into this Vue JS repository? Of course I don't, but what if I did, I would go and create a pull
request. So new pull request, and then as my base the place that I want to merge my changes into I
would put the repository that I forked from this Vue JS repository, and the branch and I want to
compare that with My repository that I forked and the branch on my repository that I updated,
of course, I'm not going to click Create pull request, because this is just a demo, I can also
see the diff down here of the changes that have made and what commits I've made to this branch on
my fork. Now, if I want to merge within my fork, I can do that easily. Let's say, of course, there
isn't anything to compare because I'm comparing the same branch here. But I could merge into any
other branch. Let me find master here. So I could merge straight into master. And you can see I
can create pull requests. Now, I created a pull request. And I'm going to create pull request.
And you can see they had a bunch of default text added to the pull request information. But I'm
just going to go ahead and merge. Go back to the code. If I scroll down, of course, I'm on Dev,
it says hi there. And now if I go to master, it also has my changes on master because I merged
them. Generally speaking, after we merge a branch into one of our default branches like Master,
then we would clean up the branch that has just been merged. In other words, we would delete
it from GitHub and from our local machine, because we're not using that branch anymore. But
it's a little bit different when we use branches like Dev, staging and master, because generally,
you're merging your feature branches into either dev or master. And you have Dev and master and
sometimes staging reserved for just merging into so you don't make any changes on Dev and master
themselves. You'll just be merging other branches into dev or Master, depending on how your codebase
is set up. In a large project like Vue js, we would merge all of our feature branches or bug
fixes or whatever into the dev branch and then delete the branch that we just merged in. And then
when all the changes on the dev branch are ready, those get merged into master. But dev never gets
deleted, just like master never gets deleted, those kind of stay around forever. All the other
branches are just temporary. So me having my own fork allows me full rein, full access, full
control of CRUD operations, create, read, update, delete whatever I want to do with all
of this code, all of these files. And if I want to make some major updates, what I'm going to
do is fork the repository, which I already did, pull my fork down to my local machine, make all
the updates that I want to test them out whatever I want to do, I'll push them back up to my fork,
and then I will create a PR against the original repository. Thanks so much for watching. I hope
that you enjoyed this video and that you also got something out of it. If you did, then don't forget
to like the video and subscribe to the Free Code Camp channel. Don't forget to check out my YouTube
channel called Faraday Academy where I do weekly videos and livestreams on Python and JavaScript
and other related programming topics. I would also appreciate if you would leave me a comment
here and let me know what you liked about the video or any other feedback that you might have.
Have a great day and I hope you enjoy using it