“git checkout HEAD”如何以及为什么导致“--theirs”和“--ours”的结果不同?

时间:2015-09-23 01:18:48

标签: git vim github git-rebase git-checkout

当我遇到 Dim objOutlook As Outlook._Application objOutlook = New Outlook.Application() Dim objNS As Outlook._NameSpace = objOutlook.Session Dim objRecipient As Outlook.Recipient = _ objNS.CreateRecipient("John Smith") 'Dim eMail As Outlook.MailItem 'Dim travelunreadold As String Dim vItems Dim vvItems Dim vOlderItems Dim vOlderunreadItems If objRecipient.Resolve Then Dim objFolder As Outlook.MAPIFolder = _ objNS.GetSharedDefaultFolder(objRecipient, _ Outlook.OlDefaultFolders.olFolderInbox) txtTravUnread.Text = objFolder.UnReadItemCount 'For Each eMail In objFolder.Items ' If eMail.UnRead = True Then ' travelunreadold = eMail.ReceivedTime ' Txttravundate.Text = travelunreadold ' End If 'Next eMail vItems = objFolder.Items.Restrict("[Unread] = true") vItems.Sort("ReceivedTime", False) 'ascending order vOlderunreadItems = vItems.GetFirst Txttravundate.Text = vOlderunreadItems vvItems = objFolder.Items vvItems.Sort("ReceivedTime", False) 'ascending order vOlderItems = vvItems.GetFirst Txttravemdate.Text = vOlderItems txtTravEmails.Text = objFolder.Items.Count 'Txttravemdate.Text = oldest.recievedtime Else Console.Write("Recipient could not be resolved.") End If 冲突时,我希望看到rebase--ours--theirs所带来的变化。

所以,我检查了所有这些(字面意思):

HEAD

git checkout --ours <new_file>

...我检查文件......

vim <new_file>

git checkout --theirs <new_file>

...我检查文件......

vim <new_file>

git checkout HEAD <new_file>

...我检查文件......

然后,我返回结帐vim <new_file>theirs

ours

git checkout --theirs <new-file>

出于某种原因,vim <new-file>--theirs在签出--ours时都符合该版本。我理解HEAD应该更改工作目录和索引,但即使我再次检出git checkout ,它仍然像--theirs版本。< / p>

这是怎么回事?有没有办法恢复原来的HEAD--theirs版本?谢谢。

1 个答案:

答案 0 :(得分:2)

Git使用--ours的{​​{1}}和--theirs参数来选择要提取的冲突合并的“侧”。更确切地说,当你有一个冲突的合并时,对于每个冲突的(“未合并的”)路径,在该路径的git的索引/临时区域中有三个 1 条目。 Git对这些数字进行了编号:

git checkout文件的合并基础版本 :1:path文件的“我们的”版本 :2:path文件的“他们的”版本

请注意:3:path“缺失”,此处:插槽零保留用于已解析(合并)的路径。

当你:0:path时,git认为你正在解决冲突。它抛弃了其他三个版本并填充了插槽0.事实上,如果用任何分支或“tree-ish”说明符(例如git checkout HEAD path)替换HEAD,它也会认为你正在解决冲突。

幸运的是,有一种方法可以告诉git(重新)创建合并冲突,重新填充其他三个插槽(并放弃插槽0中的版本):

git checkout branch1 path

Git的合并尝试照常在你的工作目录中结束。

一个小缺点是$ git checkout -m path之后的符号丢失了(你实际上可以提供它们,因为它们来自特殊的git环境变量,但我认为它很少值得打扰)。 [编辑添加注释:我指的是在标记之后添加的额外信息,例如:

<<<<

这是我看到的“更多信息”消失了。]

1 更确切地说,最多三个条目:如果在合并的某些提交中删除了文件,则会忽略明显的条目。