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) ♪