Что означает символ каретки (^)?

125

Я увидел здесь ответ на вопрос, который помогает восстановить удаленный файл в git.

Решение было

git checkout <deleting_commit>^ -- <deleted_file_path>

Что делает символ каретки ( ^)? Я видел, как он в другом месте делает очень полезные вещи в git. Это волшебно. Кто-нибудь, пожалуйста, испортите мне его и скажите, что он делает?

Чарльз Ма
источник
9
К вашему сведению: ^ не работает должным образом в оболочке DOS. Используйте оболочку git bash, и тогда она работает.
Цинциннати Джо
5
Это даже не пришло мне в голову, когда я попытался его использовать (догадываясь, что это значит). Каретка ( ^) - это escape-символ в cmd.exe. Каждый раз, когда я пытался использовать его, чтобы увидеть, будет ли он полезным, я фактически ничего не передавал, что объясняет, почему результаты никогда не менялись. > _> Глупый cmd.exe. Вы можете избежать этого, удвоив его или процитировав: git log master^^илиgit log "master^"
bambams

Ответы:

138

HEAD^ означает первого родителя вершины текущей ветви.

Помните, что у коммитов git может быть более одного родителя. HEAD^является сокращением HEAD^1, и вы также можете адресовать HEAD^2и так далее по мере необходимости.

Вы можете добраться до родителей любого коммита, а не только HEAD. Вы также можете перемещаться между поколениями: например, master~2означает прародителя верхушки главной ветви, отдавая предпочтение первому родителю в случаях двусмысленности. Эти спецификаторы могут быть соединены произвольно, например , topic~3^2. См. Соответствующий ответ на вопрос В чем разница между HEAD^и HEAD~в Git?

Для получения полной информации см. Раздел «Определение редакций» в git rev-parse --help.

Грег Бэкон
источник
1
Но тогда, в линейной истории, почему HEAD^^^возвращается третий более старый коммит, т.е. он эквивалентен HEAD~~~?
Vorac
1
@Vorac Для линейной истории - да.
Грег Бэкон
21

Это означает «родитель». Так HEAD^означает «родитель текущего HEAD». Вы даже можете объединить их в цепочку: HEAD^^означает «родительский родитель текущего HEAD» (т. Е. Прародитель текущего HEAD), HEAD^^^означает «родительский родительский элемент родительского элемента текущего HEAD» и т. Д.

mipadi
источник
16

^(Каретка) также может быть использована при указании диапазонов .

Чтобы исключить коммиты, доступные из коммита, используется нотация префикса ^ . Например, ^ r1 r2 означает, что коммиты достижимы из r2, но исключают те, которые достижимы из r1.

<Оборотов>

Включите коммиты, которые доступны от (то есть предков).

^ <Оборотов>

Исключить коммиты, которые доступны из (т.е. предков).

cmcginty
источник
10

Вот наглядное объяснение. Предположим, у вас есть такая история:

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

Когда объект был объединен в мастер, он Cбыл создан с двумя предками. Git присваивает этим предкам номера. Предку основной линии Bприсваивается 1, а предку функции F- 2.

Таким образом C^1относится Bи C^2относится к F. C^это псевдоним для C^1.

Вы бы только когда-либо использовали <rev>^3. если вы выполнили слияние трех веток.

cdosborn
источник
7

Каретка относится к родителю конкретной фиксации. Например, HEAD^относится к родительскому объекту текущего коммита HEAD. (также HEAD^^относится к дедушке и бабушке).

mopoke
источник
4

Карат представляет собой смещение фиксации (родителя). Так, например, HEAD^означает «одна фиксация из HEAD» и HEAD^^^означает «три фиксации из HEAD».

янтарный
источник
4

(^) Получает родительский источник команды, то есть HEAD ^ получает родительский источник HEAD.

ВЫСОКИЙ МАЛЬЧИК
источник