Git 导出 stash 备份为 patch 文件

Git stash push 备份当前的修改 当我们使用 git 进行代码管理时, 有一个很好的优势就是可以使用 git 命令临时备份我们修改的文件, 并在适时的时候进行还原.
【Git 导出 stash 备份为 patch 文件】在我们修改一项功能时, 需要临时插入另外一个功能进行修改时, 我们需要备份之前的修改, 并把本地的代码进行还原后进行新的功能修改, 这时我们可以使用 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 "git add ..." to update what will be committed) (use "git checkout -- ..." 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 "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory)modified:test.shno changes added to commit (use "git add" and/or "git commit -a") 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 stashpatch 包, 因为 stash 可以同时支持文本文件和二进制.
首先我们使用 git stash 命令备份我们的本地修改, 接着我们可以使用 git stash show "stash@{0}" -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 "stash@{0}" -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

    推荐阅读