WEBVTT
00:00:00.206 --> 00:00:04.616
Git reset is the command that allows you
to shape history in your repository.
00:00:04.616 --> 00:00:07.945
Whether you're undoing some changes
or crafting your commits differently,
00:00:07.945 --> 00:00:09.401
this is the command for you.
00:00:09.651 --> 00:00:11.241
♪ (bossa music) ♪
00:00:14.751 --> 00:00:18.153
Welcome to the episode of Git and GitHub Foundations on the reset command.
00:00:18.538 --> 00:00:21.560
This command has a lot of power,
and a lot of modes.
00:00:21.560 --> 00:00:24.512
Yeah, there's going to be three modes
we're going to be working with here.
00:00:24.512 --> 00:00:28.236
There's going to be soft;
mixed, or the default; and hard.
00:00:28.555 --> 00:00:30.587
♪ (music) ♪
00:00:31.032 --> 00:00:32.921
these adjectives are pretty descriptive,
00:00:33.088 --> 00:00:35.513
starting with the one
that's the default, mixed.
00:00:35.830 --> 00:00:39.648
It alters both the history
and the working directory.
00:00:39.998 --> 00:00:41.708
So mixed, both things.
00:00:41.898 --> 00:00:44.427
And soft is going to take
one or multiple commits
00:00:44.427 --> 00:00:47.179
and put all of their changes
back into the staging area
00:00:47.179 --> 00:00:50.048
to allow you to continue to craft
a new commit out of that.
00:00:50.433 --> 00:00:53.279
Hard, on the other hand,
is a destructive operation
00:00:53.279 --> 00:00:55.893
that's meant to erase things
that you no longer wish to keep.
00:00:56.212 --> 00:00:59.552
So with all three of these in our stable,
00:00:59.552 --> 00:01:01.430
let's look at mixed first.
00:01:03.475 --> 00:01:05.173
Mixed is the recommendation
00:01:05.173 --> 00:01:07.242
that gets most often shown
to new Git users
00:01:07.271 --> 00:01:09.444
because it shows up
in the status command.
00:01:09.609 --> 00:01:12.391
When you have changes in the staging area
and you say git status,
00:01:12.621 --> 00:01:14.493
we see a Git reset head.
00:01:14.493 --> 00:01:17.046
That allows us to take those changes
out of the staging area
00:01:17.046 --> 00:01:18.875
and put them back
into the working directory
00:01:18.875 --> 00:01:20.371
with the mixed option.
00:01:20.672 --> 00:01:23.379
Soft is the way
that I take some changes
00:01:23.379 --> 00:01:25.706
that might have gotten
too granular in nature.
00:01:26.033 --> 00:01:27.869
One, two, three, four, five commits
00:01:27.869 --> 00:01:30.846
that I then realize all belong
in one transaction,
00:01:30.846 --> 00:01:36.907
and to bring them all together
by a git reset --soft HEAD~5
00:01:36.907 --> 00:01:38.610
the most recent five commits.
00:01:38.835 --> 00:01:41.100
So with that command of using soft
00:01:41.100 --> 00:01:42.696
you can take
all five of those commits
00:01:42.696 --> 00:01:46.285
and kind of squash them down
into the staging area as one commit.
00:01:46.665 --> 00:01:48.765
Pretty useful for reshaping history,
00:01:48.765 --> 00:01:51.295
but reshaping history goes
to the far end of the spectrum
00:01:51.295 --> 00:01:54.630
to throw away commits
that just don't add value.
00:01:54.877 --> 00:01:57.748
You don't want to send them,
transmit them, or share them with others.
00:01:57.922 --> 00:01:59.521
That's where hard comes into play.
00:01:59.521 --> 00:02:01.853
If you completely want to throw away
some of your work,
00:02:01.853 --> 00:02:04.710
maybe you're trying out some change
that just didn't work out,
00:02:04.710 --> 00:02:08.061
you can use the git reset --hard
to throw those commits away completely.
00:02:08.606 --> 00:02:11.268
People might ask, then why
would you make a commit?
00:02:11.268 --> 00:02:13.971
But Git provides you
a really nice safety net
00:02:13.971 --> 00:02:17.078
through the reflog command
that we'll look at in a future episode
00:02:17.078 --> 00:02:20.488
that motivates you to make
checkpoints with commits,
00:02:20.488 --> 00:02:22.653
and knowing that you have
hard at your disposal,
00:02:22.653 --> 00:02:25.180
you can clean that history up
anytime you like.
00:02:25.850 --> 00:02:27.464
♪ (music) ♪
00:02:27.760 --> 00:02:32.178
There is one other cousin command
that is often talked about with reset
00:02:32.178 --> 00:02:34.152
and that's the checkout command.
00:02:34.152 --> 00:02:37.702
The checkout command
is of a different granularity than reset,
00:02:37.702 --> 00:02:41.266
which typically operates
on the entire history of a repository.
00:02:41.703 --> 00:02:45.395
Checkout is focused more
on a directory or a file level precision.
00:02:45.756 --> 00:02:49.287
Instead of undoing or changing
an entire commit,
00:02:49.287 --> 00:02:52.710
we can go back in history
to a specific file at a commit
00:02:52.710 --> 00:02:57.297
and pull that file and its version
back to our current working directory.
00:02:57.685 --> 00:03:01.234
Clear communication is the goal
of all Git repository history.
00:03:01.487 --> 00:03:06.022
So whether it's git reset --hard,
reset --soft, reset --mixed,
00:03:06.022 --> 00:03:08.145
or the more precise checkout command,
00:03:08.145 --> 00:03:12.837
use these to provide clear intent
about your changes to your colleagues.
00:03:13.284 --> 00:03:15.976
Git reset is a tool that can be
a little bit intimidating
00:03:15.976 --> 00:03:17.235
to new users of Git.
00:03:17.434 --> 00:03:20.184
But it can be a powerful tool
to have at your disposal
00:03:20.184 --> 00:03:22.473
for crafting beautiful repository history.
00:03:24.181 --> 00:03:28.029
Thanks for watching another episode
of Git and GitHub Foundations on reset.
00:03:28.029 --> 00:03:31.687
As always, don't forget to subscribe
to any of our channels on the side her.
00:03:31.687 --> 00:03:33.811
Questions or comments?
Put those down below
00:03:33.811 --> 00:03:36.401
or check out one
of our other educational topics
00:03:36.401 --> 00:03:38.523
on Git and GitHub
here at the bottom.
00:03:38.789 --> 00:03:40.658
♪ (music) ♪