Как установить git clone

The git clone command is used to create a copy of a specific repository or branch within a repository.
Git is a distributed version control system. Maximize the advantages of a full repository on your own machine by cloning.
What Does git clone Do?
When you clone a repository, you don’t get one file, like you may in other centralized version control systems. By cloning with Git, you get the entire repository — all files, all branches, and all commits.
Cloning a repository is typically only done once, at the beginning of your interaction with a project. Once a repository already exists on a remote, like on GitHub, then you would clone that repository so you could interact with it locally. Once you have cloned a repository, you won’t need to clone it again to do regular development.
The ability to work with the entire repository means that all developers can work more freely. Without being limited by which files you can work on, you can work on a feature branch to make changes safely. Then, you can:
- later use git push to share your branch with the remote repository
- open a pull request to compare the changes with your collaborators
- test and deploy as needed from the branch
- merge into the main branch.
How to Use git clone
Common usages and options for git clone
- git clone [url] : Clone (download) a repository that already exists on GitHub, including all of the files, branches, and commits.
- git clone —mirror : Clone a repository but without the ability to edit any of the files. This includes the refs, or branches. You may want to use this if you are trying to create a secondary copy of a repository on a separate remote and you want to match all of the branches. This may occur during configuration using a new remote for your Git hosting, or when using Git during automated testing.
- git clone —single-branch : Clone only a single branch
- git clone —sparse : Instead of populating the working directory with all of the files in the current commit recursively, only populate the files present in the root directory. This could help with performance when cloning large repositories with many directories and sub-directories.
- `git clone —recurse-submodules[=<pathspec]: After the clone is created, initialize and clone submodules within based on the provided pathspec. This may be a good option if you are cloning a repository that you know to have submodules, and you will be working with those submodules as dependencies in your local development.
You can see all of the many options with git clone in git-scm’s documentation.
Examples of git clone
The most common usage of cloning is to simply clone a repository. This is only done once, when you begin working on a project, and would follow the syntax of git clone [url] .
git clone A Branch
git clone —single-branch : By default, git clone will create remote tracking branches for all of the branches currently present in the remote which is being cloned. The only local branch that is created is the default branch.
But, maybe for some reason you would like to only get a remote tracking branch for one specific branch, or clone one branch which isn’t the default branch. Both of these things happen when you use —single-branch with git clone .
This will create a clone that only has commits included in the current line of history. This means no other branches will be cloned. You can specify a certain branch to clone, but the default branch, usually main , will be selected by default.
To clone one specific branch, use:
git clone [url] —branch [branch] —single-branch
Cloning only one branch does not add any benefits unless the repository is very large and contains binary files that slow down the performance of the repository. The recommended solution is to optimize the performance of the repository before relying on single branch cloning strategies.
git clone With SSH
Depending on how you authenticate with the remote server, you may choose to clone using SSH.
If you choose to clone with SSH, you would use a specific SSH path for the repository instead of a URL. Typically, developers are authenticated with SSH from the machine level. This means that you would probably clone with HTTPS or with SSH — not a mix of both for your repositories.
- git branch : This shows the existing branches in your local repository. You can also use git branch [banch-name] to create a branch from your current location, or git branch —all to see all branches, both the local ones on your machine, and the remote tracking branches stored from the last git pull or git fetch from the remote.
- git pull : Updates your current local working branch with all new commits from the corresponding remote branch on GitHub. git pull is a combination of git fetch and git merge .
- git push : Uploads all local branch commits to the remote.
- git remote -v : Show the associated remote repositories and their stored name, like origin .
Get started with git and GitHub
Review code, manage projects, and build software alongside 40 million developers.
Настройка репозитория
Этот обучающий материал включает в себя обзор настройки репозитория в системе контроля версий Git. На этой странице вы узнаете, как инициализировать репозиторий Git для нового или существующего проекта. Ниже представлены примеры жизненного цикла для репозиториев, созданных локально и клонированных из удаленных репозиториев. Для работы с этим руководством требуются начальные знания о работе с интерфейсом командной строки.
В данном руководстве обсуждаются следующие основные вопросы:
- Инициализация нового репозитория Git
- Клонирование существующего репозитория Git
- Коммит измененной версии файла в репозиторий
- Конфигурирование репозитория Git для удаленной совместной работы
- Распространенные команды для управления версиями Git
По окончании данного модуля вы должны уметь создавать репозиторий Git, использовать основные команды Git, выполнять коммит измененного файла, просматривать историю проекта и настраивать соединение с сервисом хостинга Git (Bitbucket).
Что такое репозиторий Git?
Репозиторий Git — это виртуальное хранилище проекта. В нем можно хранить версии кода для доступа по мере необходимости.
Инициализация нового репозитория: git init
Для создания нового репозитория используется команда git init . Команду git init выполняют только один раз для первоначальной настройки нового репозитория. Выполнение команды приведет к созданию нового подкаталога .git в вашем рабочем каталоге. Кроме того, будет создана новая главная ветка.
Создание версии существующего проекта с использованием нового репозитория Git
В этом примере предполагается, что у вас уже есть папка проекта, в которой вы и хотите создать репозиторий. Выполните команду cd для перехода к папке проекта, а затем выполните команду git init .
Указание в команде git init существующего каталога проекта приведет к исполнению описанной выше инициализации, но только на уровне этого каталога проекта.
Перейдите на страницу git init, чтобы получить подробные сведения о команде git init .
Клонирование существующего репозитория: git clone
Если проект уже настроен в центральном репозитории, наиболее распространенным способом создать его локальный клон является команда clone. Клонирование, как и команда git init , обычно выполняется один раз. Получив рабочую копию, разработчик в дальнейшем выполняет все операции контроля версий из своего локального репозитория.
Команду git clone выполняют для создания копии (клонирования) удаленного репозитория. В качестве параметра в команду git clone передается URL-адрес репозитория. Git поддерживает несколько различных сетевых протоколов и соответствующих форматов URL-адресов. В этом примере используется SSH-протокол Git. URL-адреса SSH в Git имеют следующий шаблон: git@HOSTNAME:USERNAME/REPONAME.git
Пример URL-адреса SSH в Git имеет вид: git@bitbucket.org:rhyolight/javascript-data-store.git , а ниже приведены значения шаблонных параметров:
- HOSTNAME: bitbucket.org
- USERNAME: rhyolight
- REPONAME: javascript-data-store
После исполнения команды последние версии файлов из главной ветки удаленного репозитория будут загружены и помещены в новый каталог. Имя нового каталога будет соответствовать параметру REPONAME. В данном случае это javascript-data-store . В каталоге будет вся история удаленного репозитория и только что созданная главная ветка.
Дополнительную информацию об использовании команды git clone и поддерживаемых форматах URL-адресов в Git см. на странице git clone.
Сохранение изменений в репозитории: git add и git commit
У вас появился репозиторий, созданный путем клонирования или инициализации. Теперь вы можете выполнять коммиты изменений в версиях файлов. В следующем примере предполагается, что вы настроили проект в каталоге /path/to/project . В этом примере предлагаются следующие шаги.
- Измените каталоги на /path/to/project
- Создайте новый файл CommitTest.txt с текстом
«тест для обучения работе с Git»
По завершении этого примера файл CommitTest.txt добавится к истории репозитория, и репозиторий будет отслеживать последующие изменения в файле.
В этом примере представлены две новые команды в Git: add и commit . Этот очень упрощенный пример. Подробнее обе команды объяснены на страницах git add и git commit. Команду git add часто используют с флагом —all . Команда git add —all добавляет все измененные и неотслеживаемые файлы в репозиторий и обновляет дерево изменений репозитория.
Совместная работа в разных репозиториях: git push
Важно понимать, что рабочая копия в Git существенно отличается от рабочей копии, получаемой при загрузке исходного кода из репозитория SVN. В отличие от SVN, в Git нет разницы между рабочими копиями и центральным репозиторием — все они являются полноценными репозиториями Git.
Поэтому совместная работа в Git принципиально отличается от совместной работы в SVN. В SVN работа строится на отношении между центральным репозиторием и рабочей копией, а модель совместной работы в Git основана на взаимодействии между репозиториями. Вместо загрузки рабочей копии в центральный репозиторий SVN в Git вы отправляете коммиты из одного репозитория в другой или копируете их в обратном направлении.
Вы легко можете задавать особую роль определенным репозиториям Git. Например, обозначив один из репозиториев Git как «центральный», вы можете воспроизвести централизованный процесс с использованием Git. Такой подход требует общих договоренностей, он не встроен в саму систему контроля версий.
Сравнение чистых и клонированных репозиториев
Если в предыдущем разделе («Инициализация нового репозитория») для настройки локального репозитория вы использовали команду git clone , ваш репозиторий уже готов к удаленной совместной работе. Команда git clone автоматически настроит репозиторий, в котором значение remote будет соответствовать URL-адресу Git, из которого был клонирован репозиторий. Это означает, что после изменений файла и выполнения коммита вы можете сразу выполнить команду git push , чтобы отправить эти изменения в удаленный репозиторий.
Если вы использовали команду git init для создания репозитория с нуля, у вас не будет удаленного репозитория, в который можно помещать изменения. Зачастую для инициализации нового репозитория пользователь переходит на сервис Git-хостинга (например, Bitbucket) и создает репозиторий там. Данный сервис предоставит URL-адрес Git, который затем можно добавить в локальный репозиторий Git. После этого можно выполнять команду git push в репозиторий на хостинге. После создания удаленного репозитория на выбранном хостинге вам понадобится обновить локальный репозиторий, выполнив привязку. Этот процесс описывается далее в руководстве по установке и настройке.
Если вы предпочитаете поддерживать собственный удаленный репозиторий, вам нужно создать «чистый репозиторий». Для этого команды git init и git clone принимают аргумент —bare . Наиболее популярная причина использования чистого репозитория — создание удаленного центрального репозитория Git
Конфигурирование и настройка: git config
После настройки удаленного репозитория его URL-адрес нужно добавить в локальный файл git config , а также создать вышестоящую ветку для локальных веток. Такую возможность предоставляет команда git remote .
Эта команда привяжет удаленный репозиторий по адресу к ссылке в вашем локальном репозитории . После привязки удаленного репозитория в него можно будет отправлять локальные ветки с помощью команды push.
Эта команда поместит ветку локального репозитория с именем в удаленный репозиторий .
Дополнительную информацию о команде git remote см. на странице удаленной работы в Git .
Помимо конфигурирования URL-адреса удаленного репозитория, вам может потребоваться установить глобальные параметры Git, например имя пользователя или электронный адрес. Команда git config позволяет настроить инсталляцию Git (или отдельный репозиторий) из командной строки. С помощью этой команды можно установить любые настройки: от информации о пользователе до его предпочтений и характеристик репозитория. Ниже перечислены распространенные варианты конфигурации.
Git хранит варианты конфигурации в трех различных файлах, позволяющих ограничивать область видимости на уровне отдельных репозиториев (локальный), пользователя (глобальный) или всей системы (системный):
- Локальный: /.git/config — настройки на уровне репозитория.
- Глобальный: /.gitconfig — настройки на уровне пользователя. Здесь хранятся настройки с флагом —global.
- Системный: $(prefix)/etc/gitconfig — настройки на уровне всей системы.
Укажите имя автора, которое будет использоваться для всех коммитов в текущем репозитории. Обычно для настройки параметров конфигурации для текущего пользователя используется флаг —global .
Эта команда задает имя автора, которое будет использоваться для всех коммитов, выполненных текущим пользователем.
Добавление аргумента —local или выполнение команды без параметра уровня конфигурации приведет к установке значения user.name для текущего локального репозитория.
Эта команда задает адрес электронной почты автора, который будет использоваться для всех коммитов, выполненных текущим пользователем.
Создайте быстрые клавиши для команды Git. Это мощная возможность для создания собственных комбинаций клавиш для часто используемых команд Git. Ниже показан упрощенный пример:
Так создается команда ci , которую можно использовать как сокращение команды git commit . Подробнее об алиасах в Git см. на странице git config.
Выберите текстовый редактор, используемый для таких команд, как git commit , для всех пользователей текущего компьютера. Аргумент должен представлять собой команду, запускающую нужный редактор (например, vi). В этом примере представлен аргумент —system . Аргумент —system устанавливает настройку на уровне всей системы, включая всех пользователей и все репозитории на компьютере. Дополнительную информацию об уровнях конфигурации см. на странице удаленной работы с git.
В текстовом редакторе откройте файл глобальной конфигурации для редактирования вручную. Подробное руководство по настройке текстового редактора для Git см. на странице Git config.
Пояснения
Все варианты конфигурации сохраняются в обычных текстовых файлах, так что команда git config — это всего лишь удобный интерфейс командной строки. Как правило, установку Git следует настраивать только при начале работы на новом компьютере. В подавляющем большинстве случаев понадобится только флаг —global . Одно из важных исключений — необходимость переписать электронный адрес автора. Вы можете поставить личный электронный адрес для личных репозиториев и репозиториев с открытым исходным кодом, а рабочий электронный адрес — для рабочих репозиториев.
Git хранит варианты конфигурации в трех различных файлах, что позволяет ограничивать область видимости на уровне отдельных репозиториев, пользователей или всей системы.
-
/.git/config — настройки на уровне репозитория.
Если параметры, указанные в этих файлах, конфликтуют, локальные настройки переопределяют пользовательские настройки, которые в свою очередь переопределяют системные настройки. Если вы откроете один из этих файлов, вы увидите нечто подобное:
Вы можете изменить эти значения вручную, эффект будет аналогичен использованию команды git config .
Пример
В первую очередь после установки Git требуется указать свое имя и адрес электронной почты, а также настроить некоторые параметры по умолчанию. Пример типичной начальной конфигурации показан далее.
Представьтесь репозиторию Git с помощью команды git config
Выберите любимый текстовый редактор
Добавьте алиасы по типу SVN
/.gitconfig , описанный в предыдущем разделе. Подробную информацию о команде git config см. на странице Git config.
Резюме
Мы показали, как создать репозиторий Git двумя способами: git init и git clone. Этим руководством можно пользоваться при необходимости управления исходным кодом ПО или другим контентом, при хранении которого требуется поддерживать версионность. Кроме того, были представлены команды git add, git commit, git push и git remote и показаны простые примеры их использования.
Установка Git в Ubuntu 18.04

Системы управления версиями просто незаменимы в современной разработке программного обеспечения, поскольку контроль версий позволяет отслеживать развитие программного обеспечения на уровне исходного кода. Вы можете отслеживать изменения, возвращаться к предыдущим версиям и создавать ответвления для создания альтернативных версий файлов и директорий.
Одна из наиболее популярных систем управления версиями в настоящее время — это Git. Многие проектные файлы хранятся в репозитории Git, а такие сайты, как GitHub, GitLab и Bitbucket, упрощают работу над проектами разработки программного обеспечения и совместную работу.
В этом руководстве мы расскажем, как установить и настроить Git на сервере Ubuntu 18.04. Мы расскажем, как выполнить установку программного обеспечения двумя различными способами, каждый из которых имеет свои преимущества в зависимости от ваших конкретных потребностей.
Предварительные требования
Для выполнения этого обучающего руководства у вас должен быть пользователь без прав root с привилегиями sudo на сервере Ubuntu 18.04. Чтобы выполнить необходимую первоначальную настройку, воспользуйтесь нашим руководством по ручной начальной настройке сервера или запустите наш автоматизированный скрипт.
После настройки сервера и пользователя вы можете продолжить.
Установка Git с пакетами по умолчанию
Для репозиториев Ubuntu по умолчанию используется быстрый метод установки Git. Обратите внимание, что версия, которую вы устанавливаете через эти хранилища, может отличаться от новейшей доступной версии. Если вам потребуется последняя версия, перейдите к следующему разделу этого обучающего руководства, чтобы узнать, как выполнить установку и компиляцию Git из заданного вами источника.
Во-первых, воспользуйтесь инструменты управления пакетами apt для обновления локального индекса пакетов. После завершения обновления вы сможете загрузить и установить Git:
Вы можете убедиться, что установка Git выполнена корректно, запустив следующую команду:
После успешной установки Git вы можете переходить Настройка Git данного обучающего руководства и выполнению настройки.
Установка Git из файла с исходным кодом
Более гибкий метод установки Git — это компиляция программного обеспечения из исходного кода. Это метод требует больше времени, а полученный результат не будет сохранен в менеджере пакетов, но он позволяет загрузить последнюю версию и дает определенный контроль над параметрами, которые вы включаете в ПО при необходимости индивидуальной настройки.
Перед началом установки вам нужно установить программное обеспечение, от которого зависит Git. Его можно найти в репозиториях по умолчанию, поэтому мы можем обновить локальный индекс пакетов, а после этого установить пакеты.
После установки необходимых зависимостей вы можете продолжить работу и получить нужную вас версию Git, посетив зеркало проекта Git на GitHub, доступное по следующему URL-адресу:
Перейдя по ссылке, убедитесь, что вы находитесь в ветке master . Нажмите ссылку Tags и выберите желаемую версию Git. Если у вас нет оснований для загрузки версии-кандидата (помеченная rc), постарайтесь избежать этого, поскольку такие версии могут быть нестабильными.

Затем нажмите кнопку Clone or download на правой стороне страницы, потом нажмите правой кнопкой мыши Download ZIP и скопируйте адрес ссылки, заканчивающийся на .zip .

Вернитесь на сервер Ubuntu 16.04 и перейдите в директорию tmp , чтобы загрузить временные файлы.
Здесь вы можете использовать команду wget для установки скопированной ссылки на файл с архивом. Мы укажем новое имя для файла: git.zip .
Разархивируйте файл, который вы загрузили, и переместите в полученную директорию:
Теперь вы можете создать пакет и установить его, введя эти две команды:
Чтобы убедиться, что установка прошла успешно, вы можете ввести git —version , после чего вы должны получить соответствующий вывод, указывающий текущую установленную версию Git.
Теперь, когда вы установили Git, если вы захотите обновиться до более поздней версии, вы можете клонировать репозиторий, а потом выполнить сборку и установку. Чтобы найти URL-адрес для использования при клонировании, перейдите к нужной ветке или тегу на странице проекта в GitHub и скопируйте клонируемый URL-адрес с правой стороны:

На момент написания соответствующий URL должен выглядеть следующим образом:
Измените домашнюю директорию и используйте git clone для URL-адреса, который вы только что скопировали:
В результате будет создана новая директория внутри текущей директории, где вы можете выполнить повторную сборку проекта и переустановить новую версию, как вы уже делали выше. В результате старая версия будет перезаписана на новую:
После выполнения этих действий вы можете быть уверены, что используете актуальную версию Git.
Настройка Git
Теперь, когда вы установили Git, вам нужно настроить его, чтобы сгенерированные сообщения о внесении содержали корректную информацию.
Это можно сделать с помощью команды git config . В частности, нам нужно указать наше имя и адрес электронной почты, поскольку Git вставляет эту информацию в каждое внесение. Мы можем двигаться дальше и добавить эту информацию с помощью следующей команды:
Мы можем просмотреть все пункты конфигурации, которые были настроены, введя следующую команду:
Информация, которую вы вводите, сохраняется в файле конфигурации Git, и вы можете при желании изменить ее вручную с помощью текстового редактора:
Существует множество других вариантов настроек, но эти две опции устанавливаются в обязательном порядке. Если вы пропустите этот шаг, вы, скорее всего, будете видеть предупреждения при внесении изменений в Git. Это будет требовать дополнительной работы, поскольку вам нужно будет исправлять вносимые изменения, которые вы делали, вводя корректную информацию.
Заключение
Вы установили Git и готовы к его использованию в системе.
Чтобы узнать больше об использовании Git, прочитайте эти статьи и разделы:
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
Введение в Git: от установки до основных команд
Введение в Git — это почти всегда пошаговая инструкция, но не всегда достаточно понятная. Именно поэтому мы дополнили гайд схемами, которые сделают информацию максимально доступной.
Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.
Основы Git
Git — это система контроля версий (VCS), которая позволяет отслеживать и фиксировать изменения в коде: вы можете восстановить код в случае сбоя или откатить до более ранних версий. А ещё это must-have инструмент для взаимодействия нескольких разработчиков на одном проекте. Подробнее об этом в руководстве по командной разработке с Git.
С Git работают через командную строку или инструменты вроде GitHub Desktop. Команды Git принимают вид git <команда> <аргументы> , где аргументом может быть путь к файлу. В команды также включаются опции, которые обозначаются как —<опция> . Забыли, как использовать команду? Откройте руководство с git help <команда> .
Установка Git
Введение в Git всегда начинается с установки: скачайте Git для Windows, macOS или Linux и проверьте версию с помощью git —version .
Настройка конфигурационного файла
Первое, что нужно сделать, — настроить имя пользователя и email для идентификации. Эти настройки хранятся в конфигурационном файле.
Вы можете напрямую отредактировать файл .gitconfig в текстовом редакторе или сделать это командой git config —global —edit . Для отдельных полей это git config —global <поле> <значение> — поля user.name и user.email .
Также можно настроить текстовый редактор для написания сообщений коммитов, используя поле core.editor . А вот поле commit.template позволяет указать шаблон, который будет использоваться при каждом коммите. Ещё одно полезное поле — alias , которое привязывает команду к псевдониму. Например, git config —global alias.st «status -s» позволяет использовать git st вместо git status -s
Команда git config —list выведет все поля и их значения из конфигурационного файла.
Создаём Git-репозиторий
Для инициализации нового репозитория .git подойдёт git init или, если хотите скопировать существующий, git clone <адрес репозитория> .
Коммиты
Основы работы с Git предполагают понимание коммитов. Команда git commit откроет текстовый редактор для ввода сообщения коммита. Также эта команда принимает несколько аргументов:
- -m позволяет написать сообщение вместе с командой, не открывая редактор. Например git commit -m «Пофиксил баг» ;
- -a переносит все отслеживаемые файлы в область подготовленных файлов и включает их в коммит (позволяет пропустить git add перед коммитом);
- —amend заменяет последний коммит новым изменённым коммитом, что бывает полезно, если вы неправильно набрали сообщение последнего коммита или забыли включить в него какие-то файлы.
Советы для эффективного введения в Git:
- Коммитьте как можно чаще.
- Одно изменение — один коммит: не помещайте все не связанные между собой изменения в один коммит, разделите их, чтобы было проще откатиться.
- Формат сообщений: заголовок должен быть в повелительном наклонении, меньше 50 символов в длину и должен логически дополнять фразу this commit will ___ (this commit will fix bugs — этот коммит исправит баги). Сообщение должно пояснять, почему был сделан коммит, а сам коммит показывает, что изменилось.
- Если у вас много незначительных изменений, хорошим тоном считается делать небольшие коммиты при разработке, а при добавлении в большой репозиторий объединять их в один коммит.
История коммитов в Git

Коммиты хранят состояние файловой системы в определённый момент времени и указатели на предыдущие коммиты. Каждый коммит содержит уникальную контрольную сумму — идентификатор, который Git использует, чтобы ссылаться на коммит. Чтобы отслеживать историю, Git хранит указатель HEAD, который указывает на первый коммит (мы следуем по цепочке коммитов в обратном порядке, чтобы попасть к предыдущим коммитам).
Мы можем ссылаться на коммит либо через его контрольную сумму, либо через его позицию относительно HEAD, например HEAD
4 ссылается на коммит, который находится 4 коммитами ранее HEAD.
Файловая система Git

Git отслеживает файлы в трёх основных разделах:
- рабочая директория (файловая система вашего компьютера);
- область подготовленных файлов (staging area, хранит содержание следующего коммита);
- HEAD (последний коммит в репозитории).
Все основные команды по работе с файлами сводятся к пониманию того, как Git управляет этими тремя разделами. Существует распространённое заблуждение, что область подготовленных файлов только хранит изменения. Лучше думать об этих трёх разделах как об отдельных файловых системах, каждая из которых содержит свои копии файлов.
Просмотр изменений в файловых системах
Команда git status отображает все файлы, которые различаются между тремя разделами. У файлов есть 4 состояния:
- Неотслеживаемый (untracked) — находится в рабочей директории, но нет ни одной версии в HEAD или в области подготовленных файлов (Git не знает о файле).
- Изменён (modified) — в рабочей директории есть более новая версия по сравнению с хранящейся в HEAD или в области подготовленных файлов (изменения не находятся в следующем коммите).
- Подготовлен (staged) — в рабочей директории и области подготовленных файлов есть более новая версия по сравнению с хранящейся в HEAD (готов к коммиту).
- Без изменений — одна версия файла во всех разделах, т. е. в последнем коммите содержится актуальная версия.
Примечание Файл может быть одновременно в состоянии «изменён» и «подготовлен», если версия в рабочей директории новее, чем в области подготовленных файлов, которая в свою очередь новее версии в HEAD.
Мы можем использовать опцию -s для команды git status , чтобы получить более компактный вывод (по строке на файл). Если файл не отслеживается, то будет выведено ?? ; если он был изменён, то его имя будет красным, а если подготовлен — зелёным.
Чтобы посмотреть сами изменения, а не изменённые файлы, можно использовать следующие команды:
- git diff — сравнение рабочей директории с областью подготовленных файлов;
- git diff —staged — сравнение области подготовленных файлов с HEAD.
Если использовать аргумент <файл/папка> , то diff покажет изменения только для указанных файлов/папок, например git diff src/ .
Обновление файловых систем
Команда git add <файл/папка> обновляет область подготовленных файлов версиями файлов/папок из рабочей директории.
Команда git commit обновляет HEAD новым коммитом, который делает снимки файлов в области подготовленных файлов.
Действие команды git reset <коммит> состоит из трёх потенциальных шагов:
- Переместить указатель HEAD на <коммит> (например, при откате коммита в рабочей директории и области подготовленных файлов будут более новые версии файлов, чем в HEAD). Также указатель HEAD ветки будет перемещён на этот коммит.
- Обновить область подготовленных файлов содержимым коммита. В таком случае только в рабочей директории будут новейшие версии файлов.
- Обновить рабочую директорию содержимым области подготовленных файлов. С этим нужно быть осторожнее, поскольку в итоге будут уничтожены изменения файлов.
По умолчанию команда git reset выполняет только шаги 1 и 2, однако её поведение можно изменить с помощью опций —soft (только 1 шаг) и —hard (все шаги).
Если передать путь к файлу/папке, то команда будет выполнена только для них, например git reset —soft HEAD
Команда git checkout HEAD <файл> приводит к тому же результату, что и git reset —hard HEAD <файл> — перезаписывает версию файла в области подготовленных файлов и в рабочей директорией версией из HEAD, то есть отменяет изменения после последнего коммита.
С другой стороны, git checkout <файл> (уже без HEAD) перезаписывает версию файла в рабочей директории версией в области подготовленных файлов, то есть отменяет изменения с момента последней подготовленной версии.
Наконец, git rm <файл> отменяет отслеживание файла и удаляет его из рабочей директории, опция —cached позволит сохранить файл.
Игнорирование файлов
Зачастую нам не нужно, чтобы Git отслеживал все файлы в репозитории, потому что в их число могут входить:
- файлы с чувствительной информацией вроде паролей;
- большие бинарные файлы;
- файлы сборок, которые генерируются после каждой компиляции;
- файлы, специфичные для ОС/IDE, например, .DS_Store для macOS или .iml для IntelliJ IDEA — нам нужно, чтобы репозиторий как можно меньше зависел от системы.
Для игнорирования используется файл .gitignore . Чтобы отметить файлы, которые мы хотим игнорировать, можно использовать шаблоны поиска (считайте их упрощёнными регулярными выражениями):
- /___ — позволяет избежать рекурсивности — соответствует файлам только в текущей директории;
- __/ — соответствует всем файлам в указанной директории;
- *___ — соответствует всем файлам с указанным окончанием;
- ! — игнорирование файлов, попадающих под указанный шаблон;
- [__] — соответствует любому символу из указанных в квадратных скобках;
- ? — соответствует любому символу;
- /**/ — соответствует вложенным директориям, например a/**/d соответствует a/d , a/b/d , a/b/c/d и т. д.
Мы даже можем использовать шаблоны поиска при указании файла/папки в других командах. Например, git add src/*.css добавит все файлы .css в папке src .
Просмотр изменений
Для просмотра истории предыдущих коммитов в обратном хронологическом порядке можно использовать команду git log . Ей можно передать разные опции:
- -p показывает изменения в каждом коммите;
- —stat показывает сокращённую статистику для коммитов, например изменённые файлы и количество добавленных/удалённых строк в каждом их них;
- -n показывает n последних коммитов;
- —since=___ и —until=___ позволяет отфильтровать коммиты по промежутку времени, например —since=»2019-01-01″ покажет коммиты с 1 января 2019 года;
- —pretty позволяет указать формат логов (например, —pretty=oneline ), также можно использовать —pretty=format для большей кастомизации, например —pretty=format:»%h %s» ;
- —grep и -S фильтруют коммиты с сообщениями/изменениями кода, которые содержат указанную строку, например, git log -S имя_функции позволяет посмотреть добавление/удаление функции;
- —no-merges пропускает коммиты со слиянием веток;
- ветка1..ветка2 позволяет посмотреть, какие коммиты из ветки 2 не находятся в ветке 1 (полезно при слиянии веток). Например, git log master..test покажет, каких коммитов из ветки test нет в master (о ветках поговорим чуть позже).
- —left-right ветка1. ветка2 показывает коммиты, которые есть либо в ветке 1, либо в ветке 2, но не в обеих; знак < обозначает коммиты из ветка1 , а > — из ветка2 . Обратите внимание: используется три точки, а не две;
- -L принимает аргумент начало,конец:файл или :функция:файл и показывает историю изменений переданного набора строк или функции в файле.
Другой полезной командой является git blame <файл> , которая для каждой строки файла показывает автора и контрольную сумму последнего коммита, который изменил эту строку. -L <начало>, <конец> позволяет ограничить эту команду заданными строками. Это можно использовать, например, для выяснения того, какой коммит привёл к определённому багу (чтобы можно было его откатить).
Наконец, есть команда git grep , которая ищет по всем файлам в истории коммитов (а не только в рабочей директории, как grep ) по заданному регулярному выражению. Опция -n отображает соответствующий номер строки в файле для каждого совпадения, а —count показывает количество совпадений для каждого файла.
Примечание Не путайте git grep с git log —grep ! Первый ищет по файлам среди коммитов, а последний смотрит на сообщения логов.
Удалённые репозитории
Пока что мы обсуждали использование Git только на локальной машине. Однако мы можем хранить историю коммитов удалённых репозиториев, которую можно отслеживать и обновлять. git remote -v выводит список удалённых репозиториев, которые мы отслеживаем, и имена, которые мы им присвоили.
При использовании команды git clone <url репозитория> мы не только загружаем себе копию репозитория, но и неявно отслеживаем удалённый сервер, который находится по указанному адресу и которому присваивается имя origin.
Наиболее употребляемые команды:
- git remote add <имя> <url> — добавляет удалённый репозиторий с заданным именем;
- git remote remove <имя> — удаляет удалённый репозиторий с заданным именем;
- git remote rename <старое имя> <новое имя> — переименовывает удалённый репозиторий;
- git remote set-url <имя> <url> — присваивает репозиторию с именем новый адрес;
- git remote show <имя> — показывает информацию о репозитории.
Следующие команды работают с удалёнными ветками:
- git fetch <имя> <ветка> — получает данные из ветки заданного репозитория, но не сливает изменения;
- git pull <имя> <ветка> — сливает данные из ветки заданного репозитория;
- git push <имя> <ветка> — отправляет изменения в ветку заданного репозитория. Если локальная ветка уже отслеживает удалённую, то можно использовать просто git push или git pull .

Таким образом несколько людей могут запрашивать изменения с сервера, делать изменения в локальных копиях и затем отправлять их на удалённый сервер, что позволяет взаимодействовать друг с другом в пределах одного репозитория.
GitHub
GitHub — это платформа, которая хранит Git-репозитории на своих серверах, и основы распределенной системы управления версиями Git подразумевает умение с ней работать. Вы можете хранить свои удалённые репозитории или участвовать в Open Source проектах на GitHub.
Да, есть и другие платформы, но GitHub идеален для введения в Git и дополняет VCS новыми возможностями.
Например, вы можете сделать форк удалённого репозитория, то есть создать свою копию репозитория на севере GitHub. Это полезно в тех случаях, когда у вас нет прав на создание ветки в оригинальном репозитории. Когда вы воспользуетесь командой git clone , ваш локальный репозиторий будет отслеживать удалённый форк как origin, а оригинальный репозиторий как upstream.
После этого вам может понадобиться слить тематическую ветку вашего удалённого репозитория в основную ветку оригинального. Для этого вы можете создать новый Pull Request — запрос на внесение изменений, где GitHub проверяет наличие конфликтов прежде чем повзолить вам провести слияние. Зачастую существуют и другие проверки перед слиянием, например просмотр и одобрение кода или даже запуск тестов. В запросе можно обсудить код, а все коммиты, которые вы отправляете в удалённую тематическую ветку, будут автоматически добавлены в запрос, даже если он был создан до этих коммитов.
Работа с ветками
Ветвление — это возможность работать над разными версиями проекта: вместо одного списка с упорядоченными коммитами история будет расходиться в определённых точках. Каждая ветвь содержит легковесный указатель HEAD на последний коммит, что позволяет без лишних затрат создать много веток. Ветка по умолчанию называется master, но лучше назвать её в соответствии с разрабатываемой в ней функциональностью.
Итак, есть общий указатель HEAD и HEAD для каждой ветки. Переключение между ветками предполагает только перемещение HEAD в HEAD соответствующей ветки.

- git branch <имя ветки> — создаёт новую ветку с HEAD, указывающим на HEAD. Если не передать аргумент <имя ветки> , то команда выведет список всех локальных веток;
- git checkout <имя ветки> — переключается на эту ветку. Можно передать опцию -b , чтобы создать новую ветку перед переключением;
- git branch -d <имя ветки> — удаляет ветку.
Локальный и удалённый репозитории могут иметь немало ветвей, поэтому когда вы отслеживаете удалённый репозиторий — отслеживается удалённая ветка ( git clone привязывает вашу ветку master к ветке origin/master удалённого репозитория).
Привязка к удалённой ветке:
- git branch -u <имя удалённого репозитория>/<удалённая ветка> — привязывает текущую ветку к указанной удалённой ветке;
- git checkout —track <имя удалённого репозитория>/<удалённая ветка> — аналог предыдущей команды;
- git checkout -b <ветка> <имя удалённого репозитория>/<удалённая ветка> — создаёт новую локальную ветку и начинает отслеживать удалённую;
- git branch —vv — показывает локальные и отслеживаемые удалённые ветки;
- git checkout <удалённая ветка> — создаёт локальную ветку с таким же именем, как у удалённой, и начинает её отслеживать.
В общем, git checkout связан с изменением места, на которое указывает HEAD ветки, что похоже на то, как git reset перемещает общий HEAD.
Прятки и чистка
Есть одна тонкость — при переключении веток Git требует, чтобы рабочее состояние было чистым, то есть все изменения в отслеживаемых файлах должны быть зафиксированы.
Прим. перев. Это не совсем так. При некоторых обстоятельствах Git может автоматически перенести незафиксированное изменение в другую ветку.
Однако порой у вас есть незавершённые изменения, которые нельзя фиксировать. В такой ситуации их можно сохранить и «спрятать» с помощью команды git stash . Чтобы вернуть изменения, используйте git stash apply .
Возможно, вместо этого вы захотите стереть все внесённые изменения. В таком случае используйте команду git clean . Опция -d также удалит неотслеживаемые файлы. Совет: добавьте опцию -n , чтобы увидеть, что произойдёт при запуске git clean без непосредственного использования.
Слияние
Ветку, в которую мы хотим слить изменения, будем называть основной, а ветку, из которой мы будем их сливать, — тематической.
Слиние включает в себя создание нового коммита, который основан на общем коммите-предке двух ветвей и указывает на оба HEAD в качестве предыдущих коммитов. Для слияния мы переходим на основную ветку и используем команду git merge <тематическая ветка> .

Если обе ветви меняют одну и ту же часть файла, то возникает конфликт слияния — ситуация, в которой Git не знает, какую версию файла сохранить, поэтому разрешать конфликт нужно собственноручно. Чтобы увидеть конфликтующие файлы, используйте git status .
После открытия таких файлов вы увидите похожие маркеры разрешения конфликта:
Замените в этом блоке всё на версию, которую вы хотите оставить, и подготовьте файл. После разрешения всех конфликтов можно использовать git commit для завершения слияния.
Перемещение
Вместо совмещения двух ветвей коммитом слияния, перемещение заново воспроизводит коммиты тематической ветки в виде набора новых коммитов базовой ветки, что выливается в более чистую историю коммитов.

Для перемещения используется команда git rebase <основная ветка> <тематическая ветка> , которая воспроизводит изменения тематической ветки на основной; HEAD тематической ветки указывает на последний воспроизведённый коммит.
Перемещение vs. слияние
После слияния лог с историей может выглядеть довольно беспорядочно. С другой стороны, перемещение позволяет переписать историю в нормальной, последовательной форме. Но перемещение — не панацея от запутанных логов: перемещённые коммиты отличаются от оригинальных, хотя и имеют одного и того же автора, сообщение и изменения.
- В своей ветке вы создаёте несколько коммитов и сливаете их в мастер-ветку.
- Кто-то ещё решает поработать на основе ваших коммитов.
- Вы решаете переместить ваши коммиты и отправить их на сервер.
- Когда кто-то попытается слить свою работу на основе ваших изначальных коммитов, в итоге мы получим две параллельные ветки с одним автором, сообщениями и изменениями, но разными коммитами.
Перемещайте изменения только на вашей приватной локальной ветке — не перемещайте коммиты, от которых зависит ещё кто-то.
Откат коммитов — revert и reset
Похожие дебаты по поводу того, что лучше использовать, возникают, когда вы хотите откатить коммит. Команда git revert <коммит> создаёт новый коммит, отменяющий изменения, но сохраняющий историю, в то время как git reset <коммит> перемещает указатель HEAD, предоставляя более чистую историю (словно бы этого коммита никогда и не было). Важно отметить, что это также означает, что вы больше не сможете вернуться обратно к этим изменениям, например, если вы всё-таки решите, что отмена коммита была лишней. Чище — не значит лучше!
Продвинутое использование
На этом основное введение в Git заканчивается, и начинается более глубокое изучение.
Интерактивная подготовка
Вы можете с удобством управлять областью подготовленных файлов (например при фиксации нескольких небольших коммитов вместо одного большого) с помощью интерактивной консоли, которую можно запустить с git add -i . В ней есть 8 команд:
- status — показывает для каждого файла краткое описание того, что (не)подготовлено;
- update — подготавливает отслеживаемые файлы;
- revert — убрать один или несколько файлов из подготовленной области;
- add untracked — подготавливает неотслеживаемый файл;
- patch — подготавливает только часть файла (полезно, когда вы, например, изменили несколько функций, но хотите разбить изменения на несколько коммитов). После выбора файла вам будут показаны его фрагменты и представлены возможные команды: Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? . Можно ввести ? , чтобы узнать, что делает каждая команда;
- diff — показывает список подготовленных файлов и позволяет посмотреть изменения для каждого из них;
- quit — выходит из интерактивной консоли;
- help — показывает краткое описание каждой команды.
Символ * рядом с файлом означает, что команда изменит его статус (подготовлен/неподготовлен в зависимости от того, происходит ли обновление или откат). Если нажать Enter, не введя ничего ни в одном из под-меню команды, то все файлы перейдут в (не)подготовленное состояние. Создание патчей доступно в интерактивной консоли и через команду git add -p .
Правка истории
Для большего контроля над историей коммитов локальной ветки можно использовать команду git rebase -i HEAD
n , которая откроет интерактивную консоль для перемещения набора последних n коммитов, перечисленных в порядке от старых к новым (то есть в том порядке, в котором они будут перемещены). Таким образом вы можете «редактировать историю», однако помните, что оригинальные коммиты нельзя изменить, только переместить.
Вы можете поменять порядок коммитов, изменив порядок, в котором они перечислены.
Изменение сообщения/разбивка коммитов
Для указания коммита, который вы хотите изменить, используется команда edit . Затем, когда Git будет проводить перемещение, он остановится на этом коммите. После этого вы можете использовать git commit —amend , чтобы изменить сообщение или подготовить забытые файлы. Если вы хотите разделить коммит, после остановки введите git reset HEAD^ (в результате HEAD будет перемещён на один коммит назад и все изменённые в этом коммите файлы перейдут в статус неподготовленных). Затем вы сможете зафиксировать файлы в отдельных коммитах обычным образом.
После завершения редактирования введите git rebase —continue .
Перезапись нескольких коммитов
Иногда вам может потребоваться перезаписать несколько коммитов — в таких случаях можно использовать git filter-branch . Например, чтобы удалить случайно зафиксированный файл, можно ввести git filter-branch —tree-filter ‘git rm -f <имя файла>’ HEAD . Однако учтите, что при этом вся история перемещается.
Объединение нескольких коммитов

Если коммиты незначительные и небольшие, это может засорить историю проекта. В связи с этим можно объединить несколько коммитов в один большой. Используйте команду pick для выбора первого коммита и squash для последующих.
Перенос отдельного коммита
Кроме слияния/перемещения всех коммитов в тематической ветке, вас может интересовать только определённый коммит. Допустим, у вас есть локальная ветка drafts, где вы работаете над несколькими потенциальными статьями, но хотите опубликовать только одну из них. Для этого можно использовать команду git cherry-pick . Чтобы получить определённые коммиты, из которых мы хотим выбирать, можно использовать git log <основная ветка>..<тематическая> .
Обратите внимание, что таким образом создаётся новый коммит, который только повторяет diff выбранного коммита (то есть разницу между этим коммитом и предыдущим), но не его состояние.