153

I saw an answer to a question here that helps restore a deleted file in git.

The solution was

git checkout <deleting_commit>^ -- <deleted_file_path>

What does the caret character (^) do? I’ve seen it elsewhere doing very useful things in git. It’s magical. Someone please spoil it for me and tell me what it does?

Benjamin W.
  • 38,596
  • 16
  • 96
  • 104
Charles Ma
  • 44,439
  • 22
  • 83
  • 99
  • 11
    FYI on windows: ^ doesn't work as expected in DOS shell. Use git bash shell and then it works. – Cincinnati Joe Sep 27 '11 at 00:59
  • 7
    That didn't even occur to me when I've attempted to use it (guessing on what it means). The caret (`^`) is the escape character in cmd.exe. Every time I've tried to use it to see if it would be helpful I was actually passing nothing, which explains why the results were never different. >_> Stupid cmd.exe. You can escape it by doubling it or quoting it: `git log master^^` or `git log "master^"` – bambams Jul 24 '12 at 20:24

9 Answers9

171

HEAD^ means the first parent of the tip of the current branch.

Remember that git commits can have more than one parent. HEAD^ is short for HEAD^1, and you can also address HEAD^2 and so on as appropriate.

You can get to parents of any commit, not just HEAD. You can also move back through generations: for example, master~2 means the grandparent of the tip of the master branch, favoring the first parent in cases of ambiguity. These specifiers can be chained arbitrarily , e.g., topic~3^2. See related answer to What’s the difference between HEAD^ and HEAD~ in Git?

For the full details, see the “Specifying Revisions” section of git rev-parse --help.

Cara McCormack
  • 386
  • 1
  • 7
  • 20
Greg Bacon
  • 128,067
  • 29
  • 183
  • 243
26

It means "parent of". So HEAD^ means "the parent of the current HEAD". You can even chain them together: HEAD^^ means "the parent of the parent of the current HEAD" (i.e., the grandparent of the current HEAD), HEAD^^^ means "the parent of the parent of the parent of the current HEAD", and so forth.

mipadi
  • 380,288
  • 84
  • 512
  • 473
23

The ^ (caret) can also be used when specifying ranges.

To exclude commits reachable from a commit, a prefix ^ notation is used. E.g. ^r1 r2 means commits reachable from r2 but exclude the ones reachable from r1.

<rev>

Include commits that are reachable from (i.e. ancestors of) .

^<rev>

Exclude commits that are reachable from (i.e. ancestors of) .

cmcginty
  • 107,539
  • 39
  • 157
  • 158
12

Here's a visual explanation. Suppose you have a history like so:

                      master  
  ... <- B <- C <- D
             /
... <- E <- F
              feature

When feature was merged into master, C was created with two ancestors. Git assigns these ancestors numbers. The mainline ancestor B is assigned 1 and the feature ancestor F is assigned 2.

Thus C^1 refers to B and C^2 refers to F. C^ is an alias for C^1.

You would only ever use <rev>^3. if you had performed a merge of three branches.

cdosborn
  • 2,630
  • 25
  • 28
8

The caret refers to the parent of a particular commit. E.g. HEAD^ refers to the parent of the current HEAD commmit. (also, HEAD^^ refers to the grandparent).

mopoke
  • 10,327
  • 1
  • 30
  • 31
5

The carat represents a commit offset (parent). So for instance, HEAD^ means "one commit from HEAD" and HEAD^^^ means "three commits from HEAD".

Amber
  • 477,764
  • 81
  • 611
  • 541
4

The (^) gets the parent source of the command i.e. HEAD^ will get the parent of HEAD.

TALLBOY
  • 1,069
  • 1
  • 10
  • 13
1

Greg Bacon gave a great link, but it's pretty dense. The Git introductory docs online also introduce revision and range specifiers:

https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection

Pod
  • 3,700
  • 2
  • 35
  • 43
Ncat
  • 407
  • 3
  • 10
  • 3
    This link might be closer to the location intended. http://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Ancestry-References – bholben Nov 07 '14 at 02:12
0

OP: What does the caret (^) character mean in Git?

The ^ (Caret) and ~ (Tilde) selectors

The difference between HEAD^ (Caret) and HEAD~ (Tilde) is how they traverse history backwards from a specified starting point, in this particular case HEAD.

Tilde ~

<rev>~[<n>] = select <n>th generation ancestor, following only first* parents

Caret ^

<rev>^[<n>] = select <n>th parent of first generation ancestors

*First parent is always the left hand side of the merge, e.g. the commit on the branch that got merged into.

Joining ~ and ^ together

As seen in the illustration below the two selectors ~ and ^ can be used in combination. Also note that instead of using HEAD as a starting point, any regular reference can be used such as a branch, tag or even a commit hash.

Further more, depending on what ancestor is intended to be selected ^ and ~ can be used interchangeably as seen below in the table.

Illustration of relative references in Git

Source: A thorough rundown can be found in this blog post on the subject.