Введение в Git
16.02.2018
Категория: Web-разработка
Три состояния
Git имеет три основных состояния, в которых могут находиться ваши файлы: зафиксированном (committed), изменённом (modified) и подготовленном (staged). «Зафиксированный» значит, что файл уже сохранён в вашей локальной базе. К изменённым относятся файлы, которые поменялись, но ещё не были зафиксированы. Подготовленные файлы — это изменённые файлы, отмеченные для включения в следующий коммит.
Мы подошли к трём основным секциям проекта Git: Git-директория (Git directory), рабочая директория (working directory) и область подготовленных файлов (staging area).
Git-директория — это то место, где Git хранит метаданные и базу объектов вашего проекта. Это самая важная часть Git, и это та часть, которая копируется при клонировании репозитория с другого компьютера.
Рабочая директория является снимком версии проекта. Файлы распаковываются из сжатой базы данных в Git-директории и располагаются на диске, для того чтобы их можно было изменять и использовать.
Область подготовленных файлов — это файл, располагающийся в вашей Git-директории, в нём содержится информация о том, какие изменения попадут в следующий коммит. Эту область ещё называют «индекс».
Базовый подход в работе с Git выглядит так:
- Вы изменяете файлы в вашей рабочей директории.
- Вы добавляете файлы в индекс, добавляя тем самым их снимки в область подготовленных файлов.
- Когда вы делаете коммит, используются файлы из индекса как есть, и этот снимок сохраняется в вашу Git директорию.
Если определённая версия файла есть в Git-директории, эта версия закоммичена. Если файл изменён и добавлен в индекс, значит, он будет добавлен в следующий коммит. И если файл был изменён с момента последнего распаковывания из репозитория, но не был добавлен в индекс, он считается изменённым.
Первоначальная настройка Git
Теперь, когда Git установлен в вашей системе, самое время настроить среду для работы с Git’ом под себя. Это нужно сделать только один раз — при обновлении версии Git’а настройки сохранятся. Но, при необходимости, вы можете поменять их в любой момент, выполнив те же команды снова.
В состав Git’а входит утилита git config
, которая позволяет просматривать и настраивать параметры, контролирующие все аспекты работы Git’а, а также его внешний вид. Эти параметры могут быть сохранены в трёх местах:
- Файл
/etc/gitconfig
содержит значения, общие для всех пользователей системы и для всех их репозиториев. Если при запускеgit config
указать параметр--system
, то параметры будут читаться и сохраняться именно в этот файл. - Файл
~/.gitconfig
или~/.config/git/config
хранит настройки конкретного пользователя. Этот файл используется при указании параметра--global
. - Файл config в каталоге Git’а (т.е.
.git/config
) в том репозитории, который вы используете в данный момент, хранит настройки конкретного репозитория.
Настройки на каждом следующем уровне подменяют настройки из предыдущих уровней, то есть значения в .git/config
перекрывают соответствующие значения в /etc/gitconfig
.
В системах семейства Windows Git ищет файл .gitconfig
в каталоге $HOME
(C:\Users\$USER
для большинства пользователей).
Имя пользователя
Первое, что вам следует сделать после установки Git’а, — указать ваше имя и адрес электронной почты. Это важно, потому что каждый коммит в Git’е содержит эту информацию, и она включена в коммиты, передаваемые вами, и не может быть далее изменена:
$ git config --global user.name "John Doe" $ git config --global user.email johndoe@example.com
Опять же, если указана опция --global
, то эти настройки достаточно сделать только один раз, поскольку в этом случае Git будет использовать эти данные для всего, что вы делаете в этой системе. Если для каких-то отдельных проектов вы хотите указать другое имя или электронную почту, можно выполнить эту же команду без параметра --global
в каталоге с нужным проектом.
Проверка настроек
Если вы хотите проверить используемую конфигурацию, можете использовать команду git config --list
, чтобы показать все настройки, которые Git найдёт:
$ git config --list user.name=John Doe user.email=johndoe@example.com color.status=auto color.branch=auto color.interactive=auto color.diff=auto ...
Некоторые ключи (названия) настроек могут появиться несколько раз, потому что Git читает один и тот же ключ из разных файлов (например, из /etc/gitconfig
и ~/.gitconfig
). В этом случае Git использует последнее значение для каждого ключа.
Также вы можете проверить значение конкретного ключа, выполнив git config <key>
:
$ git config user.name John Doe
Как получить помощь?
Если вам нужна помощь при использовании Git, есть три способа открыть страницу руководства по любой команде Git:
$ git help <глагол> $ git <глагол> --help $ man git-<глагол>
Например, так можно открыть руководство по команде config
$ git help config
Создание Git-репозитория
Для создания Git-репозитория вы можете использовать два основных подхода. Во-первых, cоздание репозитория в существующей директории. Во-вторых, клонирование существующего репозитория с другого сервера.
Создание репозитория в существующей директории
Если вы собираетесь начать использовать Git для существующего проекта, то вам необходимо перейти в директорию проекта и в командной строке ввести
$ git init
Эта команда создаёт в текущей директории новую поддиректорию с именем .git, содержащую все необходимые файлы репозитория — основу Git-репозитория. На этом этапе ваш проект ещё не находится под версионным контролем.
Если вы хотите добавить под версионный контроль существующие файлы (в отличие от пустого каталога), вам стоит добавить их в индекс и осуществить первый коммит изменений. Добиться этого вы сможете запустив команду git add
, а затем выполнив git commit
:
$ git add --all $ git commit -m 'initial project version'
Клонирование существующего репозитория
Для получения копии существующего Git-репозитория, например, проекта, в который вы хотите внести свой вклад, необходимо использовать команду git clone
.
$ git clone https://github.com/libgit2/libgit2
Эта команда создаёт директорию libgit2
, инициализирует в ней поддиректорию .git
, скачивает все данные для этого репозитория и создаёт рабочую копию последней версии.
Для того, чтобы клонировать репозиторий в директорию с именем, отличающимся от libgit2
, необходимо указать желаемое имя, как параметр командной строки:
$ git clone https://github.com/libgit2/libgit2 mylibgit
Эта команда делает всё то же самое, что и предыдущая, только результирующий каталог будет назван mylibgit
.
Запись изменений в репозиторий
Каждый файл в вашем рабочем каталоге может находиться в одном из двух состояний: под версионным контролем (отслеживаемые) и нет (неотслеживаемые).
Отслеживаемые файлы — это те файлы, которые были в последнем слепке состояния проекта; они могут быть неизменёнными, изменёнными или подготовленными к коммиту (staged).
Неотслеживаемые файлы — это всё остальное, любые файлы в вашем рабочем каталоге, которые не входили в ваш последний слепок состояния и не подготовлены к коммиту.
Как только вы отредактируете файлы, Git будет рассматривать их как изменённые, т.к. вы изменили их с момента последнего коммита. Вы индексируете (stage) эти изменения и затем фиксируете все индексированные изменения (commit).
Определение состояния файлов
Основной инструмент, используемый для определения, какие файлы в каком состоянии находятся — это команда git status
. Если вы выполните эту команду сразу после клонирования, вы увидите что-то вроде этого:
$ git status On branch master nothing to commit, working directory clean
Это означает, что у вас чистый рабочий каталог, другими словами – в нем нет отслеживаемых измененных файлов. Git также не обнаружил неотслеживаемых файлов, в противном случае они бы были перечислены здесь. Наконец, команда сообщает вам на какой ветке вы находитесь и сообщает вам, что она не расходится с веткой на сервере.
Предположим, вы добавили в свой проект новый файл, простой файл README
. Eсли этого файла раньше не было, и вы выполните git status
, вы увидите свой неотслеживаемый файл вот так:
$ echo 'My Project' > README $ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) README nothing added to commit but untracked files present (use "git add" to track)
Понять, что новый файл README неотслеживаемый можно по тому, что он находится в секции «Untracked files» в выводе команды status
. Статус «Untracked files», по сути, означает, что Git видит файл, отсутствующий в предыдущем снимке состояния (commit); Git не станет добавлять его в ваши коммиты, пока вы его явно об этом не попросите.
Отслеживание новых файлов
Для того чтобы начать отслеживать (добавить под версионный контроль) новый файл, используется команда git add
. Чтобы начать отслеживание файла README
, вы можете выполнить следующее:
$ git add README
Если вы снова выполните команду status
, то увидите, что файл README теперь отслеживаемый и индексированный:
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README
Вы можете видеть, что файл проиндексирован по тому, что он находится в секции «Changes to be committed». Если вы выполните коммит в этот момент, то версия файла, существовавшая на момент выполнения вами команды git add
, будет добавлена в историю снимков состояния.
Команда git add
принимает параметром путь к файлу или каталогу; если это каталог, команда рекурсивно добавляет (индексирует) все файлы в данном каталоге.
Индексация изменённых файлов
Давайте модифицируем файл, уже находящийся под версионным контролем. Если вы измените отслеживаемый файл CONTRIBUTING.md
и после этого снова выполните команду git status
, то результат будет примерно следующим:
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: CONTRIBUTING.md
Файл CONTRIBUTING.md
находится в секции «Changes not staged for commit» — это означает, что отслеживаемый файл был изменён в рабочем каталоге, но пока не проиндексирован. Выполним git add
, чтобы проиндексировать CONTRIBUTING.md
, а затем снова выполним git status
:
$ git add CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README modified: CONTRIBUTING.md
Теперь оба файла проиндексированы и войдут в следующий коммит. В этот момент вы, предположим, вспомнили одно небольшое изменение, которое вы хотите сделать в CONTRIBUTING.md
до коммита. Вы открываете файл, вносите и сохраняете необходимые изменения и вроде бы готовы к коммиту. Но давайте-ка ещё раз выполним git status
:
$ vim CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README modified: CONTRIBUTING.md Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: CONTRIBUTING.md
Что за чёрт? Теперь CONTRIBUTING.md
отображается как проиндексированный и непроиндексированный одновременно. Как такое возможно? Такая ситуация наглядно демонстрирует, что Git индексирует файл в точности в том состоянии, в котором он находился, когда вы выполнили команду git add
.
Если вы выполните коммит сейчас, то файл CONTRIBUTING.md
попадёт в коммит в том состоянии, в котором он находился, когда вы последний раз выполняли команду git add
, а не в том, в котором он находится в вашем рабочем каталоге в момент выполнения git commit
. Если вы изменили файл после выполнения git add
, вам придётся снова выполнить git add
, чтобы проиндексировать последнюю версию файла:
$ git add CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README modified: CONTRIBUTING.md
Сокращенный вывод статуса
Вывод команды git status
довольно всеобъемлющий и многолословный. Git также имеет флаг вывода сокращенного статуса, так что вы можете увидеть изменения в более компактном виде. Если вы выполните git status -s
или git status --short
вы получите гораздо более упрощенный вывод.
$ git status -s _M README MM Rakefile A_ lib/git.rb M_ lib/simplegit.rb ?? LICENSE.txt
Новые, неотслеживаемые файлы помечены ??
слева от них, файлы добавленные в отслеживаемые помечены A
, отредактированные файлы помечены M
и так далее. В выводе содержится два столбца (с именем файла — три). В первом указывается статус файла, а во втором модифицирован ли он после этого.
M README
– файл модифицирован, но не проиндексированMM Rakefile
– файл модифицирован, проиндексирован и еще раз модифицированA lib/git.rb
– новый файл в проектеM lib/simplegit.rb
– модифицирован, проиндексирован?? LICENSE.txt
– новый неотслеживаемый файл
Игнорирование файлов
Зачастую, у вас имеется группа файлов, которые вы не только не хотите автоматически добавлять в репозиторий, но и видеть в списках неотслеживаемых. К таким файлам обычно относятся автоматически генерируемые файлы (различные логи, результаты сборки программ и т.п.). В таком случае, вы можете создать файл .gitignore
. с перечислением шаблонов соответствующих таким файлам. Вот пример файла .gitignore
:
$ cat .gitignore *.[oa] *~
Первая строка предписывает Git игнорировать любые файлы заканчивающиеся на «.o» или «.a» — объектные и архивные файлы, которые могут появиться во время сборки кода. Вторая строка предписывает игнорировать все файлы заканчивающиеся на тильду (~), которая используется во многих текстовых редакторах, например Emacs, для обозначения временных файлов.
К шаблонам в файле .gitignore
применяются следующие правила:
- Пустые строки, а также строки, начинающиеся с #, игнорируются.
- Можно использовать стандартные glob шаблоны.
- Можно начать шаблон символом слэша (/) чтобы избежать рекурсии.
- Можно заканчивать шаблон символом слэша (/) для указания каталога.
- Можно инвертировать шаблон, использовав восклицательный знак (!) в качестве первого символа.
Glob-шаблоны представляют собой упрощённые регулярные выражения, используемые командными интерпретаторами. Символ (*) соответствует 0 или более символам; последовательность [abc] — любому символу из указанных в скобках (в данном примере a, b или c); знак вопроса (?) соответствует одному символу; и квадратные скобки, в которые заключены символы, разделённые дефисом ([0-9]), соответствуют любому символу из интервала (в данном случае от 0 до 9). Вы также можете использовать две звёздочки, чтобы указать на вложенные директории: a/**/z соответствует a/z, a/b/z, a/b/c/z, и так далее.
Вот ещё один пример файла .gitignore:
# игнорировать файлы, которые заканчиваются на «.a» *.a # но не игнорировать файл lib.a !lib.a # игнорировать файл TODO в корневой категории, но не игнорировать subdir/TODO /TODO # игнорировать все файлы в директории build/ build/ # игнорировать doc/notes.txt, но не игнорировать doc/server/arch.txt doc/*.txt # игнорировать все файлы .txt в директории doc/ и глубже doc/**/*.txt
Коммит изменений
Теперь, когда ваш индекс находится в таком состоянии, как вам и хотелось, вы можете зафиксировать свои изменения. Запомните, всё, что до сих пор не проиндексировано — любые файлы, созданные или изменённые вами, и для которых вы не выполнили git add
после момента редактирования — не войдут в этот коммит. Простейший способ зафиксировать изменения — это набрать git commit
:
$ git commit
Эта команда откроет выбранный вами текстовый редактор (устанавливается системной переменной $EDITOR
— обычно это vim или emacs, хотя вы можете установить ваш любимый с помощью команды git config --global core.editor
).
В редакторе будет отображён следующий текст (это пример окна Vim’а):
# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # new file: README # modified: CONTRIBUTING.md # ~ ~ ~ ".git/COMMIT_EDITMSG" 9L, 283C
Вы можете видеть, что комментарий по умолчанию для коммита содержит закомментированный результат работы команды git status
и ещё одну пустую строку сверху. Вы можете удалить эти комментарии и набрать своё сообщение или же оставить их для напоминания о том, что вы фиксируете.
Есть и другой способ — вы можете набрать свой комментарий к коммиту в командной строке вместе с командой commit
указав его после параметра -m, как в следующем примере:
$ git commit -m "Story 182: Fix benchmarks for speed" [master 463dc4f] Story 182: Fix benchmarks for speed 2 files changed, 2 insertions(+) create mode 100644 README
Коммит вывел вам немного информации о себе: на какую ветку вы выполнили коммит (master), какая контрольная сумма SHA-1 у этого коммита (463dc4f), сколько файлов было изменено, а также статистику по добавленным/удалённым строкам в этом коммите.
Индексация в момент коммита
Если у вас есть желание пропустить этап индексирования, Git предоставляет простой способ. Добавление параметра -a в команду git commit
заставляет Git автоматически индексировать каждый уже отслеживаемый на момент коммита файл, позволяя вам обойтись без git add
:
$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: CONTRIBUTING.md no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'added new benchmarks' [master 83e38c7] added new benchmarks 1 file changed, 5 insertions(+), 0 deletions(-)
Обратите внимание на то, что в данном случае перед коммитом вам не нужно выполнять git add
для файла CONTRIBUTING.md
.
Удаление файлов
Для того чтобы удалить файл из Git, вам необходимо удалить его из отслеживаемых файлов (точнее, удалить его из вашего индекса) а затем выполнить коммит. Это позволяет сделать команда git rm
, которая также удаляет файл из вашего рабочего каталога, так что вы в следующий раз не увидите его как «неотслеживаемый».
Если вы просто удалите файл из своего рабочего каталога, он будет показан в секции «Changes not staged for commit» (измененные, но не проиндексированные) вывода команды git status
:
$ rm PROJECTS.md $ git status On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: PROJECTS.md no changes added to commit (use "git add" and/or "git commit -a")
Затем, если вы выполните команду git rm, удаление файла попадёт в индекс:
$ git rm PROJECTS.md rm 'PROJECTS.md' $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: PROJECTS.md
После следующего коммита файл исчезнет и больше не будет отслеживаться.
Другая полезная штука, которую вы можете захотеть сделать — это удалить файл из индекса, оставив его при этом в рабочем каталоге. Другими словами, вы можете захотеть оставить файл на жёстком диске, и убрать его из-под бдительного ока Git. Это особенно полезно, если вы забыли добавить что-то в файл .gitignore
и по ошибке проиндексировали, например, большой файл с логами. Чтобы сделать это, используйте опцию --staged
(или --cached
):
$ git rm --staged README
В команду git rm можно передавать файлы, каталоги или glob-шаблоны. Это означает, что вы можете вытворять что-то вроде:
$ git rm log/\*.log
Обратите внимание на обратный слэш (\) перед *. Он необходим из-за того, что Git использует свой собственный обработчик имён файлов вдобавок к обработчику вашего командного интерпретатора. Эта команда удаляет все файлы имеющие расширение .log находящиеся в директории log/. Или же вы можете сделать вот так:
$ git rm \*~
Эта команда удаляет все файлы, чьи имена заканчиваются на ~
.
Переименование файлов
Если вам хочется переименовать файл в Git, вы можете сделать что-то вроде:
$ git mv README.md README $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.md -> README
Это эквивалентно выполнению следующих команд:
$ mv README.md README $ git rm README.md $ git add README
Операции отмены
Отмена может потребоваться, если вы сделали коммит слишком рано, например, забыв добавить какие-то файлы или комментарий к коммиту. Если вы хотите переделать коммит, можно запустить commit
с параметром --amend
(дополнить):
$ git commit --amend
Эта команда использует для дополнения коммита ваш индекс (staged). Если вы ничего не меняли с момента последнего коммита (например, команда запущена сразу после предыдущего коммита), то снимок состояния останется в точности таким же, а изменится лишь комментарий к коммиту.
Запустится тот же редактор комментария к коммиту, но уже с комментарием к предыдущему коммиту. Комментарий можно отредактировать точно так же, как обычно, просто он заменит собой предыдущий.
Например, если вы фиксируете изменения, и понимаете, что забыли проиндексировать изменения в файле, который хотели включить в коммит, можно сделать примерно так:
$ git commit -m 'initial commit' $ git add forgotten_file $ git commit --amend
В итоге получится единый коммит — второй коммит заменит результаты первого.
Удаление файла из индекса
Cкажем, вы изменили два файла, и хотите закоммитить их двумя раздельными изменениями, но случайно набрали git add .
, и добавили оба в индекс (staging area). Как отменить добавление одного из них? Команда git status
напомнит вам:
$ git add . $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.md -> README modified: CONTRIBUTING.md
Прямо под текстом «Changes to be committed» говорится: git reset HEAD
для отмены добавления в индекс. Давайте последуем этому совету, и отменим индексирование файла CONTRIBUTING.md
:
$ git reset HEAD CONTRIBUTING.md Unstaged changes after reset: M CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.md -> README Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: CONTRIBUTING.md
Файл CONTRIBUTING.md
изменен, но снова не добавлен в индекс.
Отмена изменения измененного файла
Что делать, если вы поняли, что не хотите сохранять свои изменения файла CONTRIBUTING.md
? Как можно просто «разызменить» его — вернуть к тому виду, который был в последнем коммите? Нам повезло, что git status
рассказывает и это тоже. В последнем примере вывод git status
был таким:
Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: CONTRIBUTING.md
Здесь довольно ясно указано, как отбросить сделанные изменения. Давайте так и сделаем:
$ git checkout -- CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: README.md -> README
Как видите, откат изменений выполнен.
Работа с удалёнными репозиториями
Удалённые репозитории представляют собой версии проекта, сохранённые в интернете или ещё где-то в сети. У вас может быть несколько удалённых репозиториев, каждый из которых может быть доступен для чтения или для чтения-записи.
Просмотр удалённых репозиториев
Для того, чтобы просмотреть список настроенных удалённых репозиториев, вы можете запустить команду git remote
. Она выведет названия доступных удалённых репозиториев. Если вы клонировали репозиторий, то увидите как минимум «origin» — имя по умолчанию для исходного репозиториясразу после клонирования:
$ git clone https://github.com/schacon/ticgit Cloning into 'ticgit'... ..... $ cd ticgit $ git remote origin
Вы можете также указать ключ -v
, чтобы просмотреть адреса для чтения и записи, привязанные к репозиторию:
$ git remote -v origin https://github.com/schacon/ticgit (fetch) origin https://github.com/schacon/ticgit (push)
Если у вас больше одного удалённого репозитория, команда выведет их все. Например, для репозитория с несколькими настроенными удалёнными репозиториями в случае совместной работы нескольких пользователей, вывод команды может выглядеть примерно так:
$ cd grit $ git remote -v bakkdoor https://github.com/bakkdoor/grit (fetch) bakkdoor https://github.com/bakkdoor/grit (push) cho45 https://github.com/cho45/grit (fetch) cho45 https://github.com/cho45/grit (push) defunkt https://github.com/defunkt/grit (fetch) defunkt https://github.com/defunkt/grit (push) koke git://github.com/koke/grit.git (fetch) koke git://github.com/koke/grit.git (push) origin git@github.com:mojombo/grit.git (fetch) origin git@github.com:mojombo/grit.git (push)
Добавление удалённых репозиториев
Для того, чтобы добавить удалённый репозиторий и присвоить ему имя (shortname
), просто выполните команду git remote add [shortname] [url]
:
$ git remote origin $ git remote add pb https://github.com/paulboone/ticgit $ git remote -v origin https://github.com/schacon/ticgit (fetch) origin https://github.com/schacon/ticgit (push) pb https://github.com/paulboone/ticgit (fetch) pb https://github.com/paulboone/ticgit (push)
Теперь вместо указания полного пути вы можете использовать pb. Например, если вы хотите получить изменения, которые есть у Пола, но нету у вас, вы можете выполнить команду git fetch pb
:
$ git fetch pb remote: Counting objects: 43, done. remote: Compressing objects: 100% (36/36), done. remote: Total 43 (delta 10), reused 31 (delta 5) Unpacking objects: 100% (43/43), done. From https://github.com/paulboone/ticgit * [new branch] master -> pb/master * [new branch] ticgit -> pb/ticgit
Ветка master
из репозитория Пола сейчас доступна вам под именем pb/master
.
Получение изменений из удалённого репозитория
Для получения данных из удалённых проектов, следует выполнить:
$ git fetch [remote-name]
Данная команда связывается с указанным удалённым проектом и забирает все те данные проекта, которых у вас ещё нет. После того как вы выполнили команду, у вас должны появиться ссылки на все ветки из этого удалённого проекта. Теперь эти ветки в любой момент могут быть просмотрены или слиты.
Когда вы клонируете репозиторий, команда clone
автоматически добавляет этот удалённый репозиторий под именем «origin». Таким образом, git fetch origin
извлекает все наработки, отправленные (push
) на этот сервер после того, как вы склонировали его (или получили изменения с помощью fetch
).
Важно отметить, что команда git fetch
забирает данные в ваш локальный репозиторий, но не сливает их с какими-либо вашими наработками и не модифицирует то, над чем вы работаете в данный момент. Вам необходимо вручную слить эти данные с вашими, когда вы будете готовы.
Если у вас есть ветка, настроенная на отслеживание удалённой ветки, то вы можете использовать команду git pull
чтобы автоматически получить изменения из удалённой ветви и слить их со своей текущей ветвью. К тому же по умолчанию команда git clone
автоматически настраивает вашу локальную ветку master
на отслеживание удалённой ветки master
на сервере, с которого вы клонировали (подразумевается, что на удалённом сервере есть ветка master
).
Выполнение git pull
, как правило, извлекает (fetch
) данные с сервера, с которого вы изначально склонировали, и автоматически пытается слить (merge
) их с кодом, над которым вы в данный момент работаете.
Отправка изменений в удаленный репозиторий
Когда вы хотите поделиться своими наработками, вам необходимо отправить (push
) их в главный репозиторий. Команда для этого действия простая: git push [remote-name] [branch-name]
. Чтобы отправить вашу ветку master
на сервер origin
(повторимся, что клонирование, как правило, настраивает оба этих имени автоматически), вы можете выполнить следующую команду для отправки наработок на сервер:
$ git push origin master
Эта команда срабатывает только в случае, если вы клонировали с сервера, на котором у вас есть права на запись, и если никто другой с тех пор не выполнял команду push
. Если вы и кто-то ещё одновременно клонируете, затем он выполняет команду push
, а затем команду push
выполняете вы, то ваш push
точно будет отклонён. Вам придётся сначала вытянуть (pull
) их изменения и объединить с вашими. Только после этого вам будет позволено выполнить push
.
Просмотр удаленного репозитория
Если хотите получить побольше информации об одном из удалённых репозиториев, вы можете использовать команду git remote show [remote-name]
. Выполнив эту команду с некоторым именем, например, origin, вы получите результат, аналогичный следующему:
$ git remote show origin * remote origin Fetch URL: https://github.com/schacon/ticgit Push URL: https://github.com/schacon/ticgit HEAD branch: master Remote branches: master tracked dev-branch tracked Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (up to date)
Она выдаёт URL удалённого репозитория, а также информацию об отслеживаемых ветках. Эта команда любезно сообщает вам, что если вы, находясь на ветке master
, выполните git pull
, ветка master
с удалённого сервера будет автоматически влита в вашу сразу после получения всех необходимых данных. Она также выдаёт список всех полученных ею ссылок.
Удаление и переименование удалённых репозиториев
Для переименования ссылок можно вылолнить git remote rename
, это изменит сокращённое имя, используемое для удалённого репозитория. Например, если вы хотите переименовать pb
в paul
, вы можете это сделать так:
$ git remote rename pb paul $ git remote origin paul
Стоит упомянуть, что это также меняет для вас имена удалённых веток. То, к чему вы обращались как pb/master
, теперь стало paul/master
.
Если по какой-то причине вы хотите удалить ссылку, вы можете использовать git remote rm
:
$ git remote rm paul $ git remote origin