Вы не можете.Ну, не напрямую, во всяком случае.Набор всех коммитов, достижимых из HEAD
, прост: HEAD
, выбранный в качестве диапазона ревизий (в отличие от HEAD
, выбранный в качестве одного коммита ).Но:
... причина в том, что я загружаю его во внешний инструмент, который принимает только диапазон ревизий ...
Вот где мы имеемпроблема, с довольно хакерским решением.Мы можем проиллюстрировать это с помощью git cherry-pick
, потому что git cherry-pick
ведет себя по-разному в зависимости от того, назовем ли мы один коммит:
git cherry-pick a123456
или диапазон:
git cherry-pick cafedad..a123456
, например.Первый выбирает (копирует) только один коммит a123456
, а второй копирует все коммиты , достижимые с a123456
, исключая любые коммиты, достижимые с cafedad
.
(Это делаетне делает cherry-pick
само по себе плохим, потому что это не очень разумно для cherry-pick, начиная с корневого коммита. Однако, действительно имеет смысл использовать git rebase
, начиная с корня, поэтому git rebase -i
теперь имеет флаг --root
. Проблема немного отличается, но тесно связана.)
То есть предположим, что у нас есть следующая цепочка коммитов:
A--B--C--D--E--F <-- master
\
G--H <-- branch
с фактическимИдентификатор хеша коммита E
равен cafedad
, а фактический идентификатор хеша коммита H
равен a123456
.Если мы хотим скопировать два branch
коммита поверх F
, мы можем git checkout -b new master
получить это:
A--B--C--D--E--F <-- master, new (HEAD)
\
G--H <-- branch
и затем запустить cherry-pick
с синтаксисом диапазона, чтобы получить это:
G'-H' <-- new (HEAD)
/
A--B--C--D--E--F <-- master
\
G--H <-- branch
где G'
и H'
- копии двух интересных коммитов.
Но что если по какой-то причине - это то, где git cherry-pick
равно , а не хороший пример - мы хотим скопировать коммиты с A
по F
включительно?Мы не можем git cherry-pick ..master
и даже git cherry-pick badf00d..master
, если commit A
имеет хэш-идентификатор badf00d
.Первый просто копирует F
, а второй копирует B-C-D-E-F
, опуская A
.
Решение состоит в том, чтобы создать отключенный коммит, чтобы мы могли принудительно установить диапазон синтаксис исключая ничего .То есть, если у нас есть:
A--B--C--D--E--F <-- master
\
G--H <-- branch
, мы можем создать новый коммит I
, который находится в совершенно отдельном графике:
A--B--C--D--E--F <-- master
\
G--H <-- branch
I <-- independent
Теперь мы можем написать independent..master
,что означает все коммиты, работающие в обратном направлении с F
, но исключая все коммиты, работающие в обратном направлении с I
.Начиная с I
и работая в обратном направлении, мы перечисляем commit I
: поэтому мы выбросим I
из нашего набора F
-on-back.Это оставляет нас с выбранными коммитами A-B-C-D-E-F
, так как мы хотим.
Итак:
git checkout --orphan independent
git commit -m 'pointless commit made to satisfy external tool'
, после чего мы можем запустить git checkout
для обновления HEAD
и затем использовать:
external-tool independent..HEAD
, который инструмент увидит в качестве диапазона и сделает выбор диапазона ревизий, который включает все коммиты, достижимые с HEAD
, в то же время отбрасывая коммиты ветки, не выбранной в любом случае ("сиротой").