Вышел новый Git 2.8.0! В течение пары последних недель, когда релиз был в стадии кандидата, я прошёлся по списку коммитов и заметок к нему, пробуя новые вещи и отмечая интересные моменты. Чтобы сохранить ваше время, предлагаю субъективную выборку фич, которые стоит попробовать. Пользуйтесь!


Краткий вариант push -d, синоним push --delete


Это отличное дополнение как для полноты множества опций, так и для скорости набора команд. Возможно, вы уже используете git branch -d, чтобы удалять локальную ветку, а теперь можно так же сократить команду удаления remote-ветки до git push -d.


git branch -d my-branch       # удаляет локальную ветку, если она уже слита
git push -d origin my-branch  # удаляет remote-ветку в origin-репозитории

Управление потоками и защита от рекурсии для git grep


Пара актуальных возможностей была интегрирована в функциональность git grep:


  1. Теперь вы можете указать, сколько потоков grep должен использовать для поиска по дереву объектов. Добавьте --num-threads к команде или укажите параметр grep.threads в .gitconfig, чтобы сделать настройку постоянной.
    git grep --num-threads=5 <pattern>
  2. Если вы запустите git grep в папке, не принадлежащей git-репозиторию, Git начнёт поиск корня репозитория, рекурсивно проверяя родительскую папку, — это не всегда соответствует тому, что хотелось бы получить в результате. С новой версией стало можно использовать git grep вне git-репозитория, явно указав опцию --no-index. Чтобы сделать такое поведение стандартным, достаточно добавить параметр grep.fallbackToNoIndex в конфигурацию Git.
    git grep --no-index <pattern>

Интерактивный режим pull --rebase


Команду git pull --rebase теперь можно запустить в интерактивном режиме:


git pull --rebase=interactive

Это интересное дополнение к процессу pull rebase, когда вы хотите схлопнуть коммиты или изменить их комментарии прямо во время выполнения pull (не забываем о стандартных предупреждениях об использовании rebase).


Спросите у git config ;)


Теперь git config может показать, где было установлено значение: будь оно определено в конфигурационном файле или blob-файле, прочитано из стандартного ввода или задано в командной строке. Например, я могу спросить: "Где я определил мой алиас st (status)?", — и git config подскажет мне ответ:


git config --show-origin alias.st

file:/Users/np/.gitconfig       status -s

Другие интересности


  • Появился радующий глаз индикатор прогресса, если git blame занимает много времени.
  • Стала доступной новая нотация вида <branch>^{/!-<pattern>}. Она позволяет сослаться на коммит, достижимый из ветки <branch>, но не удовлетворяющий заданному паттерну <pattern>.
  • Можно настроить команду git fetch, чтобы при её выполнении использовался только протокол IPv4 (или IPv6). Добавьте параметр: git fetch -4 или git fetch -6, соответственно.
  • Команда вида git worktree add -B <branchname> не работала должным образом, — эта ошибка исправлена.

Что дальше?


Описанное выше — лишь выборка, релиз содержит гораздо больше! Подробнее о других нововведениях, вошедших в Git 2.8.0 можно узнать в исходном коде и полных заметках к релизу.




Никола Паолуччи — Developer Advocate в Atlassian. Он пишет и рассказывает о git, процессах разработки, совместной работе над кодом, Docker. Перед Atlassian он руководил командами разработки, строил crowd sourcing приложения для геопространственных данных, работал над развёртыванием больших e-commerce систем. Немного фактов о Николе: он активно жестикулирует, когда говорит (будучи итальянцем), живёт в Амстердаме и ездит на Дукати. Николу можно найти в Twitter под псевдонимом @durdn.

Комментарии (9)


  1. aol-nnov
    08.04.2016 03:40
    +8

    да ну, баловство какое-то добавили… особенно умиляет «для скорости набора команд» в удалении бранча

    git push origin :my-branch

    и всё удалится. доступно уже незнамо сколько времени.


    1. gro
      08.04.2016 09:43
      +5

      Ну -d, хоть ясно, что delete, а вот что такое ":" сразу не поймёшь.
      Хотя да, вряд ли кто так часто удаляет ветки, что устал писать --delete.


      1. dovg
        08.04.2016 10:43
        +1

        : — это разделитель имен локального и удаленного бранча.
        То есть git push origin-name :my-branch — это не более, чем запушить «ничего», то есть частный случай команды git push origin-name local-name:remote-name


      1. aol-nnov
        08.04.2016 10:43
        +1

        надо просто вспомнить полный синтаксис git push —
        git push <origin_name> <local_branch_name>:<remote_branch_name>

        и сразу понятно становится «а вот что такое :» :)


        1. aironik
          08.04.2016 12:44
          +3

          понятно становится тогда, когда знаешь, что такое работает. Но то, что пустота пушится в бранч и это действие заменяет пустотой ветку — до этого нужно додуматься (а с моей точки зрения это больше похоже на баг). Ну и удаление становится однообразным.


          1. aol-nnov
            08.04.2016 13:03

            Know thy tools!


    1. mamontovdmitriy
      08.04.2016 16:17
      +1

      поддерживаю, буду пользоваться старым добрым git push origin :my-branch


    1. detouched
      08.04.2016 16:25
      +1

      Привыкнуть можно ко всему, безусловно. Но что плохого в том, чтобы добавить опцию, согласованную с опциями других команд? Согласованность интерфейса (неважно, какого именно: API, UI, CLI, ...) — это важная характеристика.

      Если же рассматривать замечание автора про скорость набора в отрыве от всего остального, то я согласен, аргумент слабый. Но стоит ли к нему придираться?


  1. Punk_UnDeaD
    08.04.2016 17:16

    А просто удалить сабмодуль одной командой всё так же нельзя?