Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 交互式重定基特_Git_Git Rebase_Git Rewrite History - Fatal编程技术网

Git 交互式重定基特

Git 交互式重定基特,git,git-rebase,git-rewrite-history,Git,Git Rebase,Git Rewrite History,我正在做git rebase-I--root,有时会发生冲突。我想了解它是如何工作的以及为什么会发生冲突 因此,据我所知,当交互式重基进行时,它会从提交列表的顶部到底部应用提交,因此我将其命名为“源到目标”,其中源是要应用的当前提交,目标表示已应用的提交。这是正确的理解吗?如果是,那么如果与文件“被他们删除”旁边的消息存在冲突,是否意味着该文件已在源中删除并在目标中编辑?因此,它可能在上次应用的提交中被编辑,但在当前要应用的提交中被删除 还有一个问题,是否可以查看哪些提交已经应用?我的意思是在目

我正在做git rebase-I--root,有时会发生冲突。我想了解它是如何工作的以及为什么会发生冲突

因此,据我所知,当交互式重基进行时,它会从提交列表的顶部到底部应用提交,因此我将其命名为“源到目标”,其中源是要应用的当前提交,目标表示已应用的提交。这是正确的理解吗?如果是,那么如果与文件“被他们删除”旁边的消息存在冲突,是否意味着该文件已在源中删除并在目标中编辑?因此,它可能在上次应用的提交中被编辑,但在当前要应用的提交中被删除

还有一个问题,是否可以查看哪些提交已经应用?我的意思是在目标中

我很抱歉,如果我对交互式重基的理解是错误的,并且我上面的所有细节都没有任何意义,这个功能对我来说似乎很混乱,所以我正在尝试了解基本的想法

。。。据我所知,当交互式重新基进行时,它会从提交列表的顶部到底部应用提交

是:它首先对初始(
--to
)提交执行分离头签出。1这是构建新提交链的点

然后,对于每个
pick
命令,它运行
git cherry pick
。这是可能发生合并冲突的地方,因为cherry pick使用Git的合并引擎。2此合并的合并基础是当前(分离头)提交的父级。合并的
--ours
端是当前提交。合并的
--theres
端是被选中的提交

(当最后一次拾取或其他命令完成且一切正常时,交互式重基将分支名称移动到指向分离的
,并将
附加到该分支名称。)

。。。如果与文件“被他们删除”旁边的消息存在冲突,是否意味着该文件已在源中删除并在目标中编辑?因此,它可能在上次应用的提交中被编辑,但在当前要应用的提交中被删除

对。在一个更典型的重基过程中,考虑这一点的一种方法是,
——他们的
(或索引槽3)是您的提交。
--ours
提交通常也是您的一个旧提交的新副本,但要复制的第一个提交除外,其中
--ours
是他们从
--提交到
目标的提交

还有一个问题,是否可以查看哪些提交已经应用?我的意思是在目标中

一种相对稳定且快速的方法是运行
git-rebase--edit-todo
,它会显示剩余的待办事项列表。这与“完成”列表并不完全相同,但是如果你记得原来的待办事项列表,你可以通过减去来恢复它

其他选项包括使用当前(分离的)
HEAD
git log

git log [--oneline] onto-target..HEAD
它显示到目前为止已复制的提交,或者在某些情况下,直接查看存储所有内容的
.git/rebase-*
目录(但最后一个位置已随时间移动)


1使用
--root
时,交互式重基对第一次提交(必须是“pick”指令)使用特殊情况而不是
cherry pick
。必须这样做,因为没有基本提交就不能使用
git cherry pick
。因此,它只是从要拾取的第一个提交中获取树,并从该树中进行新的根提交。这一步必须始终成功:这里没有冲突的可能。完成这一步意味着从要拾取的提交列表中删除第一个提交,之后,重基将正常继续


2 herry pick直接调用合并策略,例如,
git merge recursive
,而不是运行
git merge
。这有很多技术原因,但主要的两个原因是,通过这种方式,cherry pick自己选择合并基础,通过这种方式,cherry pick自己在合并完成后作为常规的非合并提交进行最终提交。

非常感谢您提供的详细答案。这真的帮了我很大的忙!