git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Help understanding git checkout behavior

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 11, 2012, 21:34 UTC
Message-ID
<7vk3zd5y8d.fsf@alter.siamese.dyndns.org>
In-Reply-To
<7vobop5zmp.fsf@alter.siamese.dyndns.org>
Junio C Hamano <gitster@pobox.com> writes:
Show 8 quoted lines
> When checking the differences between the two branches (the current
> and the new), unpack-trees notices that the path "something" is not
> present in "b" branch, and even though your current branch and the
> index differs (the index does not have "something" as you have
> removed it), it thinks it is OK for the result to not have it (which
> is correct).  And when it does that, it forgets that a new path
> "something/f1" still needs to be kept (which is not correct), which
> is where the problem you are seeing comes from, methinks.
So there are two paths involved in this two-way merge.

The master branch (HEAD) has "something", but not "something/f1". The index does not have "something", but has "something/f1". The "b" branch does not have either.

For path "something", the rule 2 in the "Two Tree Merge" section of Documentation/git-read-tree.txt applies. It does not exist in the index, it does exist in HEAD, and it does not exist in the other branch we are checking out. The result should be to remove it.

For path "something/f1", the rule 4 ought to apply. The index entry for it is up to date with respect to the working tree file (i.e. clean), the HEAD does not have it, and the other branch does not have it either. We should be keeping it intact across the checkout. For whatever reason, this is not happening and I suspect that is because we have to remove "something" due to rule 2.

I just checked the history of unpack-trees code (which is the underlying machinery of read-tree, which in turn is the machinery used to check out another branch by "git checkout"), and I suspect that this particular case has never worked.

Previous: Junio C HamanoNext: Jeff King
Message 9 of 13 in “Help understanding git checkout behavior”
  1. Cláudio LourençoJun 11, 2012
  2. Konstantin KhomoutovJun 11, 2012
  3. konglu@minatec.inpg.frJun 11, 2012
  4. LeilaJun 11, 2012
  5. Jeff KingJun 11, 2012
  6. Junio C HamanoJun 11, 2012
  7. Cláudio LourençoJun 11, 2012
  8. Junio C HamanoJun 11, 2012
  9. Junio C HamanoJun 11, 2012
  10. Jeff KingJun 11, 2012
  11. Jeff KingJun 11, 2012
  12. Junio C HamanoJun 11, 2012
  13. Vincent van RavesteijnJun 11, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.