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


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» и т. Д.


16

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

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

<Оборотов>

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

^ <Оборотов>

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


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. если вы выполнили слияние трех веток.


7

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


4

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



1

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

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


3
Эта ссылка может быть ближе к предполагаемому месту. git-scm.com/book/en/v2/…
bholben
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.