2009-12-23 11 views
88

Я увидел здесь answer to a question, который помогает восстановить удаленный файл в git.Что означает символ каретки (^)?

Решение было

git checkout <deleting_commit>^ -- <deleted_file_path> 

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

+7

FYI на окнах:^не работает должным образом в оболочке DOS. Используйте оболочку git bash, а затем она работает. –

+5

Это мне даже не приходило, когда я пытался его использовать (угадывая, что это значит). Карет ('^') является escape-символом в cmd.exe. Каждый раз, когда я пытался использовать его, чтобы посмотреть, будет ли полезно, я фактически ничего не пропускал, что объясняет, почему результаты никогда не были разными. > _> Stupid cmd.exe. Вы можете избежать этого, удвоив его или процитировав его: 'git log master ^^' или 'git log" master^"' – bambams

ответ

100

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

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

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

Для получения более подробной информации см. Раздел “Specifying Revisions” раздела git rev-parse --help.

+1

Но тогда, по линейной истории, почему 'HEAD ^^^' возвращает третью старшую фиксацию т.е. он эквивалентен 'HEAD ~~~'? – Vorac

+1

@Vorac Для линейной истории, да. –

7

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

19

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

3

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

4

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

1

Грег Бэкон дал отличную ссылку, но это довольно плотно. Вступительные документы Git онлайн также ввести пересмотр и диапазон спецификаторов:

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

+3

Эта ссылка может быть ближе к предполагаемому местоположению. http://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Ancestry-References – bholben

5

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

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

< обороты >

Включить фиксации, достижимые из (т.е. предков).

^< оборотов >

Исключить фиксации, достижимые из (т.е. предков).

4

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

   master 

    A <- B <- C <- D 
     /
    E <- F 
      feature 

Когда функция была слита в мастера, C был создан с двумя предками. Гит присваивает числа этих предков. Магистральный предком B присваивается 1, а функция предок F присваивается 2.

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

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