On Mon, Mar 28, 2022 at 9:49 PM Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > So if you have both a branch and a tag named 'xyz', you generally need > to disambiguate them when you use them. That will make git happy, > because now it's not ambiguous any more. On a similar but very different issue: this is not the only kind of naming ambiguity you can have. For example, try this insane thing: git tag Makefile that creates a tag called 'Makefile' (pointing to your current HEAD, of course). Now, guess what happens when you then do git log Makefile that's right - git once again notices that you are doing something ambiguous. In fact, git will be *so* unhappy about this kind of ambiguity that (unlike the 'tag vs branch' case) it will not prefer one version of reality over the other, and simply consider this to be a fatal error, and say fatal: ambiguous argument 'Makefile': both revision and filename Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]' and as a result you will hopefully go "Oh, I didn't mean to have that tag at all" and just remove the bogus tagname. Because you probably made it by mistake. But you *can* choose to say git log Makefile -- or git log refs/tags/Makefile to make it clear that no, 'Makefile' is not the pathname in the repository, you really mean the tag 'Makefile'. Or use git log -- Makefile or git log ./Makefile to say "yeah, I meant the _pathname_ 'Makefile', not the tag". Or, if you just like playing games, do git log Makefile -- Makefile if you want to track the history of the path 'Makefile' starting at the tag 'Makefile'. But don't actually do this for real. There's a reason git notices these things. Using ambiguous branch names (whether ambiguous with tag-names or with filenames) is a pain that is not worth it in practice. Git will notice, and git will allow you to work around it, but it's just a BadIdea(tm) despite that. But you probably want to be aware of issues like this if you script things around git, though. That "--" form in particular is generally the one you want to use for scripting, if you want to allow people to do anything they damn well please. It's the "Give them rope" syntax. Of course, a much more common reason for "--" for pathname separation, and one you may already be familiar with, is that you want to see the history of a pathname that is not *currently* a pathname, but was one at some point in the past. So in my current kernel tree, doing $ git log arch/nds32/ will actually cause an error, because of "unknown revision or path not in the working tree". But if you really want to see the history of that now-deleted architecture, you do $ git log -- arch/nds32/ and it's all good. This concludes today's sermon on git, Linus