В этой статье мы обсудим разные Git-команды, которые могут оказаться полезными для разработчика или специалиста по Big Data. Вы узнаете, как проверять, удалять и приводить код в порядок. А еще рассмотрим способы выхода из Vim и экономию времени с помощью псевдонимов Bash и конфигурации редактора Git.

Skillbox рекомендует: Практический курс «Мобильный разработчик PRO».

Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».

Проверяем все и вся




  • git diff— Посмотреть все изменения файла локально. При указании имени файла изменения будут показаны только для него.
  • git log?—? Просмотреть историю коммита. Может также использоваться для файла с git log -p my_file. Введите q, чтобы выйти.
  • git blame my_file — Просмотреть, кто, что и когда изменил в my_file.
  • git reflog?—? Показать журнал изменений в заголовке локального репозитория. Отличный вариант для поиска утраченных данных.

Эти команды позволяют быстро проверить все, что нужно, без всяких проблем. Если что-то не так, Git дает большое количество возможностей для удаления или отката коммитов и изменений в файлах.

Вернуть, как было


  • git reset, git checkout и git revert — команды, которые используются, чтобы отменить какие-либо действия. Но они не такие и простые, с ними надо уметь обращаться.
  • git reset, git checkout могут использоваться как для коммитов, так и для обычных файлов.
  • git revert используется только для работы с коммитами.

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

Если вы работаете в коллективе и коммиты общие, тогда ваш выбор — git revert.



У каждой команды есть целый набор опций. Вот наиболее употребляемые:
git reset --hard HEAD — отмена проиндексированных и непроиндексированных изменений с момента последнего коммита.

Указываем вместо HEAD определенный коммит, чтобы отменить изменения, произошедшие после него. --hard отбрасываются оба типа изменений, о которых говорилось выше.

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

git checkout my_commit — отмена изменений my_commit.

HEAD часто используется для my_commit, чтобы отменить изменения в вашем локальном рабочем каталоге с момента последней фиксации.

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

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

git revert my_commit — отмена последствий изменений в my_commit. revert выполняет новый коммит после отмены изменений.

revert безопасен для общих проектов, поскольку команда не перезаписывает изменения, от которых могут зависеть другие ветки.



Иногда вы просто хотите удалить неотслеживаемые файлы в вашем локальном каталоге. К примеру, запустив какой-то код, который создал много разных типов файлов, которые вам не нужны. К сожалению. Clean поможет мгновенно удалить их!

git clean -n — удаление неотслеживаемых файлов в локальной рабочей директории.

-n — флаг для пробного запуска, ничего не удаляется.
-f — флаг для удаления файлов.
-d — флаг для удаления неотслеживаемых директорий.

По умолчанию неотслеживаемые файлы .gitignore не будут удалены, но это можно изменить.



Наводим порядки


git commit --amend — добавляем поэтапные изменения в последний коммит.

Если ничего не проиндексировано, команда позволяет вам редактировать последнее сообщение коммита. Используйте команду только в том случае, если коммит не был объединен с удаленной master-веткой.

git push my_remote --tags — отправка локальных тэгов в удаленный репозиторий. Хороший вариант для присвоения версий изменениям.

Помогите, я застрял в Vim и не могу выбраться!


Git в некоторых случаях открывает сессию редактора Vim. И если вы не слишком хорошо знакомы с ним, то можете оказаться в затруднительной ситуации. Да и не только вы — к примеру, на Stack Overflow более 4 тысяч пользователей хотят знать, как выбраться из Vim.



Вот четырехэтапный план, который поможет закрыть Vim и сохранить изменения:

  • Нажимаем i.
  • Вводим сообщение коммита в первой строке.
  • Esc.
  • Вводим :x.

Все, вы свободны!

Изменяем редактор по умолчанию.

Вы можете избавиться от Vim совсем, если смените редактор по умолчанию. Вот команды для работы с популярными редакторами. Пример выбора другого редактора, в нашем случае Atom:

git config --global core.editor «atom --wait»

Ярлыки для команд Git


А вот способ, который позволяет добавлять ярлыки для Git-команд, для вашего .bash_profile.

alias gs='git status '
alias ga='git add '
alias gaa='git add -A '
alias gb='git branch '
alias gc='git commit '
alias gcm='git commit -m '
alias go='git checkout '

Больше информации о .bash_profile можно получить здесь.

Что касается способа, приведенного выше, то теперь вы можете использовать gs вместо git status.

Собственно, это все на сегодня. Если есть возможность, укажите в комментариях, какие Git-команды используете вы и почему.
Skillbox рекомендует:

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


  1. ilyapirogov
    01.03.2019 16:20
    +6

    git stash — отложить все текущие изменения в локальное хранилище
    git stash pop — забрать последние сохраненные изменения из хранилища


    Полезно если вы не хотите пока комитить код, но вам срочно нужно переключится на другую ветку.


    1. Graf54r
      01.03.2019 18:09
      +2

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


    1. SVlad
      02.03.2019 19:03

      Полезно если вы не хотите пока комитить код, но вам срочно нужно переключится на другую ветку.

      Всегда в таких случаях делаю commit, озаглавленный WIP — нагляднее и не забудешь. Потом просто делаю amend.
      stash скорее нужен для упрощённого rebase между ветками.


  1. Prost971
    01.03.2019 16:21

    +1 статья в закладки. Хорошие шпаргалки по гиту на весь — золото)


  1. JTG
    01.03.2019 16:36
    +11

    Отвратительная статья. Если бы я не умел работать с git, ничего бы не понял. Даже хуже, после этой статьи:
    — У меня есть изменённые файлы, но git diff ничего не показывает ;( Что ещё за staging area?
    — Я сделал git reset --hard и всё пропало!
    — "#1234 foo" и «Revert „#1234 foo“» потому что «работаю в коллективе и коммиты общие, мой выбор — git revert».
    — git commit --amend не работает! Но ведь я читал статью, мой коммит не был объединен с удаленной master-веткой! Я же пушил его только в develop!


    1. fireSparrow
      01.03.2019 17:20
      +1

      Так нигде и не сказано, что это вводная статья для чайников.
      Статья называется «10 Git-команд, которые стоит знать разработчику». И то, что обещает название, в тексте полностью раскрыто.


      1. JTG
        01.03.2019 17:48
        +4

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

        То же самое с

        Не забывайте убедиться в том, что вы не отменяете коммит из удаленной ветки, от которой зависят другие члены команды.
        Убедиться при помощи телепатии. Про «git branch -r --contains» разработчику, видимо, знать не стоит. Спасибо, Jeff Hale, очень полезная статья!


        1. fireSparrow
          01.03.2019 18:01

          Это просто шпаргалка.
          Если она ничего нового вам не сообщила — то просто поищите другие материалы по гиту. Есть пользователи, которые посчитали её полезной для себя, если судить по оценкам.


  1. usego
    01.03.2019 16:46
    -4

    Оно всё надо при пользовании Source Tree? До сих пор в командной строке использую максимум 5 команд и то нечасто. Всё остальное на много удобнее в UI смотреть и делать.


  1. nick_gabpe
    01.03.2019 19:04
    +2

    Вопрос "How to exit vim?" имеет всего 4193 «голоса за», а вот просматривается гораздо чаще viewed 1,853,728. Так что скорее не 4 тысячи, а почти 2 миллиона человек :)


  1. vyo
    01.03.2019 19:19
    +3

    Полному нубу — бесполезно. Новичку — вредно. Немного попользовавшемуся гитом — снова бесполезно.
    Даже не знаю, на кого статья ориентирована. Сам гит освоил по чему-то вроде офф. мануала, а дальше — StackOverflow (не забывая читать непринятые ответы, конечно).


  1. AnROm
    01.03.2019 22:04
    +2

    И еще одна очередная статья про N Git-команд, которые нужно знать разработчику


  1. netch80
    01.03.2019 23:58
    +3

    Вот так лучше:

    > git blame my_life — Просмотреть, кто, что и когда изменил в my_life.

    всего две буквы переставил, а какой эффект :)


    1. KvanTTT
      02.03.2019 00:57

      Тоже сначала так прочитал :)


  1. KvanTTT
    02.03.2019 00:58
    +1

    Чтобы не использовать ярлыки для команд Git, можно просто использовать GUI. Команды вводить не придется, да и работать так более наглядно.


    1. immaculate
      02.03.2019 04:52
      -1

      Я не понимаю, зачем нужен GUI для Git. Когда-то поставил GitKraken, помучился пару дней, и снес.


      Git — из категории настолько мощных инструментов, для которых GUI скорее помеха, чем помощь. И наделать проблем проще скорее из GUI, чем из командной строки.


      По опыту, который есть у меня, GUI пользуются только те, кто сумел освоить лишь pull/commit/push и ничего более (https://xkcd.com/1597/). И в случае любой реальной проблемы (даже проблемки), эти люди беспомощны. И их все время приходится водить за руку объясняя даже такие элементарные вещи, как правильно называть ветки.


      Как только человек учится пользоваться git в полной мере, он уже переходит в командную строку. Есть множество ситуаций в жизни, которые никак не могут быть предусмотрены заранее создателями любого GUI. Во многих GUI инструментах даже rebase сделать сложно (требуются минуты времени и десятки кликов мыши), тогда как в командной строке достаточно написать git rebase -i HEAD~3.


      1. gturk
        02.03.2019 12:32
        +1

        В гуе гораздо удобнее перед комитом ещё раз критическим взглядом посмотреть на то то что ты там наколбасил и точечно отменить непонравившиеся куски.
        Да и вобще для каждодневной работы, лично мне, удобнее гуй — набивать руками имена файлов и веток сомнительное удовольствие. Ну а если нужно хотябы заребейзиться или что-то более экзотичное, то да, там уже в консоль.
        Плюс гуй всётаки сглаживает кривую обучения


        1. Danik-ik
          02.03.2019 14:23

          Пользуюсь Смартгитом, плачу деньги (так как для работы). За пару лет единственное, что не смог в нём сделать — какую-то экзотику вроде мержа поддеревьев без общего корня. Всегда вижу, какая команда выполняется в результате моего действия (помогает понимать и автоматизировать). Классные дифф, редактор индекса (трёхоконный), конфликт резолвер. Прекрасное, наглядное представление всего, что надо. Они достигли уровня, когда инструмент намного больше помогает, чем мешает.


          А Кракена тоже снёс в тот же день, как поставил — кажется, он посмел сыпаться с ошибками. Хотя картинка у него красивая, да...


          Кажется, важно не только gui или cli, но и то, что это конкретно за gui — то ли для тех, кто ничего на хочет видеть лишнего, то ли для тех, кто хочет повысить свою эффективность, не теряя при этом контроля за процессом. И для самостоятельного обучения, к примеру, наглядный результат — вообще очень полезная вещь.


        1. KvanTTT
          03.03.2019 03:22

          Ну а если нужно хотябы заребейзиться

          Это как раз тоже удобней делать через GUI. Ну во всяком случае GitExtensions поддерживает.


      1. SVlad
        02.03.2019 19:01

        Собственный git gui самого гита вполне удобен для повседневной работы.
        Он наглядно показывает изменения в рабочей области, в staging и дерево коммитов.
        Ну и некоторые частые команды там проще, чем в консоли. Например, есть отдельная команда revert для файлов, и для строк в файлах.


  1. ivan_suroegin
    02.03.2019 15:12

    А зачем пробелы перед закрывающимися кавычками в ярлыках для команд Git?
    При наборе, например,


    ga .

    перед точкой будет два пробела, это пофиг, согласен, отработает как надо, но это немного странно, мне кажется.