2014-09-25 39 views
3

也许我在想这个,但有人可以详细说明下面的说法吗?Git中的rebase和merge状态如何?

违反直觉,重定位和合并是有状态的,git可以在合并/重定位完成之前将控制权切回 。

state简要回顾之后,我相信这是与底垫做,合并组成的序列(顺序)的步骤,其中每个步骤是一个原子的变化,因此它可以被回滚。它是否正确?有人能更好地解释这一点,为什么这是违反直觉的?如果重组和合并不是有状态的,它们会不可逆转吗?

最后,只有在Git中才有rebase和merge stateful吗?

+3

“和git可以放弃控制回你”---我确定它隐含地提到了必须手动解决的合并冲突。所以它们是有状态的,因为并不是每一次合并/重组都可能以同样的方式执行。 – zerkms 2014-09-25 04:41:36

回答

2

作为original poor explainer commenter,我可以澄清我的意思。

不像许多Git命令(如检出),它更新您的回购/索引/ WORKDIR然后控制返回给你,这是可能的GIT中在一个mergerebase,下达控制中间退出回到用户。 这一点特别重要,因为它让您有机会在继续合并或重新绑定之前解决合并冲突。

git merge --abort 
git rebase --continue | --skip | --abort | --edit-todo 

如果merge失败,git会告诉你这个消息:

自动合并失败;修复冲突,然后提交结果。

,并在一个rebase,git会告诉你这个消息:

未能在变更合并。

在补丁(步骤)

当你已经解决了这个问题,运行 “git的变基--continue” 失败。如果 你宁愿跳过这个补丁,而是运行“git rebase --skip”。 要恢复原始分支并停止重新分配运行“git rebase --abort”。

在运行git status将列出一些文件作为

# Unmerged paths: 
# (use "git add/rm ..." as appropriate to mark resolution) 
# 
# both modified:  YOURFILE 
# 

它不是特别直观,除非你期望的git要么完全成功,要么立即返回控制你之前失败两种情况下。如果您将目录置于合并或重新绑定的中间,忘记它,并在稍后返回时希望像平常一样操作它,那么您也可能会遇到麻烦。一个有用的技术是add your branch name and merge state onto your shell prompt,我发现它有助于记住我的工作目录在任何给定时间处于哪个状态。

1

很简单,一旦您开始合并或重新绑定,它就“正在处理”。它尚未完成,您需要将其回滚或提交。你不能中间做其他主要的git命令(如提交)。

+0

好吧,rebase(尤其是交互式rebase)故意停止并让你做提交。但一般来说,当你处于重组或合并以及处理冲突时,你不希望开始其他的事情,是的。 – torek 2014-09-25 05:02:02

4

这意味着git会在.git目录中存储状态信息,用于跟踪它正在做什么。

要查看合并类型git merge --no-commit <some branch>然后ls -l .git,您将看到文件MERGE_HEAD,MERGE_MODE和MERGE_MSG已创建。合并提交时,这些文件被删除。

对于rebase,只需要执行如git rebase -i HEAD~1之类的操作,并将任何行从“pick”更改为“edit”。当git给你回控制ls -l .git,你会看到有一个.git/rebase-merge目录创建了一大堆文件,包括仍然要执行的rebase动作列表。 git rebase --abort(或者当rebase自行结束时)并且这些文件被删除。

我不知道为什么说那些认为这些操作有状态的人是反直觉的。如果你通过rebase一次一个地提交一个提交,你必须有一个“todo”列表存储在某个地方。如果你正在合并,你必须知道在SHA中合并的是什么,所以你除了HEAD之外还要承诺它。

+0

我之所以把它叫做违反直觉的只是因为它可能对于一个新的git用户来说并不直观,即如果存储库在进程中间,如果它们返回到shell提示符下,这个用户可能会处于这个过程中。例如,在将控制权交还给用户之前,Subversion将交互式地要求冲突解决。 – 2014-09-25 05:57:00

相关问题