Вы можете попробовать это сами и посмотреть. Вы можете создать локальный репозиторий git для игры:
#! /bin/bash
set -e
mkdir repo
cd repo
git init
touch file
git add file
git commit -m 'init'
echo a > file0
git add file0
git commit -m 'added a to file'
git checkout -b A
echo b >> fileA
git add fileA
git commit -m 'b added to file'
echo c >> fileA
git add fileA
git commit -m 'c added to file'
git checkout -b B
echo x >> fileB
git add fileB
git commit -m 'x added to file'
echo y >> fileB
git add fileB
git commit -m 'y added to file'
cd ..
git clone repo rebase
cd rebase
git checkout master
git checkout A
git checkout B
git rebase master
cd ..
git clone repo onto
cd onto
git checkout master
git checkout A
git checkout B
git rebase --onto master A B
cd ..
diff <(cd rebase; git log --graph --all) <(cd onto; git log --graph --all)
Вы можете использовать "git name-rev", чтобы получить форму, о которой вы спрашиваете. Одна проблема с этой формой заключается в том, что, будучи относительной к ветке, это не постоянное имя. Таким образом, альтернативой является «git describe», которая создает альтернативное понятное имя в зависимости от того, насколько далеко перед тегом находится данный коммит.
Например:
srh@devo16:~/src/git <master>$ git name-rev 3cd7388
3cd7388 master~2
Но затем, после того, как я выполняю «git pull», master ~ 2 может означать что-то еще. Для сравнения:
srh@devo16:~/src/git <master>$ git describe 3cd7388
v1.6.3.1-153-g3cd7388
Теперь "v1.6.3.1-153-g3cd7388" - постоянное имя. Конечно, он все еще немного длинноват (хотя вы можете сократить хэш-бит в конце, указав, например, «--abbrev = 4»), но он сообщает, что 3cd7388 - это 153 изменения после версии 1.6.3.1.
Попробуйте git describe
:
$ git describe --all --contains 90de2680dc54c0d600b0694bd175bd09357a8dba
master~2