在应用git存储时,我可以影响“递归”使用的合并策略吗?

时间:2013-10-11 09:04:59

标签: git merge branch git-stash

我有一组调试实用程序,它们位于git存储槽中;我正在分支机构之间移动,这些分支机构之间的差异很小。我git stash apply在相应分支上的顶部存储来测试功能。

然而,我在其中一个分支中遇到了正确的合并冲突,但我想更喜欢藏匿中的内容,所以我希望合并策略“递归”更喜欢来自存储的版本(I 猜猜那是“他们的”,参见man git-merge部分MERGE-STRATEGIES,第recursive分段。)

我可以告诉git stash apply使用什么合并策略吗?

3 个答案:

答案 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命令,则可以很容易地修复它。认为这是一个丑陋的解决方法。

净效果:将藏匿物应用于当前主人,放弃任何有利于藏匿者的差异。

  1. 根据@torek的建议为隐藏创建一个临时分支。

    git stash branch tmp [stash-id]
    
  2. 检入您的更改。使用任何消息,因为此提交不是永久性的。

    git add --all .
    git commit -m 'tmp commit'
    
  3. 使用“我们的”合并策略将tmp分支重新定位到您的目的地

    git rebase -X ours master
    
  4. 重置临时提交,将更改添加到当前索引

    git reset HEAD^
    
  5. 清理临时分支

    git checkout master
    git branch -d tmp
    
  6. 当存储和主控包含一些相同的更改时(例如,如果协作者和您都重命名文件),这可能非常方便。