在合并冲突的情况下使用 git 存储版本

use git stash version in case of merge conflict

我刚刚做了

git stash
git pull
git stash apply

收到消息

Auto-merging my_notebook.ipynb
CONFLICT (content): Merge conflict in my_notebook.ipynb

这是一个二进制文件,所以我不知道如何像通常处理源代码合并冲突那样手动解决冲突。

我怎样才能用我隐藏的文件替换我工作目录中的文件?覆盖拉取的版本?

这相对简单。存储本身由两个(或有时三个,但在本例中为两个)提交组成,您可以使用名称 stash 引用其中一个,另一个需要名称 stash^2stash下面的就是你运行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。请注意,它只写入您的 working tree 副本。第二个也只写入工作树副本(使用 I/O 重定向),但第三个写入两个 Git 的索引(又名“暂存区”) 你的工作树副本。您可能 想要 这样以后就不需要 运行 git add 文件;在这种情况下,您可以通过修改 git restore 命令以使用 git restore -SW --source stash 来获得此效果。1

(因为 git stash apply 运行 与“我们的”和“他们的”提交的内部合并,可以使用 --ours--theirs 来提取 HEAD 和 working-tree 版本,但是,考虑到它们如何被各种操作交换,2 甚至我自己也无法跟踪哪个是哪个,因此我不推荐 git checkout --oursgit restore --theirs 或其他任何东西。直接命名 stash 这样你就知道你指的是哪个提交。)


1-S--staged 选项表示 写入暂存 -W--worktree 选项表示 写入工作树 --source 选项可以将 =stashstash 作为一个单独的词。这里的想法是展示调用它的所有不同方法。

2例如,在git merge期间,--ours是有意义的,但在git rebase期间,--ours通常没有意义--theirs 表示“我的原始提交”,这似乎应该称为“我们的”。无论结果最终是什么,总是有技术原因,人们总是可以从第一原则中得出结论,但对于很少有人做的事情,麻烦似乎很愚蠢。直接命名 commit 更容易。