git - 如果发生 merge 冲突,请使用 git stash 版本

标签 git git-stash

我刚刚做了

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 --oursgit Restore --theirs 或此处的任何名称。只需命名 stash > 直接这样你就知道你指的是哪个提交。)


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

2例如,在 git merge 期间,--ours 有意义,但在 git rebase 期间,--ours 通常不会,而 --theirs 表示“我的原始提交”,这似乎应该称为“我们的”。无论最终结果如何,总会有技术原因,人们总是可以根据第一原理来解决它,但对于人们很少做的事情,费心似乎很愚蠢。直接命名提交会更容易。

关于git - 如果发生 merge 冲突,请使用 git stash 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71139921/

相关文章:

git - 批量更改各种存储库中的git remote origin - bash命令

Git: merge 给出了意想不到的结果

git stash list 或 git show ,返回 ( most +s +'/---' : 1: most: not found ) What is this?

git - 奇怪的 git 案例 - git stash 后跟 git stash apply 丢失未提交的数据?

预提交 Hook 中的 git stash 在第一次提交时失败

git - 使用 git 子模块还原 Nuget 包

git tfs : How to rcheckin git commits when there is another checkin in tfs?

android - "/usr/local/bin/git": error=2, Android Studio 没有那个文件或目录

git - 是否可以从存储中应用单行?

git - 如何仅 stash 一些未提交的更改?