Работает ли git log --branches? - PullRequest
28 голосов
/ 15 марта 2011

Я не могу получить git log --branches для правильной фильтрации выходных данных. Кажется, что Git игнорирует это.

Например, голова git log --graph --all --decorate, печать:

* commit 3ae0d17538f787bdde68f37f6644ffe9652d8dc1 (HEAD, feature/branch-ignore)
| Author: Chris Lewis <chris@chris.to>
| Date:   Mon Mar 14 17:39:56 2011 -0700
| 
|     Ignore merge commits, as they're going to be duplicating events
|  
* commit 770534e9d77acb03eaf842440c879aec1c5b5500
| Author: Chris Lewis <chris@chris.to>
| Date:   Tue Mar 8 14:39:40 2011 -0800
| 
|     Removed another remote branch check
| 

Допустим, я хочу отфильтровать по master, что должно означать, что эти коммиты игнорируются. Глава git log --graph --all --decorate --branches=master, также:

* commit 3ae0d17538f787bdde68f37f6644ffe9652d8dc1 (HEAD, feature/branch-ignore)
| Author: Chris Lewis <chris@chris.to>
| Date:   Mon Mar 14 17:39:56 2011 -0700
| 
|     Ignore merge commits, as they're going to be duplicating events
|  
* commit 770534e9d77acb03eaf842440c879aec1c5b5500
| Author: Chris Lewis <chris@chris.to>
| Date:   Tue Mar 8 14:39:40 2011 -0800
| 
|     Removed another remote branch check
|  

Git, похоже, не фильтрует. Кажется, не имеет значения, передан ли --branches с другими аргументами или нет. Моя версия Git git version 1.7.4.1. Кто-нибудь знает, как успешно использовать эту команду?

РЕДАКТИРОВАТЬ: Все, что я хочу иметь, это получить журнал той или иной ветви, без предварительной проверки.

Ответы [ 5 ]

12 голосов
/ 05 февраля 2015

Во-первых, (другой) Адам прав, что не имеет смысла использовать --all для этого: если вы хотите видеть только одну ветку, как указано в вашем вопросе, зачем спрашивать все ветви?

Во-вторых, как уже говорилось в комментариях к другим ответам, вам не нужно --branches;просто сделайте git log mybranch.

В-третьих, я могу объяснить, почему git log --branches=mybranch не работает.git-log(1) справочная страница гласит:

--branches[=<pattern>]
    Pretend as if all the refs in refs/heads are listed on
    the command line as <commit>. If <pattern> is given, 
    limit branches to ones matching given shell glob. If 
    pattern lacks ?, *, or [, /* at the end is implied.

Последнее предложение является ключевым моментом здесь.Если <pattern> - это просто mybranch, то нет символа смещения, поэтому git-log интерпретирует его так, как если бы вы набрали

git log --branches=mybranch/*

, который соответствует только ссылкам в $repo/.git/refs/heads/mybranch/*, то есть ветви, которыеначать с mybranch/.

Существует грязный взлом, чтобы помешать предположению /*:

git log --branches=[m]ybranch

, но я не могу придумать ни одной веской причины, почему вы хотели бычтобы сделать это, а не просто набрать

git log mybranch
12 голосов
/ 15 марта 2011

Поскольку вы указали --all, вы переопределяете любые спецификации веток, которые вы сделали.

3 голосов
/ 15 августа 2013

Кто-нибудь знает, как успешно использовать эту команду?

РЕДАКТИРОВАТЬ: все, что я хочу иметь, это получить журнал той или иной ветви, без предварительной проверки.

Чтобы визуализировать график коммитов на всех ветках и удаленных устройствах, сделайте следующее:

$ git log --graph --branches=* --remotes=* --decorate

Используйте это с другими git-log параметрами для контроля многословия, например --oneline, --name-status и т. Д.

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

$ git fetch --all
3 голосов
/ 21 июля 2012

Допустим, ваша история выглядела так

  d -- e [refs/tags/release1]
 /
a -- b -- c [refs/heads/master]
      \
       f -- g [refs/heads/dev1]
        \
         h [refs/heads/dev2]

Если вы делаете git log --branches, это то же самое git log master dev1 dev2, так что вы увидите коммиты a, b, c, f, g и h. Если вы сделали git log release1 --branches=dev*, это то же самое, что и git log release1 dev1 dev2. Вы увидите a, d, e, b, f, g и h, но не c.

1 голос
/ 27 сентября 2016

Объяснение --branches

git log <commit> перечисляет все коммиты, которые доступны из любого <commit>, указанного в командной строке.

  • --all делает то же самое, но делает вид, что вы перечислили все ссылки в refs/.

  • --branches[=<pattern>] делает то же самое, но делает вид, что вы перечислили все ссылки в refs/heads. Это также позволяет вам ограничиться шаблоном глобуса. В качестве гоча, если вашему шаблону глобуса не хватает ?, , или [, то подразумевается / в конце.

Примеры * +1026 * git log topic1 topic2 topic3 означает список всех коммитов, доступных с topic1, topic2 или topic3. git log -all означает список всех коммитов, которые доступны с любого из ссылок, которые выводятся с git show-ref. git log --branches="topic*" означает список всех коммитов, которые доступны из любой ветви, начинающейся с префикса topic. Источники

https://schacon.github.io/git/git-log.html

https://schacon.github.io/git/git-rev-list.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...