Git快速入门系列文章
- Git快速入门-安装配置篇
- Git快速入门-常用命令之独奏篇
- Git快速入门-常用命令之交响乐篇
- Git快速入门-git stash 暂存变更,git reset 撤销commit,git revert 回退远程版本库
注:本文基于git version 2.13.5 版本进行演示
1. 概述
Git入门系列第四篇,基于场景,介绍一些非常实用的Git命令,也许这些命令会让你产生“还有这种操作”的感叹。例如如何把修改暂存起来,留着以后使用?想撤销已提交(commit)到本地版本库的代码该怎么办?撤销已push到远程代码库的代码呢?
2. 如何把修改暂存起来,留着以后使用?
2.1 使用场景
实际开发过程中,我们经常会遇到这样的问题,当我们想把远程仓库的最新代码拉下来时,发现git会提示说我们本地做的修改会被覆盖,建议先commit代码或者stash(暂存)代码。你一定遇到过类似下面这样的提示:
$ git pull origin master
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (4/4), done.
From github.com:flysqrlboy/git-command-tutorials
* branch master -> FETCH_HEAD
7dd2e09..d7e1e19 master -> origin/master
Updating 7dd2e09..d7e1e19
error: Your local changes to the following files would be overwritten by merge:
b.txt
Please commit your changes or stash them before you merge.
Aborting
留意下面两句提示,我们可以有两个选择:commit或stash。
error: Your local changes to the following files would be overwritten by merge:
b.txt
Please commit your changes or stash them before you merge.
如果我们本地的代码修改得差不多了,可以选择commit到本地版本库。但如果我们的修改只是个半成品,我们不想把这样的代码留在提交历史里的话。git stash就能派上用场了。
2.2 git stash 暂存进度
先来看下当前的工作区和暂存区状态:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
git status 输出中告诉我们,a.txt 和 b.txt 都有修改,a.txt 已加入到暂存区(在Changes to be committed下面),b.txt 的修改则还在工作区中(在Changes not staged for commit下面)。正是因为远程代码库有人更改了b.txt ,才导致本地拉取代码时提示会被覆盖。这里,用git stash 命令保存当前工作进度。
$ git stash
Saved working directory and index state WIP on master: 7dd2e09 add two files a.txt b.txt
运行git stash 之后,再查看工作区状态,会发现之前工作区和暂存区的修改都不见了。
$ git status
On branch master
nothing to commit, working tree clean
2.3 查看进度
查看stash进度用命令git stash list
$ git stash list
stash@{
0}: WIP on master: 7dd2e09 add<