Есть ли какой-нибудь способ получить все коммиты между тегами с удаленного мастера?
Мне не понятно, что вы имеете в виду под retrieve Кроме того, что вы подразумеваете под между . Но в целом, в большинстве случаев вы можете просто запустить git fetch
и использовать имена тегов в вашем хранилище. Ваш репозиторий будет содержать копии имен тегов в своем репозитории. При необходимости вы можете запустить git fetch --tags
; см. ниже.
Long
Помните, что в общем случае Git репозиторий содержит все коммитов: один клон так же хорош, как и другой. 1 Если у какого-то клона есть новые коммиты, которых у вас еще нет, вы просто запускаете git fetch
, чтобы ваши Git вызвали их Git, а их Git дали вам коммиты, которых у вас не было ; и теперь у вас есть все их коммиты. (У них, вероятно, есть большинство ваших, но если у вас есть те, которых у них не было, у вас все еще есть такие, а у них их еще нет.)
Какие имена веток, имена тегов, имена удаленного отслеживания и любые другие другие имена do в репозитории позволяют вам выбрать любой конкретный коммит. То есть каждый коммит имеет уникальное имя, которое является его большим уродливым идентификатором ha sh, таким как c7a62075917b3340f908093f63f1161c44ed1475
. Эти имена ужасны для людей, поэтому мы в основном их не используем. Вместо этого у нас есть Git, помните некоторые специфические c коммиты для нас, под каким-то читаемым человеком именем, таким как master
- имя ветви - или v2.1
, имя тега. Несколько человекочитаемых имен могут ссылаться на одно и то же имя Git га sh.
Ключевые различия между ответвлением , такими как master
, и тегом имя типа v2.1
:
Имена ветвей должны двигаться со временем, чтобы мы могли иметь больше коммитов. На самом деле они настолько мобильны, что перемещаются автоматически: когда вы git checkout
вводите какое-то имя ветки, а затем делаете новый коммит, имя ветви автоматически идентифицирует новый коммит, который вы только что сделали сделали. Сам новый коммит ссылается, как обычно Git назад, на предыдущий коммит с ветвлением.
Имена тегов, напротив, никогда не должны перемещаться. Если тэг xyz
names фиксирует c7a62075917b3340f908093f63f1161c44ed1475
сегодня, он должен назвать тот же коммит завтра. Он должен был назвать тот же коммит вчера, если имя тега существовало вчера. Некоторое программное обеспечение на самом деле зависит от этого. 2
Имена филиалов private , не разделяются. Когда вы клонируете репозиторий, ваш клон переименовывает все их ответвления имен, чтобы стать вашими именами удаленного отслеживания . То есть, их master
становится вашим origin/master
. 3 Конечно, вам разрешено создавать собственные имена ветвей, а затем сохранять их в syn c, но Вы должны затем сохранять их в синхронизации c: Git не делает этого автоматически. 4
Tag имен, по напротив, предназначены для совместного использования во всех клонах. Например, когда вы клонируете репозиторий с тегами v1.0
- v1.7
, вы получаете свои собственные имена тегов v1.0
- v1.7
, но они в буквальном смысле точно такие же, как в исходном репозитории с v1.0
через v1.7
. Когда вы запускаете git fetch
и получаете новые коммиты, если один из них помечен v1.8
, вы получаете новый v1.8
. 5
, потому что Из этих правил обычно нет необходимости делать что-то особенное. Если вы git clone <url>
вы получаете их коммиты и их теги, а каждый последующий git fetch origin
получает вам любые новые коммиты, которые они создали, вместе с любыми новыми тегами, которые они сделали для новых коммитов. Однако, если они go вернутся и добавят новые имена тегов для старых коммитов, вам иногда может понадобиться запустить git fetch --tags
, как отмечено в сноске 5.
Проблема с разговором о Коммиты между Некоторые конкретные выбранные коммиты заключаются в том, что коммиты образуют направленный Acycli c граф или DAG, а не просто линейную цепочку. Если у нас есть линейная цепь, как это:
... <-F <-G <-H ...
тогда понятие между является более ясным: коммиты между F и H, включая оба ребра, являются F
, G
и H
, хотя в другом порядке, начиная с Git работает в обратном направлении. Если у нас есть два имени тега, указывающих на коммиты F
и H
соответственно:
...--F--G--H--...
^ ^
| |
tag:v1 tag:v2
, тогда запись Git v1..v2
(обратите внимание на две точки здесь) выбирает коммиты H
и G
. Причина, по которой F
исключен, заключается в том, что v1..v2
действительно означает v2 ^v1
, т. Е. Выберите все коммиты, начиная с H
и работая в обратном направлении: H
, G
, F
и все до F
тоже; но затем выберите коммиты, начинающиеся с F
и работающие в обратном направлении, и выкиньте их из списка . Поэтому из H
, G
, F
и ранее мы удаляем часть F
-and-before, оставляя только H
и G
.
, чтобы избежать исключения commit F
, нам просто нужно начать исключение с любого коммита (ов) до до F
. Таким образом, мы получаем H
и G
и F
и отбрасываем все, что было раньше (очевидно, коммит E
?).
Но мы можем сделать цепочки коммитов этой ветвью (а позже, возможно, объединить ):
tag:v1.4
|
v
I--J--...
/
...--G--H
\
K--L--...
^
|
tag:v1.3
Какие коммиты между v1.4
и v1.3
? Git имеет ответ; Вам решать, имеет ли этот ответ смысл для вашего варианта использования. (Ответ Git заключается в том, что v1.3..v1.4
выбирает коммиты J
и I
, но не L
, * K
, * H
, и ничего до H
).
1 Мелкие клоны являются большим исключением из этого правила, но мы можем предположить, что ваш клон не мелкий, поскольку вы не упомянули об этом.
2 Для Например, система модулей Go предполагает, что имена тегов Git никогда не перемещаются из одного коммита Git в другой. Это позволяет ему кэшировать сопоставление tag-ha sh -ID.
3 Обратите внимание, что тип клона, который достигается кнопкой "fork" на большинстве хостинг-провайдеров, является исключение здесь: он копирует имена ветвей своих форков в имена ветвей вашей вилки. Но после этого они независимы.
4 Это игнорирует то, что Git называет зеркальный клон , но опять же, все в порядке: мы, вероятно, не говорим о зеркальных клонах здесь.
5 Это все под вашим контролем: git fetch --tags
получает все теги, git fetch --no-tags
не получает тегов, и по умолчанию это своего рода странная смесь, где вы получите теги, которые go с коммитами, которые вы получаете, но не любые другие теги. Позже git fetch --tags
создаст новые теги, если они создали новые теги для старых коммитов. Вы также можете запустить git fetch
с различными другими опциями для принудительного создания и / или обновления тегов и / или сокращения.