Git stash push 备份当前的修改

当我们使用 ​​git​​ 进行代码管理时, 有一个很好的优势就是可以使用 ​​git​​ 命令临时备份我们修改的文件, 并在适时的时候进行还原.

在我们修改一项功能时, 需要临时插入另外一个功能进行修改时, 我们需要备份之前的修改, 并把本地的代码进行还原后进行新的功能修改, 这时我们可以使用 ​​git stash ​​命令无缝的实现.

​git stash push​​ ( 可简写为 ​​git stash​​ ) 命令可以备份我们当前工作区 ( cache ) 和缓存区 ( index 或 stage ), 当备份成功后, 会清除掉工作区和缓存区的改动( 默认不带相关参数时 ). 当我们需要还原时, 使用 ​​git stash apply 或 git stash pop​​ 命令进行还原.

对于 ​​stash push/pop/apply​​ 命令的更多参数的使用, 可以参照 ​​官方文档​​.

示例

当 ​​test.sh​​ 文件被修改后, 我们可以看到工作区存在变动的文件.

➜  stash-git git:(master) ✗ git status
On branch master
Changes not staged for commit:
(use undefinedgit add <file>...undefined to update what will be committed)
(use undefinedgit checkout -- <file>...undefined to discard changes in working directory)

modified: test.sh

当执行 ​​git stash​​ 进行备份.

➜  stash-git git:(master) ✗ git stash push
Saved working directory and index state WIP on master: 022d738 init
➜ stash-git git:(master) git status
On branch master
nothing to commit, working tree clean

当执行 ​​git stash pop​​ 进行还原.

➜  stash-git git:(master) git stash pop
On branch master
Changes not staged for commit:
(use undefinedgit add <file>...undefined to update what will be committed)
(use undefinedgit checkout -- <file>...undefined to discard changes in working directory)

modified: test.sh

no changes added to commit (use undefinedgit addundefined and/or undefinedgit commit -aundefined)
Dropped refs/stash@{0} (7ca79cc65abdb6c2224f5b0f95620e2c50cc420c)

导入 Git stash 的备份为 patch 文件

我们常用的 ​​git stash​​ 命令一般常用于本地电脑仓库文件的备份和还原, 那如何做到跨电脑的备份的还原呢? 可能大家比较常用的就是使用 ​​patch​​ 包进行备份和还原了.

在 ​​git​​ 中可以使用 ​​git diff > xxx.patch​​ 命令生成文本文件的 ​​patch​​ 差异包, 也可以使用 ​​git diff --binary > xxx.patch​​ 命令生成二进制文件的 ​​patch​​ 差异包. 但比较沮丧的是, ​​diff​​ 命令并不能同时把修改的文本文件和二进制文件同时生成差异包.

要达到这个要求, 我们有一个更好的方法就是导出 ​​git stash​​ 为 ​​patch​​ 包, 因为 ​​stash​​ 可以同时支持文本文件和二进制.

首先我们使用 ​​git stash​​ 命令备份我们的本地修改, 接着我们可以使用 ​​git stash show undefinedstash@{0}undefined -p > changes1.patch​​ 命令选择某一个 ​​git stash​​ 的备份为 ​​patch​​ 文件. ( : ​​{0}​​ 表示为最近的一个备份 )

示例 ####

当使用 ​​git stash​​ 备份本地修改, 可以使用 ​​git stash list​​ 查看备份列表.

➜  stash-git git:(master) git stash list
stash@{0}: WIP on master: 022d738 init

使用 ​​git show​​ 生成 ​​patch​​ 文件, 并查看生成的 ​​patch​​ 文件.

➜  stash-git git:(master) git stash show undefinedstash@{0}undefined -p > changes1.patch
➜ stash-git git:(master) ✗ cat changes1.patch
diff --git a/test.sh b/test.sh
index 1dd57dc..6babd0c 100644
--- a/test.sh
+++ b/test.sh
@@ -1,3 +1,5 @@
...

Git 应用 patch 文件

在 ​​git​​ 中我们使用 ​​git apply xxx.patch​​ 应用 ​​patch​​ 文件, ​​apply​​ 命令有几个常用的参数需要知道下:

-p                 指定补丁中文件路径的相对深度, 如果我们打 patch 是在项目上一级目录进行, 
那么在项目目录可以使用 `-p1` 进行补丁应用.( 默认为-p0 ).

--3way 合并时如果失败了, 采用 3way 的算法进行合并.

--reject 采用以上方法合并失败时, 可以自行解决 .rej 文件的冲突.

--whitespace=fix 忽略空格.

比如使用 ​​--reject​​ 的合并命令:

git apply --reject --whitespace=fix -p0 patches/rtc/rtc_patch_all_lib.patch