我刚刚做了
git stash
git pull
git stash apply
收到消息
Auto-merging my_notebook.ipynb
CONFLICT (content): Merge conflict in my_notebook.ipynb
它是一个二进制文件,所以我不知道如何像通常处理源代码 merge 冲突那样手动解决冲突。
如何用我 stash 的文件替换工作目录中的文件?覆盖已 pull 的版本?
最佳答案
这相对简单。存储本身由两个(或有时三个,但在本例中为两个)提交组成,其中一个您可以使用名称 stash
引用,另一个需要名称 stash^2
。 stash
下的目录与您运行 git stash
时的工作目录相对应,因此这就是您想要的目录。
因此,其中任何一个都可以在 Unix/Linux 系统上运行:
git restore --worktree --source=stash my_notebook.ipynb
git show stash:my_notebook.ipynb > my_notebook.ipynb
git checkout stash -- my_notebook.ipynb
通常使用第一个,因为它也适用于其他不太友好的系统,例如 Windows。请注意,它仅写入您的工作树副本。第二个也只写入工作树副本(使用 I/O 重定向),但第三个写入 Git 的索引(也称为“暂存区域”)和工作树副本。您可能想要这样做,这样您就不需要随后在文件上运行git add
;在这种情况下,您可以通过修改 git Restore
命令以使用 git Restore -SW --source stash
来获得此效果。1
(因为 git stash apply
使用“我们的”和“他们的”提交运行内部 merge ,因此可以使用 --ours
或 --他们的
来提取HEAD
和工作树版本,但是,考虑到它们如何通过各种操作交换,2即使我也无法跟踪哪个是我自己的,因此我不推荐 git checkout --ours
或 git Restore --theirs
或此处的任何名称。只需命名 stash
> 直接这样你就知道你指的是哪个提交。)
1-S
或 --staged
选项表示写入暂存,而 - W
或 --worktree
选项表示写入工作树。 --source
选项可以将 =stash
或 stash
作为单独的单词。这里的想法是展示调用它的所有不同方法。
2例如,在 git merge
期间,--ours
有意义,但在 git rebase
期间,--ours
通常不会,而 --theirs
表示“我的原始提交”,这似乎应该称为“我们的”。无论最终结果如何,总会有技术原因,人们总是可以根据第一原理来解决它,但对于人们很少做的事情,费心似乎很愚蠢。直接命名提交会更容易。
关于git - 如果发生 merge 冲突,请使用 git stash 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71139921/