从 git 存储中提取非二进制文件

Pull non-binary files from git stash

我是 git 的新手。在一台电脑上我 运行

git stash save myfeature
git stash show -p > myfeaturepatch

我将 myfeaturepatch 复制到第二台计算机并且 运行

git apply myfeaturepatch

我做了一些更改,包括添加一些字体文件(二进制文件)然后 运行

git stash save myfeature2
git stash show -p > myfeaturepatch2

当我尝试将第二个版本应用回我的第一台计算机时,我得到

error: cannot apply binary patch to 'myfont.ttf' without full index line

我的猜测是我在藏匿时需要 运行 git stash save --binary myfeature2。不幸的是,由于 git stash 删除了它保存到文件的更改,并且由于上述错误我无法将我的补丁应用到任何一台计算机,我目前无法访问我所做的更改。

我已经尝试了一堆不同的 git applygit stash 命令,但我对正在发生的事情以及参数的含义没有足够完整的理解来提取我的补丁文件中的非二进制文件。我想有办法做到这一点。

至少尝试 (git apply):

 git apply --reject mypatch.diff

This option makes it apply the parts of the patch that are applicable, and leave the rejected hunks in corresponding *.rej files.

并且当你制作补丁(git diff)时,将--binary选项添加到:

output a binary diff that can be applied with git-apply.

My guess is I needed to run git stash save --binary myfeature2 when I made the stash.

不,这是不必要的......而且甚至不是一个选择:没有save --binary

git stash 所做的是提交您的工作。它只是以一种奇怪的方式执行此操作,使用两个单独的提交,1 no b运行ch.

只要你还有存储,你就还有提交。

处理您仍然拥有的需要拆开的存储的最简单方法是将其转换为新 b运行ch 上的普通提交:

git stash branch newbranchname [<stash>]

当然,这需要你在存储的机器上做,2但是一旦完成,你就在一个新的 b运行ch,索引与你 运行 git stash save 时的方式相同,工作树与你 运行 [=14= 时的方式相同]. (新的 b运行ch 的当前提交也是 current 当你 运行 git stash save 时的提交。)你现在可以完成 git add-ing 任何未暂存文件,git reset 任何您不想暂存的文件,以及 git commit 结果索引(然后从更多工作树文件中进行更多提交,直到安全保存所有内容在普通的非 stash-y 提交中)。


1这两个提交是针对当前 index 和工作树的。请记住,索引是您构建下一个提交的地方,通过 git add-ing and/or git rm-ing 从工作树复制最新版本。因此,索引和工作树中的一个或两个可以不同于当前的 commit,因此 git stash save 分别保存两者,以便以后可以单独恢复它们,如果你以后想要那个。您可以告诉它保存包含未跟踪文件或所有文件的第三次提交。

2当然,在你git stash branch之前,你应该有一个干净的索引和工作树。如果不这样做,则需要先提交或隐藏。如果您决定再次隐藏,这会将您之前的隐藏 "up" 提升一个级别,因此如果它曾经是 stash@{2} 现在是 stash@{3}。我发现保持许多 stashes 处于活动状态是疯狂的秘诀:相反,提交一个新的 b运行ch.