Git 应用隐藏是否涉及三方合并,或者只是将隐藏修补到当前工作树?

Git 应用隐藏是否涉及三方合并,或者只是将隐藏修补到当前工作树?,git,Git,git stash手册页 pop[--index][q |--quiet][] 从隐藏列表中删除单个隐藏状态并将其应用于顶部 当前工作树状态的,即执行 吉特隐藏推。工作目录必须与索引匹配 应用状态可能会因冲突而失败;在这种情况下,情况并非如此 从隐藏列表中删除。您需要手动解决冲突 然后手动调用git stash drop “应用状态”是涉及三方合并,还是仅仅修补当前工作树的隐藏 这是什么样的“冲突”?我只知道三方合并的冲突 谢谢。“应用状态”确实是一个三方合并 您在问题中(从文件中)注意到:

git stash
手册页

pop[--index][q |--quiet][]
从隐藏列表中删除单个隐藏状态并将其应用于顶部 当前工作树状态的,即执行 吉特隐藏推。工作目录必须与索引匹配

应用状态可能会因冲突而失败;在这种情况下,情况并非如此 从隐藏列表中删除。您需要手动解决冲突 然后手动调用git stash drop

“应用状态”是涉及三方合并,还是仅仅修补当前工作树的隐藏

这是什么样的“冲突”?我只知道三方合并的冲突

谢谢。

“应用状态”确实是一个三方合并

您在问题中(从文件中)注意到:

祖先图如下所示:

       .----W
      /    /
-----H----I
其中,
H
HEAD
提交,
I
是记录索引状态的提交,
W
是记录工作树状态的提交

我将把
git stash pop
分解为它的两个组成部分,分别是
git stash apply
git stash drop
。如果应用步骤成功,
pop
也执行
drop
步骤。如果不是,则它会因冲突而停止,例如-
pop
跳过
下拉操作
git-stash
代码目前只是一个shell脚本,但它是一个相当大和复杂的脚本,有700多行,字面意思是这样的:

pop_stash() {
    assert_stash_ref "$@"

    if apply_stash "$@"
    then
        drop_stash "$@"
    else
        status=$?
        say "$(gettext "The stash entry is kept in case you need it again.")"
        exit $status
    fi
}
正如你所看到的,应用,如果有效,放弃;如果不起作用,请打印一行信息行,然后使用与apply退出时相同的状态代码退出

应用索引(
I
)提交 由于每个存储至少有两个提交,即
I
索引状态和
W
工作树状态,因此应用步骤可以应用这两个状态,也可以不应用。在运行
git stash apply
git stash pop
时,您可以选择是同时应用这两种方法,还是只应用
W
状态。如果您选择同时应用这两种方法,则应用
I
状态的金额为:

git diff <hash-of-H> <hash-of-I> | git apply --cached
它运行三方合并,合并基是commit
H
--ours
commit是启动合并时索引中的任何内容,
--theres
commit是
W
commit的内容

注意:
git merge recursive
尝试在开始合并时容纳工作树中的任何内容,即使它与充当
ours
树的索引内容不匹配。这并不总是成功的,这就是为什么
git将pop
隐藏到脏工作树中通常是个坏主意。

如果存在合并冲突,这三棵树——
H
commit中的
$b_-tree
$c_-tree
from和
$w_-tree
from commit
w
——是进入合并冲突暂存槽中索引的文件的三个源,如我在至中所述


请注意,如果您确实使用了
git mergetool
来合并它们,通常会丢弃您在开始合并时在工作树中所做的任何未过时的更改。这也是用脏工作树启动
git stash pop
通常是不明智的原因。
如果在启动
git stash pop
时,您的工作树与索引匹配,那么如果发生合并冲突,您的状态会好得多。

3路合并,我想说。否则,隐藏、切换分支然后应用它将不会产生期望的结果(将更改应用于新分支)。git stash pop合并的三种方式是什么?谢谢。修补和三方合并的区别是什么?“在任何情况下,修补都可能失败。如果失败,您可以选择使用git stash branch而不是git stash apply--index,这是可以保证工作的”。为什么
git stash分支
总是成功,而
git stash apply--index
可能不会成功?
git stash分支
所做的是首先在图中签出stash commit
H
的父级,并创建一个指向该提交的新分支名称。然后它像往常一样应用索引和工作树更改,因为它们是相对于
H
的,并且正在应用于
H
,所以应用索引和工作树更改总是成功的。
git diff <hash-of-H> <hash-of-I> | git apply --cached
if git merge-recursive $b_tree -- $c_tree $w_tree