2010-06-09 2 views
11

Когда я делаю git tag, я не всегда прекрасно помню, является ли HEAD ~ 6 (например) инклюзивным или эксклюзивным.Есть ли способ получить SHA фиксации из своего сообщения?

Учитывая, что большинство моих коммитов имеют префикс номера проблемы, я задавался вопросом, есть ли какая-нибудь волшебная команда для поиска SHA-сообщения из части ее сообщения.

Я знаю, что это легко сделать git log и работать оттуда, но я хочу более легко :)

EDIT: Кто-то также задал противоположный вопрос: In Git, is there a way to get the “friendly” name for an arbitrary commit?

ответ

17

Вы можете использовать синтаксис :/blah, чтобы указать фиксацию, чье сообщение коммита начинается с заданного текста.

E.g.

git show ":/Issue #299" 

Это действительное место, где может использоваться фиксация. Например.

git cherry-pick ":/Issue #299" 

Если вам действительно нужен SHA-1 фиксации, вы можете просто использовать rev-parse.

git rev-parse ":/Issue #299" 

Смотрите "SPECIFYING REVISIONS" section of the git rev-parse man page:

двоеточие, а затем через слэш, а затем текст:
Это имена коммита, чьи фиксации сообщение начинается с указанного текста.
Это имя возвращает самую младшую подходящую фиксацию, доступную из любого ref.
Если сообщение фиксации начинается с !, вы должны повторить это; специальная последовательность :/!, за которой следует еще что-то, кроме !.

+0

Что произойдет, если текст не является уникальным? – Benjol

+0

@Benjol: IIRC, он находит самую молодую доступную фиксацию, вам нужно будет проверить документацию. –

+0

Спасибо, любая идея ключевого слова для поиска, что up ': /' не работает слишком хорошо ... – Benjol

1

Try

git rev-list --grep='message excerpt' HEAD 

Это будет только список коммитов, которые являются предками HEAD. Если вы хотите найти все коммиты в репозитории (включая те, которые не являются предками HEAD), я не уверен, как это сделать, кроме как вручную вручную управлять всеми ветвями ветвей и запускать эту команду. (Вероятно, есть способ, я просто не знаю, что это может быть)

8
git log --grep=word 

должно помочь найти соответствующее сообщение.
(в противоположность поиску commit contents, где мерзавец log -S (опция кирка) или git grep являются более подходящими)

Добавить различные варианты форматирования, как

git log --grep=word --pretty=oneline 
git log --grep=word --pretty=format:"%h" 

(последний показ только SHA1), и вам хорошо идти.


Смотрите также «Fun with git log --grep»

git log --grep=frotz --grep=nitfol --since=1.month 

Это находит коммиты, которые произошли в течение последнего месяца, и упомянутых либо frotz или nitfol в своих сообщениях журнала.
Как и в случае с обычным «git grep», использование более чем одного шаблона означает «то или это».

В статье отмечается, что git grep является линией ориентированный, и использовать опцию --all-матч в этой git log --grep команды.

Путь «git log» В семействе используется механизм grep именно для этого «все ли совпадение?» а не «показать мне линии, соответствующие этим критериям». Это позволяет использовать этот механизм следующим образом:

Это покажет фиксации, которые упоминают frotz и написанный Линусом.

+0

Я искал что-то, что я мог бы использовать/использовать напрямую в другой команде, поэтому, если вы добавите '--pretty = format:"% h "' к этому, я буду отмечать вас как ответ;) – Benjol

+0

Добавление --pretty = онлайн к команде должно улучшить удобочитаемость еще больше. – Unknown

+0

@Benjol: добавлены опции форматирования. – VonC