git status 与 git stash

本文详细介绍了在Git中如何处理切换分支时未提交的更改,避免覆盖问题。通过使用git status检查工作树状态,以及git stash命令保存当前更改,确保在切换分支时保持工作进度。适用于开发人员在多分支开发环境中遇到的常见问题。

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 #  删除所有储藏

其他更多用法可参考官方文档说明,不再罗列

参考文章 http://www.softwhy.com/article-8628-1.html

### `git stage`、`git stash` 和 `git status` 的作用区别 #### `git status` `git status` 是用于查看当前工作区和暂存区状态的命令。它可以显示哪些文件已经被修改但尚未提交,哪些文件已经添加到暂存区,以及哪些文件未被 Git 跟踪。 - **作用**: - 显示当前分支的状态。 - 列出已修改但未提交的文件。 - 显示已暂存(staged)和未暂存(unstaged)的更改。 ```bash git status ``` 输出示例: ```text On branch main Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: README.md Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: app.py ``` #### `git add`(Stage) 虽然 Git 没有单独的 `git stage` 命令,但“stage”通常指的是使用 `git add` 命令将更改添加到暂存区(Staging Area),以便下次提交时包含这些更改。 - **作用**: - 将指定文件或所有修改添加到暂存区。 - 控制哪些更改会被包含在下一次提交中。 ```bash git add README.md git add . ``` - `git add README.md`:仅将 `README.md` 文件添加到暂存区。 - `git add .`:将所有修改添加到暂存区。 #### `git stash` `git stash` 用于临时保存当前工作区和暂存区的更改,使你可以切换分支或处理其他任务而不必提交未完成的工作。 - **作用**: - 保存当前工作进度到一个隐藏的栈中。 - 清理工作区以便切换上下文或拉取更新。 - 后续可以通过 `git stash apply` 或 `git stash pop` 恢复更改。 常用命令: ```bash git stash save "描述信息" git stash list git stash apply git stash pop ``` - `git stash save`:保存当前更改并附带描述。 - `git stash list`:列出所有保存的 stash 条目。 - `git stash apply`:恢复最近一次保存的更改。 - `git stash pop`:恢复最近一次保存的更改并删除该条目[^1]。 例如,恢复特定 stash 条目: ```bash git stash apply stash@{2} ``` #### 区别总结 | 命令/操作 | 作用 | 是否修改仓库内容 | 可逆性 | |----------------|----------------------------------|----------------------|----------------| | `git status` | 查看工作区和暂存区状态 | 否 | 不适用 | | `git add` | 将更改添加到暂存区 | 是(暂存区) | 可撤销 | | `git stash` | 临时保存工作区和暂存区的更改 | 是(本地存储) | 可恢复、可删除 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值