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

Re: [PATCH] Document what the stage numbers in the :$n:path syntax mean.

From
Shawn O. Pearce <spearce@spearce.org>
Date
Aug 20, 2007, 06:05 UTC
Message-ID
<20070820060522.GA27913@spearce.org>
In-Reply-To
<20070820055221.GA22993@coredump.intra.peff.net>
Jeff King <peff@peff.net> wrote:
Show 13 quoted lines
> On Mon, Aug 20, 2007 at 11:36:38AM +0800, Steven Grimm wrote:
> 
> > The git-rev-parse manpage talks about the :$n:path notation (buried deep in
> > a list of other syntax) but it just says $n is a "stage number" -- someone
> > who is not familiar with the internals of git's merge implementation is
> > never going to be able to figure out that "1", "2", and "3" mean what Junio
> > said.
> 
> I often forget which number corresponds to which source. I seem to
> recall somebody proposing :ours:$path a while ago, but I couldn't find
> any reference in the archive, so perhaps I just dreamed it.
> 
> Am I the only one who messes this up? If not, patch is below.
Maybe.  ;-)

I've memorized it long long ago. But my coworkers haven't and always get it wrong, and look at me funny when I tell them "trust me, your data is in stage 2 and theirs is in stage 3... because that's the convention all of the tools you are using follows".

Keywords in that last part: "convention" and "tools you are using". Someone could redefine what the stages mean and load content into them using `update index --index-info`. You might even be able to load the stages in odd ways yourself from Porcelain.

Oh, like say git-rebase. During a rebase "theirs" (stage 3) is your file and "ours" (stage 2) is the upstream. Confusing now, ain't it? Mine is theirs and ours is theirs? Huh? Yeeaaaah.

This is why I've never liked most merge tools.  They get hung up on
what is theirs and what is mine and then at some point they wind up
confusing the stages and getting them inverted.  And this is exactly
why git-merge.sh/git-rebase.sh/git-am.sh try to setup GITHEAD_* for
git-merge-recursive, and why they set it up using branch names and
patch subject lines, because it makes the conflict markers easier
to understand.
 
Show 5 quoted lines
>  	/* sha1:path --> object name of path in ent sha1
>  	 * :path -> object name of path in index
>  	 * :[0-3]:path -> object name of path in index at stage
> +	 * :base|ours|theirs:path -> same as :[1-3]:path
>  	 */
At least document the new syntax in git-rev-parse documentation?
-- 
Shawn.
Previous: Jeff KingNext: Shawn O. Pearce
Message 8 of 22 in “merge-recursive: do not rudely die on binary merge”
  1. Junio C HamanoAug 14, 2007
  2. Chris ShoemakerAug 14, 2007
  3. Junio C HamanoAug 15, 2007
  4. Nikodemus SiivolaAug 15, 2007
  5. Junio C HamanoAug 15, 2007
  6. Document what the stage numbers in the :$n:path syntax mean.Steven Grimm, Aug 20, 2007
  7. Jeff KingAug 20, 2007
  8. Shawn O. PearceAug 20, 2007
  9. Shawn O. PearceAug 20, 2007
  10. Florian WeimerAug 20, 2007
  11. Jeff KingAug 20, 2007
  12. Junio C HamanoAug 20, 2007
  13. Jeff KingAug 20, 2007
  14. Jakub NarebskiAug 22, 2007
  15. Jeff KingAug 20, 2007
  16. Johannes SixtAug 20, 2007
  17. Junio C HamanoAug 20, 2007
  18. Jan HudecAug 20, 2007
  19. Junio C HamanoAug 20, 2007
  20. Junio C HamanoAug 15, 2007
  21. Chris LarsonAug 15, 2007
  22. Chris ShoemakerAug 15, 2007

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.