git 在切换分支时候不想提交文件,怎么办? git提供了文件储存功能
实际的应用场景是这样:假设你有分支master和develop。master用来release版本,develop用来开发。master上release了版本1,然后develop继续开发。如果你在develop上开发到一半的时候,release的版本1发现了bug。这个时候,你develop分支有未提交的修改,然后你需要切换到master上的版本1进行修复。这个时候切换到master分支,肯定是不需要把develop分支上的修改带过去的。
1. git status 命令 -- 展示工作树状态
当执行 git status 的时候,返回结果大致可分为3个部分:
拟提交的变更:这是已经放入暂存区,准备使用 git commit 命令提交的变更
未暂存的变更:这是工作目录和暂存区快照之间存在差异的文件列表
未跟踪的文件:这类文件对于 Git 系统来说是未知的,也是可以被忽略的
如果在 git status 命令后面加上 --ignored选项,还会列出被忽略的文件。 例如:
$ git status --ignored
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
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)
Untracked files:
(use "git add <file>..." to include in what will be committed)
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
还有一种简洁的输出格式,即添加 --short 选项,例如
$ git status --short
D apple.c
M hello.c
A world.c
AD world_bak.c
?? 123.txt
git status --short 也可以简单写成 git status -s。
这种输出每一行的格式是 XY PATH1 -> PATH2
PATH1 表示最近一次提交的文件, -> PATH2表示索引或工作目录中文件,当文件路径改变时才会有 -> PATH2这一项。
X和Y都是状态码,X表示暂存区和最近一次提交的差异,Y表示工作目录和暂存区的差异。其含义是:
’ ’ = unmodified
M = modified
A = added
D = deleted
R = renamed
C = copied
U = updated but unmerged
默认不会列出被忽略的文件,除非使用 --ignored选项。
X和Y可能的组合如下表(方括号里面的可以没有):
X Y Meaning
-------------------------------------------------
not updated
M [ MD] updated in index
A [ MD] added to index
D deleted from index
R [ MD] renamed in index
C [ MD] copied in index
[MARC] index and work tree matches
[ MARC] M work tree changed since index
[ MARC] D deleted in work tree
[ D] R renamed in work tree
[ D] C copied in work tree
-------------------------------------------------
D D unmerged, both deleted
A U unmerged, added by us
U D unmerged, deleted by them
U A unmerged, added by them
D U unmerged, deleted by us
A A unmerged, both added
U U unmerged, both modified
-------------------------------------------------
? ? untracked
! ! ignored
-------------------------------------------------
当你发生类似上述场景中的问题时,无法切换分支时,Your local changes to the following files would be overwritten by checkout:...,Please commit your changes or stash them before you switch branches。你可以使用git status命令查看当前分支状态。如果你不想提交或不适合提交的话,可以选择使用第二个命令,git stash 保存当前更改。
2. git stash 命令 ---保存现场
使用git stash命令可以保存当前的修改,将工作和暂存区的状态存储起来以备将来使用,并将当前工作区和暂存区重置为最近一次提交后的状态("干净"状态的工作区,暂存区会根据命令参数的不同决定是否重置。)
$ git stash -m"stash测试" -m表示本次贮藏信息 (注意,-m与文本信息之间没有空格)
2.1 默认状态,git stash命令只能将已经跟踪和非.gitignore忽略的文件储藏,未跟踪的文件不会被存储。
使用如下命令可以将未跟踪文件一并存储: git stash push -u (-u是--include-untracked的简略形式)
使用如下命令存储.gitignore忽略的文件:$ git stash push -a
2.2 在默认状态,git stash命令会将工作区和暂存区内容重置为最近一次提交后的内容
使用如下命令保留暂存区不重置:$ git stash push -k (-k是--keep-index简略形式,默认值是--no-keep-index。)
2.3 查看所有贮藏内容 $ git stash list
每个贮藏都会有一个自增长编号,如图中的0和1
2.4 应用储藏内容
$ git stash apply stashIndex
应用指定贮藏区的内容来重置工作区或者暂存区,其中stashIndex 为对应贮藏的编号
默认不重置暂存区,使用--index参数可以实现重置暂存区
$ git stash pop stashIndex
功能同上,区别是会同时删除对应贮藏
2.5 .删除储存内容
$ git stash drop stash@{1} # 删除指定储藏,其中stash@{1}也可直接写成1
$ git stash clear # 删除所有储藏
其他更多用法可参考官方文档说明,不再罗列