我有一组调试实用程序,它们位于git存储槽中;我正在分支机构之间移动,这些分支机构之间的差异很小。我git stash apply
在相应分支上的顶部存储来测试功能。
然而,我在其中一个分支中遇到了正确的合并冲突,但我想更喜欢藏匿中的内容,所以我希望合并策略“递归”更喜欢来自存储的版本(I 猜猜那是“他们的”,参见man git-merge
部分MERGE-STRATEGIES
,第recursive
分段。)
我可以告诉git stash apply
使用什么合并策略吗?
答案 0 :(得分:12)
是的,您可以自己进行合并。存储提交名为stash
。
git cherry-pick -n -m1 -Xtheirs stash
Cherrypick与cherrypick的父母合并作为基础。 Stash commits record the worktree state with two parents, the checked-out commit and the stashed index
-m1
告诉cherrypick使用第一个父级作为合并基础,当这里有关于你想要合并哪些更改的任何歧义。 -n
表示不提交结果。
这将生成一个工作树和索引,其更改与存储的工作树中的更改相匹配。如果您想要在stashed索引中应用更改,请改为使用cherrypick stash^2
;或者,如果您要将隐藏索引中的更改(即添加的已暂存的又名索引内容)应用于隐藏的工作树,请使用-m2
而不是-m1
。
如果您想将仅合并到工作树,请执行
savetree=`git write-tree`
git cherry-pick -n -m1 -Xtheirs stash
git read-tree $savetree
这足以在这里处理问题中的案例(应用一组方便的更改),但它并不完全重现存储为您所做的一切。应用stashed索引仅更改当前索引,而stashed worktree仅更改为当前工作树只是简单的挑剔。 git stash
是/usr/libexec/git-core/git-stash
中的一个脚本,如果有人想看到它的话。
答案 1 :(得分:3)
不,不是没有修改stash
脚本(你会在git-core
目录中找到它。)
而不是这样做,我会使用git stash branch newbranch [stash-id]
将存储转换为真正的分支。这将:
git checkout -b newbranch
apply --index
和(成功时,应始终是)drop
藏匿。(你可以在git stash save
之后立即恢复该藏匿,如果你想将它作为藏匿处保存,然后git stash apply --index
将其恢复到新分支上。)
此时,你可以提交索引和/或提交新的工作目录,和/或在新分支上大惊小怪,根据需要/期望,然后你有一个“真正的分支”,你可以合并
答案 2 :(得分:0)
我遇到了同样的问题,最后使用了一个带有临时分支的复杂过程。 IMO,如果stash命令将-X参数传递给merge命令,则可以很容易地修复它。认为这是一个丑陋的解决方法。
净效果:将藏匿物应用于当前主人,放弃任何有利于藏匿者的差异。
根据@torek的建议为隐藏创建一个临时分支。
git stash branch tmp [stash-id]
检入您的更改。使用任何消息,因为此提交不是永久性的。
git add --all .
git commit -m 'tmp commit'
使用“我们的”合并策略将tmp
分支重新定位到您的目的地
git rebase -X ours master
重置临时提交,将更改添加到当前索引
git reset HEAD^
清理临时分支
git checkout master
git branch -d tmp
当存储和主控包含一些相同的更改时(例如,如果协作者和您都重命名文件),这可能非常方便。