Git инструкция шпаргалка для начинающих

В последние годы популярность git демонстрирует взрывной рост. Эта система контроля версий используется различными проектами с открытым исходным кодом.

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

Основы

Git — это набор консольных утилит, которые отслеживают и фиксируют изменения в файлах (чаще всего речь идет об исходном коде программ, но вы можете использовать его для любых файлов на ваш вкус). Изначально Git был создан Линусом Торвальдсом при разработке ядра Linux. Однако инструмент так понравился разработчикам, что в последствии, он получил широкое распространение и его стали использовать в других проектах. С его помощью вы можете сравнивать, анализировать, редактировать, сливать изменения и возвращаться назад к последнему сохранению. Этот процесс называется контролем версий.

Для чего он нужен? Ну во-первых, чтобы отследить изменения, произошедшие с проектом, со временем. Проще говоря, мы можем посмотреть как менялись файлы программы, на всех этапах разработки и при необходимости вернуться назад и что-то отредактировать. Часто бывают ситуации, когда, во вполне себе работающий код, вам нужно внести определенные правки или улучшить какой-то функционал, по желанию заказчика. Однако после внедрения нововведений, вы с ужасом понимаете, что все сломалось. У вас начинается судорожно дергаться глаз, а в воздухе повисает немой вопрос: “Что делать?” Без системы контроля версий, вам надо было бы долго напряженно просматривать код, чтобы понять как было до того, как все перестало работать. С Гитом же, все что нужно сделать — это откатиться на коммит назад.

Во-вторых он чрезвычайно полезен при одновременной работе нескольких специалистов, над одним проектом. Без Гита случится коллапс, когда разработчики, скопировав весь код из главной папки и сделав с ним задуманное, попытаются одновременно вернуть весь код обратно.
Git является распределенным, то есть не зависит от одного центрального сервера, на котором хранятся файлы. Вместо этого он работает полностью локально, сохраняя данные в директориях на жестком диске, которые называются репозиторием. Тем не менее, вы можете хранить копию репозитория онлайн, это сильно облегчает работу над одним проектом для нескольких людей. Для этого используются сайты вроде github и bitbucket.

Установка

Установить git на свою машину очень просто:

  • Linux — нужно просто открыть терминал и установить приложение при помощи пакетного менеджера вашего дистрибутива. Для Ubuntu команда будет выглядеть следующим образом:
    sudo apt-get install git
  • Windows — мы рекомендуем git for windows, так как он содержит и клиент с графическим интерфейсом, и эмулятор bash.
  • OS X — проще всего воспользоваться homebrew. После его установки запустите в терминале:
    brew install git

Если вы новичок, клиент с графическим интерфейсом(например GitHub Desktop и Sourcetree) будет полезен, но, тем не менее, знать команды очень важно.

Настройка

Итак, мы установили git, теперь нужно добавить немного настроек. Есть довольно много опций, с которыми можно играть, но мы настроим самые важные: наше имя пользователя и адрес электронной почты. Откройте терминал и запустите команды:

git config --global user.name "My Name"
git config --global user.email myEmail@example.com

Теперь каждое наше действие будет отмечено именем и почтой. Таким образом, пользователи всегда будут в курсе, кто отвечает за какие изменения — это вносит порядок.
Git хранит весь пакет конфигураций в файле .gitconfig, находящемся в вашем локальном каталоге. Чтобы сделать эти настройки глобальными, то есть применимыми ко всем проектам, необходимо добавить флаг –global. Если вы этого не сделаете, они будут распространяться только на текущий репозиторий.
Для того, чтобы посмотреть все настройки системы, используйте команду:

git config --list

Для удобства и легкости зрительного восприятия, некоторые группы команд в Гит можно выделить цветом, для этого нужно прописать в консоли:

git config --global color.ui true
git config --global color.status auto
git config --global color.branch auto

Если вы не до конца настроили систему для работы, в начале своего пути — не беда. Git всегда подскажет разработчику, если тот запутался, например:

  1. Команда git —help — выводит общую документацию по git
  2. Если введем git log —help — он предоставит нам документацию по какой-то определенной команде (в данном случае это — log)
  3. Если вы вдруг сделали опечатку — система подскажет вам нужную команду
  4. После выполнения любой команды — отчитается о том, что вы натворили
  5. Также Гит прогнозирует дальнейшие варианты развития событий и всегда направит разработчика, не знающего, куда двигаться дальше

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

Создание нового репозитория

Как мы отметили ранее, git хранит свои файлы и историю прямо в папке проекта. Чтобы создать новый репозиторий, нам нужно открыть терминал, зайти в папку нашего проекта и выполнить команду init. Это включит приложение в этой конкретной папке и создаст скрытую директорию .git, где будет храниться история репозитория и настройки.
Создайте на рабочем столе папку под названием git_exercise. Для этого в окне терминала введите:

$ mkdir Desktop/git_exercise/
$ cd Desktop/git_exercise/
$ git init

Командная строка должна вернуть что-то вроде:

Initialized empty Git repository in /home/user/Desktop/git_exercise/.git/

Это значит, что наш репозиторий был успешно создан, но пока что пуст. Теперь создайте текстовый файл под названием hello.txt и сохраните его в директории git_exercise.

Определение состояния

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

$ git status
On branch master
Initial commit
Untracked files:
(use "git add ..." to include in what will be committed)
hello.txt

Сообщение говорит о том, что файл hello.txt неотслеживаемый. Это значит, что файл новый и система еще не знает, нужно ли следить за изменениями в файле или его можно просто игнорировать. Для того, чтобы начать отслеживать новый файл, нужно его специальным образом объявить.

Подготовка файлов

В git есть концепция области подготовленных файлов. Можно представить ее как холст, на который наносят изменения, которые нужны в коммите. Сперва он пустой, но затем мы добавляем на него файлы (или части файлов, или даже одиночные строчки) командой add и, наконец, коммитим все нужное в репозиторий (создаем слепок нужного нам состояния) командой commit.
В нашем случае у нас только один файл, так что добавим его:

$ git add hello.txt

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

$ git add -A

Проверим статус снова, на этот раз мы должны получить другой ответ:

$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached ..." to unstage)
new file: hello.txt

Файл готов к коммиту. Сообщение о состоянии также говорит нам о том, какие изменения относительно файла были проведены в области подготовки — в данном случае это новый файл, но файлы могут быть модифицированы или удалены.

Фиксация изменений

Как сделать коммит

Представим, что нам нужно добавить пару новых блоков в html-разметку (index.html) и стилизовать их в файле style.css. Для сохранения изменений, их необходимо закоммитить. Но сначала, мы должны обозначить эти файлы для Гита, при помощи команды git add, добавляющей (или подготавливающей) их к коммиту. Добавлять их можно по отдельности:

git add index.html
git add css/style.css

или вместе — всё сразу:

git add .

Конечно добавлять всё сразу удобнее, чем прописывать каждую позицию отдельно. Однако, тут надо быть внимательным, чтобы не добавить по ошибке ненужные элементы. Если же такое произошло изъять оттуда ошибочный файл можно при помощи команды

git reset:
git reset css/style.css

Теперь создадим непосредственно сам коммит

git commit -m 'Add some code'

Флажок -m задаст commit message — комментарий разработчика. Он необходим для описания закоммиченных изменений. И здесь работает золотое правило всех комментариев в коде: «Максимально ясно, просто и содержательно обозначь написанное!»

Как посмотреть коммиты

Для просмотра все выполненных фиксаций можно воспользоваться историей коммитов. Она содержит сведения о каждом проведенном коммите проекта. Запросить ее можно при помощи команды:

git log

В ней содержится вся информация о каждом отдельном коммите, с указанием его хэша, автора, списка изменений и даты, когда они были сделаны. Отследить интересующие вас операции в списке изменений, можно по хэшу коммита, при помощи команды git show :

git show hash_commit

Ну а если вдруг нам нужно переделать commit message и внести туда новый комментарий, можно написать следующую конструкцию:

git commit --amend -m 'Новый комментарий'

В данном случае сообщение последнего коммита перезапишется. Но злоупотреблять этим не стоит, поскольку эта операция опасная и лучше ее делать до отправки коммита на сервер.

Удаленные репозитории

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

1. Что такое удаленный репозиторий

Репозиторий, хранящийся в облаке, на стороннем сервисе, специально созданном для работы с git имеет ряд преимуществ. Во-первых — это своего рода резервная копия вашего проекта, предоставляющая возможность безболезненной работы в команде. А еще в таком репозитории можно пользоваться дополнительными возможностями хостинга. К примеру -визуализацией истории или возможностью разрабатывать вашу программу непосредственно в веб-интерфейсе.
Клонирование
Клонирование — это когда вы копируете удаленный репозиторий к себе на локальный ПК. Это то, с чего обычно начинается любой проект. При этом вы переносите себе все файлы и папки проекта, а также всю его историю с момента его создания. Чтобы склонировать проект, сперва, необходимо узнать где он расположен и скопировать ссылку на него. В нашем руководстве мы будем использовать адрес https://github.com/tutorialzine/awesome-project, но вам посоветуем, попробовать создать свой репозиторий в GitHub, BitBucket или любом другом сервисе:

git clone https://github.com/tutorialzine/awesome-project

При клонировании в текущий каталог, там будет создана папка, в которую поместятся все проектные файлы и скрытая директория .git, с самим репозиторием, или с необходимой информацией о нем. В такой ситуации, для клонируемого репозитория, по умолчанию, будет создана папка с одноименным названием, но его можно залить и в другую директорию, например:

git clone https://github.com/tutorialzine/awesome-project new-folder

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

Чтобы загрузить что-нибудь в удаленный репозиторий, сначала нужно к нему подключиться. Регистрация и установка может занять время, но все подобные сервисы предоставляют хорошую документацию.
Чтобы связать наш локальный репозиторий с репозиторием на GitHub, выполним следующую команду в терминале. Обратите внимание, что нужно обязательно изменить URI репозитория на свой.

# This is only an example. Replace the URI with your own repository address.
$ git remote add origin https://github.com/tutorialzine/awesome-project.git

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

3. Отправка изменений на сервер

Сейчас самое время переслать наш локальный коммит на сервер. Этот процесс происходит каждый раз, когда мы хотим обновить данные в удаленном репозитории.
Команда, предназначенная для этого — push. Она принимает два параметра: имя удаленного репозитория (мы назвали наш origin) и ветку, в которую необходимо внести изменения (master — это ветка по умолчанию для всех репозиториев).

$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 212 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/tutorialzine/awesome-project.git
* [new branch] master -> master

Эта команда немного похожа на git fetch, с той лишь разницей, что при помощи fetch мы импортируем коммиты в локальную ветку, а применив push, мы экспортируем их из локальной в удаленную. Если вам необходимо настроить удаленную ветку используйте git remote. Однако пушить надо осторожно, ведь рассматриваемая команда перезаписывает безвозвратно все изменения. В большинстве случаев, ее используют, чтобы опубликовать выгружаемые локальные изменения в центральный репозиторий. А еще ее применяют для того, чтобы поделиться, внесенными в локальный репозиторий, нововведениями, с коллегами или другими удаленными участниками разработки проекта. Подытожив сказанное, можно назвать git push — командой выгрузки, а git pull и git fetch — командами загрузки или скачивания. После того как вы успешно запушили измененные данные, их необходимо внедрить или интегрировать, при помощи команды слияния git merge.
В зависимости от сервиса, который вы используете, вам может потребоваться аутентифицироваться, чтобы изменения отправились. Если все сделано правильно, то когда вы посмотрите в удаленный репозиторий при помощи браузера, вы увидите файл hello.txt

4. Запрос изменений с сервера

Если вы сделали изменения в вашем удаленном репозитории, другие пользователи могут скачать изменения при помощи команды pull.

$ git pull origin master
From https://github.com/tutorialzine/awesome-project
* branch master -> FETCH_HEAD
Already up-to-date.

Так как новых коммитов с тех пор, как мы склонировали себе проект, не было, никаких изменений доступных для скачивания нет.

Как удалить локальный репозиторий

Вам не понравился один из ваших локальных Git-репозиториев и вы хотите стереть его со своей машины. Для этого вам всего лишь надо удалить скрытую папку «.git» в корневом каталоге репозитория. Сделать это можно 3 способами:

  1. Проще всего вручную удалить эту папку «.git» в корневом каталоге «Git Local Warehouse».
  2. Также удалить, не устраивающий вас, репозиторий можно на github. Открываете нужный вам объект и переходите в пункт меню Настройки. Там, прокрутив ползунок вниз, вы попадете в зону опасности, где один из пунктов будет называться «удаление этого хранилища».
  3. Последний метод удаления локального хранилища через командную строку, для этого в терминале необходимо ввести следующую команду:
cd repository-path/
rm -r .git

Ветвление

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

  • Уже рабочая, стабильная версия кода сохраняется.
  • Различные новые функции могут разрабатываться параллельно разными программистами.
  • Разработчики могут работать с собственными ветками без риска, что кодовая база поменяется из-за чужих изменений.
  • В случае сомнений, различные реализации одной и той же идеи могут быть разработаны в разных ветках и затем сравниваться.

1. Создание новой ветки

Основная ветка в каждом репозитории называется master. Чтобы создать еще одну ветку, используем команду branch <name>

$ git branch amazing_new_feature

Это создаст новую ветку, пока что точную копию ветки master.

2. Переключение между ветками

Сейчас, если мы запустим branch, мы увидим две доступные опции:

$ git branch
amazing_new_feature
* master

master — это активная ветка, она помечена звездочкой. Но мы хотим работать с нашей “новой потрясающей фичей”, так что нам понадобится переключиться на другую ветку. Для этого воспользуемся командой checkout, она принимает один параметр — имя ветки, на которую необходимо переключиться.

$ git checkout amazing_new_feature

В Git ветка — это отдельная линия разработки. Git checkout позволяет нам переключаться как между удаленными, так и меду локальными ветками. Это один из способов получить доступ к работе коллеги или соавтора, обеспечивающий более высокую продуктивность совместной работы. Однако тут надо помнить, что пока вы не закомитили изменения, вы не сможете переключиться на другую ветку. В такой ситуации нужно либо сделать коммит, либо отложить его, при помощи команды git stash, добавляющей текущие незакоммиченные изменения в стек изменений и сбрасывающей рабочую копию до HEAD’а репозитория.

3. Слияние веток

Наша “потрясающая новая фича” будет еще одним текстовым файлом под названием feature.txt. Мы создадим его, добавим и закоммитим:

$ git add feature.txt
$ git commit -m "New feature complete.”

Изменения завершены, теперь мы можем переключиться обратно на ветку master.

$ git checkout master

Теперь, если мы откроем наш проект в файловом менеджере, мы не увидим файла feature.txt, потому что мы переключились обратно на ветку master, в которой такого файла не существует. Чтобы он появился, нужно воспользоваться merge для объединения веток (применения изменений из ветки amazing_new_feature к основной версии проекта).

$ git merge amazing_new_feature

Теперь ветка master актуальна. Ветка amazing_new_feature больше не нужна, и ее можно удалить.

$ git branch -d awesome_new_feature

Если хотите создать копию удаленного репозитория — используйте git clone. Однако если вам нужна только определенная его ветка, а не все хранилище — после git clone выполните следующую команду в соответствующем репозитории:

git checkout -b <имя ветки> origin/<имя ветки>

После этого, новая ветка создается на машине автоматически.

Бывают ситуации, когда после слива каких-то изменений из рабочей ветки в исходную версию проекта, ее, по правилам хорошего тона, необходимо удалить, чтобы она более не мешалась в вашем коде. Но как это сделать?
Для локально расположенных веток существует команда:

git branch -d local_branch_name

где флажок -d являющийся опцией команды git branch — это сокращенная версия ключевого слова —delete, предназначенного для удаления ветки, а local_branch_name – название ненужной нам ветки.
Однако тут есть нюанс: удалить текущую ветку, в которую вы, в данный момент просматриваете — нельзя. Если же вы все-таки попытаетесь это сделать, система отругает вас и выдаст ошибку с таким содержанием:

Error: Cannot delete branch local_branch_name checked out at название_директории

Так что при удалении ветвей, обязательно переключитесь на другой branch.

Дополнительно

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

1. Отслеживание изменений, сделанных в коммитах

У каждого коммита есть свой уникальный идентификатор в виде строки цифр и букв. Чтобы просмотреть список всех коммитов и их идентификаторов, можно использовать команду log:

Вывод git log

$ git log
commit ba25c0ff30e1b2f0259157b42b9f8f5d174d80d7
Author: Tutorialzine
Date: Mon May 30 17:15:28 2016 +0300
New feature complete
commit b10cc1238e355c02a044ef9f9860811ff605c9b4
Author: Tutorialzine
Date: Mon May 30 16:30:04 2016 +0300
Added content to hello.txt
commit 09bd8cc171d7084e78e4d118a2346b7487dca059
Author: Tutorialzine
Date: Sat May 28 17:52:14 2016 +0300
Initial commit


Как вы можете заметить, идентификаторы довольно длинные, но для работы с ними не обязательно копировать их целиком — первых нескольких символов будет вполне достаточно. Чтобы посмотреть, что нового появилось в коммите, мы можем воспользоваться командой show [commit]
Вывод git show

$ git show b10cc123
commit b10cc1238e355c02a044ef9f9860811ff605c9b4
Author: Tutorialzine
Date: Mon May 30 16:30:04 2016 +0300
Added content to hello.txt
diff --git a/hello.txt b/hello.txt
index e69de29..b546a21 100644
--- a/hello.txt
+++ b/hello.txt
@@ -0,0 +1 @@
+Nice weather today, isn't it?


Чтобы увидеть разницу между двумя коммитами, используется команда diff (с указанием промежутка между коммитами):
Вывод git diff

$ git diff 09bd8cc..ba25c0ff
diff --git a/feature.txt b/feature.txt
new file mode 100644
index 0000000..e69de29
diff --git a/hello.txt b/hello.txt
index e69de29..b546a21 100644
--- a/hello.txt
+++ b/hello.txt
@@ -0,0 +1 @@
+Nice weather today, isn't it?


Мы сравнили первый коммит с последним, чтобы увидеть все изменения, которые были когда-либо сделаны. Обычно проще использовать git difftool, так как эта команда запускает графический клиент, в котором наглядно сопоставляет все изменения.

2. Возвращение файла к предыдущему состоянию

Гит позволяет вернуть выбранный файл к состоянию на момент определенного коммита. Это делается уже знакомой нам командой checkout, которую мы ранее использовали для переключения между ветками. Но она также может быть использована для переключения между коммитами (это довольно распространенная ситуация для Гита — использование одной команды для различных, на первый взгляд, слабо связанных задач).
В следующем примере мы возьмем файл hello.txt и откатим все изменения, совершенные над ним к первому коммиту. Чтобы сделать это, мы подставим в команду идентификатор нужного коммита, а также путь до файла:

$ git checkout 09bd8cc1 hello.txt

3. Исправление коммита

Если вы опечатались в комментарии или забыли добавить файл и заметили это сразу после того, как закоммитили изменения, вы легко можете это поправить при помощи commit —amend. Эта команда добавит все из последнего коммита в область подготовленных файлов и попытается сделать новый коммит. Это дает вам возможность поправить комментарий или добавить недостающие файлы в область подготовленных файлов.
Для более сложных исправлений, например, не в последнем коммите или если вы успели отправить изменения на сервер, нужно использовать revert. Эта команда создаст коммит, отменяющий изменения, совершенные в коммите с заданным идентификатором.
Самый последний коммит может быть доступен по алиасу HEAD:

$ git revert HEAD

Для остальных будем использовать идентификаторы:

$ git revert b10cc123

При отмене старых коммитов нужно быть готовым к тому, что возникнут конфликты. Такое случается, если файл был изменен еще одним, более новым коммитом. И теперь git не может найти строчки, состояние которых нужно откатить, так как они больше не существуют.

4. Разрешение конфликтов при слиянии

Помимо сценария, описанного в предыдущем пункте, конфликты регулярно возникают при слиянии ветвей или при отправке чужого кода. Иногда конфликты исправляются автоматически, но обычно с этим приходится разбираться вручную — решать, какой код остается, а какой нужно удалить.
Давайте посмотрим на примеры, где мы попытаемся слить две ветки под названием john_branch и tim_branch. И Тим, и Джон правят один и тот же файл: функцию, которая отображает элементы массива.
Джон использует цикл:

// Use a for loop to console.log contents.
for(var i=0; i<arr.length; i++) {
console.log(arr[i]);
}

Тим предпочитает forEach:

// Use forEach to console.log contents.
arr.forEach(function(item) {
console.log(item);
});

Они оба коммитят свой код в соответствующую ветку. Теперь, если они попытаются слить две ветки, они получат сообщение об ошибке:

$ git merge tim_branch
Auto-merging print_array.js
CONFLICT (content): Merge conflict in print_array.js
Automatic merge failed; fix conflicts and then commit the result.

Система не смогла разрешить конфликт автоматически, значит, это придется сделать разработчикам. Приложение отметило строки, содержащие конфликт:

Вывод

<<<<<<< HEAD // Use a for loop to console.log contents. for(var i=0; i<arr.length; i++) { console.log(arr[i]); } ======= // Use forEach to console.log contents. arr.forEach(function(item) { console.log(item); }); >>>>>>> Tim's commit.


Над разделителем ======= мы видим последний (HEAD) коммит, а под ним — конфликтующий. Таким образом, мы можем увидеть, чем они отличаются и решать, какая версия лучше. Или вовсе написать новую. В этой ситуации мы так и поступим, перепишем все, удалив разделители, и дадим git понять, что закончили.

// Not using for loop or forEach.
// Use Array.toString() to console.log contents.
console.log(arr.toString());

Когда все готово, нужно закоммитить изменения, чтобы закончить процесс:

$ git add -A
$ git commit -m "Array printing conflict resolved."

Как вы можете заметить, процесс довольно утомительный и может быть очень сложным в больших проектах. Многие разработчики предпочитают использовать для разрешения конфликтов клиенты с графическим интерфейсом. (Для запуска нужно набрать git mergetool).

5. Настройка .gitignore

В большинстве проектов есть файлы или целые директории, в которые мы не хотим (и, скорее всего, не захотим) коммитить. Мы можем удостовериться, что они случайно не попадут в git add -A при помощи файла .gitignore

  1. Создайте вручную файл под названием .gitignore и сохраните его в директорию проекта.
  2. Внутри файла перечислите названия файлов/папок, которые нужно игнорировать, каждый с новой строки.
  3. Файл .gitignore должен быть добавлен, закоммичен и отправлен на сервер, как любой другой файл в проекте.

Вот хорошие примеры файлов, которые нужно игнорировать:

  • Логи
  • Артефакты систем сборки
  • Папки node_modules в проектах node.js
  • Папки, созданные IDE, например, Netbeans или IntelliJ
  • Разнообразные заметки разработчика.

Файл .gitignore, исключающий все перечисленное выше, будет выглядеть так:

*.log
build/
node_modules/
.idea/
my_notes.txt

Символ слэша в конце некоторых линий означает директорию (и тот факт, что мы рекурсивно игнорируем все ее содержимое). Звездочка, как обычно, означает шаблон.

Git bash и git.io

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

  • Git Bash(Bourne Again Shell) — это приложение, являющееся эмулятором командной строки и предоставляющее, операционной системе, некоторые распространенные утилиты bash и собственно саму систему Git. Это терминал, используемый для взаимодействия с персональным компьютером, посредством письменных команд.
  • URL-адреса хранилищ на Гитхабе могут быть довольно длинными, из-за больших имен репозиториев и файлов. Работать с такими ссылками очень не удобно. Поэтому сайт github.io создал git.io — неплохой сервис по преобразованию этих длинных и беспорядочных URL-адресов в более короткие и понятные. Сайт был создан в 2011 году и вплоть до недавнего времени отлично справлялся со своими обязанностями. Однако в начале этого года компания Гитхаб, из-за участившихся попыток хакеров использовать сайт в злонамеренных целях, остановила работу сервиса, а чем известила пользователей в своем блоге. Разработчики популярного ресурса рекомендуют пользоваться другими URL-cutter’ами, пока работа сервиса не будет налажена.

Заключение.

Вот и все! Наше руководство окончено. Мы очень старались собрать всю самую важную информацию и изложить ее как можно более сжато и кратко.
Git довольно сложен, и в нем есть еще много функций и трюков. Если вы хотите с ними познакомиться, вот некоторые ресурсы, которые мы рекомендуем:

  • Официальная документация, включающая книгу и видеоуроки – тут.
  • “Getting git right” – Коллекция руководств и статей от Atlassian – тут.
  • Список клиентов с графическим интерфейсом – тут.
  • Онлайн утилита для генерации .gitignore файлов – тут.

Оригинал статьи доступен на сайте http://tutorialzine.com

Другие статьи по теме

10 полезных Git команд, которые облегчат работу

Шпаргалка по Git, в которой представлены основные команды

Шпаргалка по Git

Основы


  • ctrl + ~ — вызов терминала в VS Code.
  • git init — создаёт git репозиторий (скрытую папку .git) в той директории из которой была вызвана данная команда.
  • git add file — индексирует(подготавливает) file к коммиту.
  • git commit -m 'описание коммита' — коммитит(сохраняет состояние) проиндексированных файлов.

Индексация и коммит файлов

  • git add * — выбирает ВСЕ файлы для индексации, даже те которые не изменились.

  • git add ., или git add --all, или git add -A — выбирает ВСЕ файлы: изменённые, удалённые и новые.

  • git add -u — выбирает ВСЕ файлы для индексации, кроме новых.

  • git add --no--all . — выбирает ВСЕ файлы кроме удалённых (без точки в конце(пути), команда не срабатывает).

  • git add -f — выбирает и индексирует ВСЕ файлы даже игнорируемые.

  • . — путь, обозначающий текущую директорию, т.е. ту в которой запущена команда.

  • :/ — путь, обозначающий рабочую директорию, т.е. ту в которой находится директория .git
    Используя :/ можно индексировать файлы рабочей директории, находять при этом во вложенных директориях.

Индексацию файлов и коммит можно объединить в одну команду:
git commit file-name -m 'commit description'
Чтобы проиндексировать и закомиттить ВСЕ файлы сразу, можно использовать следующую команду:
git commit -am 'commit description'

Отменить индексацию файла:
git rm --cached file

Git не отслеживает пустые директории, поэтому их нельзя добавить в индекс.
Git позволяет очистить рабочую директорию удалив все пустые директории и новые файлы:
git clean -fd-f(force), -d(directory)
При этом данная команда не затрагивает модифицированные или проиндексированные файлы.

Работа с ветками


Переключится на ветку my-branch:
git checkout my-branch или git switch my-branch

Создать и переключиться на ветку my-branch:
git checkout -b my-branch или git switch -c my-branch
Команда git checkout обладает более расширенным функционалом, switch просто переключает ветки.

Создание новой ветки из прошлого коммита, например из коммита с хэшем 123abc4:
git checkout -b new-branch(имя новой ветки) 123abc4(хэш с которого пойдёт ответвление)

Создание новой ветки из текущего коммита создаётся без указания хэша, ветвление пойдёт с текущего коммита:
git checkout -b new-branch

Переименование ветки:
git branch -m старое-имя-ветки новое-имя-ветки

Создание удалённого git репозитория


Для существующего локального проекта.

  1. В существующем проекте инициируем Git (если это ещё не было сделано), индексируем необходимые файлы и коммитим.
  2. Создаем репозиторий на Гитхабе для существующего проекта.
  3. Копируем ссылку с GitHub (в данном случае SSH ссылку) на удаленный репозиторий, и указываем её в команде:
    git remote add origin git@github.com:Ciberian/test-project.git
  4. После этого пушим в мастер ветку удаленного репозитория, наш проект командой:
    git push -u origin master (-u ключ используется только при первом пуше, для связи локальной и удаленной веток.)
    • В дальнейшем можно использовать упрощённую команду git push — для ветки master.
    • Если мы работали в другой ветке, то команда git push origin another-branch — для ветки another-branch.
      Если мы не напишем название ветки, то Git по умолчанию отправит все изменения в ветку master.

Для не существующего локального проекта.

  1. Создаем репозиторий на Гитхабе, или форкаем существующий проект на свой аккаунт.
  2. Копируем SSH ссылку, нажав кнопку Code и выбрав SSH вариант.
  3. Создаём на локальном ПК папку, в которой будет находиться будущий проект.
  4. Открываем через GitBash эту папку (ПКМ).
  5. Клонируем (скачиваем себе на ПК) созданный, или форкнутый репозиторий командой:
    git clone git@github.com:Ciberian/test-project.git .
    Точка в конце команды указывает текущую директорию, в которую будет скачан проект, но можно указать другой путь, если надо.

Работа с pullrequest-ами


Pullrequest-ы делаются в интерфейсе ГитХаба, нажатием соответствующих кнопок.
Если в код потребуется внести изменения, вам нужно снова пройти по цепочке локальные:
изменения — сохранение — коммит — пуш, только пулреквест заново делать не нужно.
Если вы продолжаете вести работу в той же ветке и пулреквест ещё не принят, все ваши изменения автоматически добавятся в пулреквест,
созданный из этой ветки, после команды git push origin название-текущей-ветки.

Форк на GitHub не синхронизируется с оригиналом (мастер-репозиторием) автоматически, чтобы не возникало конфликтов и каждый разработчик мог сам решать, что делать со своим форком.
Чтобы продолжить работу над проектом, нам нужно привести форк в актуальное состояние — получить попавшие в мастер-репозиторий изменения.
Для начала добавим ссылку на мастер-репозиторий, чтобы нам было удобно к нему обращаться, а Git понимал, откуда именно мы хотим забрать изменения.

  1. В локальном репозитории вводим команду git checkout master, переходим в ветку master.

  2. Заходим в мастер-репозиторий, копируем его SSH-адрес и вводим в терминале команду:
    git remote add alias git@github.com:htmlacademy-javascript/1332863-keksobooking-25.git

В этой команде вам нужно подставить свои данные:
alias — короткое имя (алиас) для репозитория. На курсах для обращения к мастер-репозиторию мы используем алиас academy,
но вы можете выбрать любой другой: вместо academy указывайте своё название, и оно закрепится за этим репозиторием.
git@github.com:htmlacademy-javascript/1332863-keksobooking-25.git — путь к репозиторию (тот самый SSH-адрес, который вы копируете на странице репозитория)

  1. Теперь можем забирать (подтягивать) изменения из ветки master мастер-репозитория командой не указывая каждый раз путь к репозиторию:
    git pull academy master
    После этого в ветке master локального форка появятся те же коммиты, что и в мастер-репозитории.

  2. Отправляем подтянутые из мастер-репозитория изменения в свой форк на GitHub с помощью команды:
    git push origin master

Объединение изменений из двух веток с помощью rebase


  1. Допустим мы создали ветку develop из ветки master.
  2. Поработали в ветке develop и сделали несколько коммитов.
  3. Тем временем кто-то также поработал в ветки master, внёс туда изменения и закоммитил.
  4. Вам нужно получить изменения из ветки master в ветку develop и при этом не затереть изменения в ветке develop.
  5. Встаём в ветку develop и вызываем команду git rebase master — теперь изменения из ветки master попали в ветку develop

Если же нужно просто перетащить изменения из одной ветки в другую, например в ситуации когда вы начали работу в ветке develop_1, внесли изменения и закоммитили.
А потом вспомнили что разработку нужно было вести в ветке develop_2, то создаёте ветку develop_2 и в ней вызываете команду
git cherry-pick develop_1 — последний коммит вместе со всеми изменениями попадёт из ветки develop_1 в ветку develop_2

Перенос коммитов из одной ветки в другую с помощью rebase


  1. Допустим мы работали в ветке master и сделали там несколько коммитов, а работу нужно было вести в ветке develop.
  2. Создаём ветку develop и встаём на неё.
  3. Далее выбираем в ветке master коммит, все следующие за которым коммиты нужно перенести в новую ветку (допустим коммит с хешем 0c110875248a2e45a4f7b92c3028d20a83da3e96).
  4. Вводим команду git rebase -i --no-autosquash 0c110875248a2e45a4f7b92c3028d20a83da3e96.
  5. Флаг -i позволит перейти в интерактивный режим и при необходимости удалить или поменять местами перетаскиваемые коммиты.
    Флаг --no-autosquash не даст автоматически сжать переносимые коммиты в один коммит.

По итогу коммиты из ветки master будут удалены и добавлены в ветку develop.

Дополнительная информация


Откат файла к состоянию в определённом коммите:
git checkout commit-hash dir/file-name
Откатывает только указанный файл, остальные остаются не изменными.

Удаление файла из коммита и одновременно из папки проекта:
git rm dir/file-name.css
Фиксируем удаление новым коммитом:
git commit --amend --no-edit
Таким образом Гит не изменяет старый коммит, а создаёт новый и заменяет старый на новый.

Удаление файла из коммита, но не удаление его из папки проекта:
git rm --cached dir/file-name.css
Фиксируем удаление новым коммитом:
git commit --amend --no-edit

Удаление последнего коммита:
git reset --hard HEAD~
Флаг --hard означает полное удаление. Без него git reset отменит коммит, но не удалит его, а поместит все изменения этого коммита в рабочую директорию, так что с ними можно будет продолжить работать.
HEAD~ означает «один коммит от последнего коммита». Если бы мы хотели удалить два последних коммита, то могли бы написать HEAD~2.

Удаление до указанного коммита:
git reset --hard a3775a5485af0af20375cedf46112db5f813322a
Удаляет все коммиты после указанного и возращается к тому коммиту, который мы указали.

Чтобы сделать аналогичное удаление коммитов на удалённом репозитории ГитХаб, нужно использовать команду:
git push origin branchname --force
origin — имя удалённого репозитория.
branchname — ветка в которой мы будем делать откат.

Небольшие изменения, которые присутствуют только на локальном ПК, можно досылать в последний коммит, а не создавать ради этого новый коммит.
Для этого индексируем изменения и используем команду:
git commit --amend
Появится редактор, в котором можно изменить сообщение последнего коммита, или закрыть редактор и оставить старое сообщение.
Для того, чтобы не открывался редактор для ввода описания коммита к команде git commit --amend можно добавить опцию --no-edit.
В этом случае описание коммита не изменится.

Вы написали сообщение коммита (commit message) с ошибкой. Как её исправить?
У команды commit есть параметр amend, который позволяет изменить последний коммит:
git commit --amend -m 'Правильное сообщение коммита'

История коммитов в одну строку:
git log --oneline

История коммитов в виде графа, чтобы ориентироваться в ветках:
git log --graph

Поиск в истории коммитов изменение конкретного файла:
git log -p --oneline -- todo.md

Временно спрятать изменённые файлы вне зависимости от того проиндексированы они или нет:
git stash

Вернуть изменённые файлы обратно:
git stash pop

Stash в Git работает по принципу стека. Он позволяет сохранить внутрь любое количество изменений и восстановить их в обратном порядке.
Чтобы спрятать новый файл, нужно его проиндексировать, иначе stash его не увидит.

Файл .gitignore


Git позволяет гибко настраивать игнорирование определенных файлов и директорий.
Делается это с помощью файла .gitignore, который нужно создать в корне проекта:
В этом файле можно оставлять комментарии с помощью знака #

Пример содержания данного файла:

Игнорируется файл в любой директории проекта:
access.log

Игнорируется директория в любой директории проекта:
node_modules

Игнорируется каталог в корне рабочей директории:
/coverage

Игнорируются все файлы с расширением sqlite3 в директории db, но не игнорируются такие же файлы внутри любого вложенного каталога в db
например, /db/something/lala.sqlite3:
/db/*.sqlite3

Игнорируются все .txt файлы в каталоге doc/ на всех уровнях вложенности:
doc/**/*.txt

Еще вариант .gitignore

Создание ssh-ключей


ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Дальше будет несколько вопросов. На все вопросы нужно нажимать Enter.

Запуск агента ssh, который следит за ключами
eval "$(ssh-agent -s)"

Добавления нового ssh-ключа в агент
ssh-add ~/.ssh/id_rsa

Выведите содержимое файла ~/.ssh/id_rsa.pub и скопируйте его:
cat ~/.ssh/id_rsa.pub

Добавьте ssh-ключ в аккаунт Github. При добавлении вас попросят назвать ключ. Напишите что-нибудь в стиле home.


Git

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

История Git начинается в 2005 году, когда Линус Торвальдс, создатель ядра Linux, начал разработку новой системы контроля версий для управления исходным кодом ядра Linux. Он был недоволен тогдашними системами контроля версий, которые были неэффективными или сложными в использовании. Git был создан как быстрый, эффективный и легко расширяемый инструмент для работы с крупными проектами с распределенной архитектурой.

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


Команды GIT

git clone

Команда git clone используется для создания локальной копии удаленного репозитория Git. Это позволяет вам получить копию проекта на вашем локальном компьютере и начать работу с ним.

Синтаксис команды git clone:

git clone <URL репозитория> [<название локальной папки>]

где <URL репозитория> — это URL-адрес удаленного репозитория Git, а <название локальной папки> (необязательный параметр) — это название локальной папки, в которую будет склонирован репозиторий. Если <название локальной папки> не указан, Git автоматически создаст папку с названием репозитория.

Пример использования команды git clone:

git clone https://github.com/username/repo.git

Эта команда создаст локальную копию удаленного репозитория repo, который находится в аккаунте username на GitHub, в папке с названием repo.

Если вы хотите указать свое собственное название для локальной папки, вы можете добавить его после URL-адреса репозитория:

git clone https://github.com/username/repo.git myproject

Эта команда создаст локальную копию удаленного репозитория repo в папке myproject. Если папка myproject уже существует, Git выведет сообщение об ошибке и не склонирует репозиторий.


git init

Команда git init используется для создания нового локального репозитория Git. После выполнения этой команды Git создает в текущей директории новую поддиректорию с именем .git, в которой хранятся все файлы Git, необходимые для управления версиями в этом репозитории.

Синтаксис команды git init:

git init [--bare] [<directory>]

—bare — определяет репозиторий как «голый», т.е. без рабочей директории. Это используется для создания удаленного репозитория.

<directory> — указывает директорию, в которой создается локальный репозиторий. Если параметр не указан, репозиторий создается в текущей директории.

Пример использования команды git init:

$ cd my_project
$ git init
Initialized empty Git repository in /path/to/my_project/.git/

Эта команда создает новый локальный репозиторий Git в текущей директории my_project. Git создает поддиректорию .git и инициализирует ее файлами, необходимыми для управления версиями.

Флаг —bare используется для создания «голого» удаленного репозитория. Например:

$ mkdir my_repo.git
$ cd my_repo.git
$ git init --bare
Initialized empty Git repository in /path/to/my_repo.git/

Эта команда создает новый удаленный репозиторий Git в директории my_repo.git. Флаг —bare указывает, что это «голый» репозиторий, т.е. без рабочей директории.

Команда git init также поддерживает другие опции и флаги, которые можно использовать в различных сценариях. Например, флаг —template позволяет указать кастомный шаблон инициализации, а опция —separate-git-dir позволяет разместить репозиторий в другой директории. Список всех опций и флагов можно посмотреть в документации Git.


git add

Команда git add . используется для добавления изменений в индекс Git. Индекс — это промежуточный слой между рабочей директорией (где находятся ваши файлы) и репозиторием Git (где сохраняются изменения). Когда вы делаете изменения в файлах в рабочей директории, они не автоматически добавляются в индекс. Для того, чтобы добавить изменения в индекс, необходимо использовать команду git add.

Синтаксис команды git add . :

git add .

Эта команда добавляет все измененные файлы в рабочей директории в индекс.

Пример использования команды git add . :

Создайте новый файл с названием file.txt в вашей рабочей директории и добавьте в него какой-то текст.

Выполните команду git status, чтобы увидеть изменения в рабочей директории:

$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
file.txt

nothing added to commit but untracked files present (use "git add" to track)

Вы видите, что файл file.txt еще не отслеживается Git.

Выполните команду git add ., чтобы добавить все измененные файлы в рабочей директории в индекс:

$ git add .

Снова выполните команду git status, чтобы увидеть изменения в индексе:

$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: file.txt

Вы видите, что файл file.txt был добавлен в индекс.

Выполните команду git commit, чтобы сохранить изменения в репозитории Git:

$ git commit -m "Added file.txt"
[master 0e3b0a7] Added file.txt
1 file changed, 1 insertion(+)
create mode 100644 file.txt

Вы видите, что файл file.txt был успешно добавлен в репозиторий Git.

Команда git add . очень полезна, когда вам нужно добавить много файлов в индекс одновременно. Однако, будьте осторожны, когда используете эту команду, особенно если вы работаете в большом проекте с множеством файлов. В некоторых случаях вам может потребоваться выбирать файлы для добавления в индекс более тщательно, чтобы избежать случайного добавления ненужных файлов.


git commit

Команда git commit используется для сохранения изменений, сделанных в вашем локальном репозитории, в истории коммитов. Каждый коммит в Git имеет уникальный идентификатор, дату и время коммита, имя автора, электронную почту и сообщение, описывающее изменения.

Синтаксис команды git commit:

git commit -m "<сообщение коммита>"

Где -m означает «message» (сообщение) и <сообщение коммита> — это краткое описание изменений, сделанных в коммите.

Пример использования команды git commit:

Добавьте изменения в индекс с помощью команды git add (например, git add filename.txt или git add . для добавления всех измененных файлов в индекс). Сделайте коммит с помощью команды git commit и передайте сообщение коммита в кавычках, чтобы описать, что было изменено. Например:

git commit -m "Добавлен новый файл README.md"

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

Кроме того, команду git commit можно дополнительно настраивать, используя различные параметры, например, -a (автоматически добавляет все измененные файлы в индекс) или —amend (используется для изменения последнего коммита). Для получения подробной информации о доступных параметрах команды git commit можно обратиться к документации Git.


git push

Команда git push используется для отправки изменений из вашего локального репозитория в удаленный репозиторий Git. Это позволяет обновить содержимое удаленного репозитория на основе ваших локальных изменений.

Синтаксис команды git push:

git push <remote> <branch>

Где <remote> — это имя удаленного репозитория, куда вы хотите отправить изменения, а <branch> — это название ветки, которую вы хотите отправить.

Пример использования команды git push:

git push origin main

Эта команда отправляет изменения из вашей локальной ветки main в удаленный репозиторий с именем origin.

Помимо базового синтаксиса, команда git push имеет несколько флагов, которые можно использовать для дополнительной настройки:

-u или —set-upstream — устанавливает отслеживание для ветки, что позволяет вам использовать git push и git pull без указания имени удаленного репозитория и названия ветки;
-f или —force — заставляет Git принудительно заменить удаленную ветку измененной локальной веткой, даже если это приведет к потере данных;
-n или —dry-run — позволяет вам протестировать команду git push, не отправляя реальных изменений в удаленный репозиторий;
-v или —verbose — выводит дополнительную информацию о процессе отправки изменений.

Пример использования команды git push с флагом:

git push -u origin main

Эта команда отправляет изменения из вашей локальной ветки main в удаленный репозиторий с именем origin и устанавливает отслеживание для этой ветки.


git status 

Команда git status используется для получения информации о текущем состоянии вашего рабочего пространства Git. Она показывает, какие файлы были изменены, какие из них были добавлены в индекс, и какие из них готовы к коммиту. Кроме того, команда «git status» сообщает о текущей ветке и другой полезной информации.

Синтаксис команды «git status»:

git status [-s] [--long] [--branch] [--porcelain] [--ignore-submodules[=<when>]]

Основные флаги:

«-s» или «—short«: показывает краткую информацию о состоянии файлов в формате «git diff —shortstat».
«—long«: показывает длинный формат состояния файлов, включая информацию о последнем коммите для каждого файла.
«—branch«: показывает текущую ветку и ее состояние.
«—porcelain«: показывает состояние файлов в машинно-читаемом формате, что полезно для автоматизации.
«—ignore-submodules«: позволяет игнорировать изменения в подмодулях.

Пример использования команды «git status»:

$ git status

На ветке main
Ваша ветка опережает «origin/main» на 1 коммит.
  (используйте «git push», чтобы опубликовать локальные коммиты)

изменения, которые будут включены в коммит:
  (используйте «git restore --staged <file>...», чтобы убрать из индекса)

        изменён:   README.md

изменения, которые не проиндексированы для коммита:
  (используйте «git add <file>...», чтобы проиндексировать)

        изменён:   index.html

нет изменений добавленных для коммита (используйте «git add» и/или «git commit -a»)

Эта команда показывает, что находитесь на ветке «main», ваша локальная ветка опережает ветку «origin/main» на один коммит, и что были внесены изменения в файлы «README.md» и «index.html». Файл «README.md» был проиндексирован и готов к коммиту, а файл «index.html» не был проиндексирован. Для того, чтобы проиндексировать файл «index.html», нужно использовать команду «git add index.html».


git diff

Команда git diff используется для просмотра различий между версиями файлов в репозитории. Она показывает, какие изменения были сделаны в файлах с момента последнего коммита.

Основной синтаксис команды git diff выглядит так:

git diff [<опции>] [<источник>] [<цель>]

Где:

<источник> — определяет начальную точку изменений для отображения различий.
<цель> — определяет конечную точку изменений для отображения различий.
<опции> — дополнительные флаги, изменяющие поведение команды.

Основные флаги git diff:

—cached — сравнивает изменения между вашим индексом (т.е. тем, что будет в следующем коммите) и последним коммитом.
—stat — показывает статистику изменений для каждого файла.
—color — отображает различия с использованием цветов для лучшей читаемости.

Примеры использования:

git diff - простой запуск команды покажет различия между вашей рабочей копией и последним коммитом.
git diff --cached - покажет различия между вашим индексом и последним коммитом.
git diff HEAD - покажет различия между вашей рабочей копией и последним коммитом.
git diff HEAD~2 HEAD - покажет различия между двумя последними коммитами.
git diff --stat - покажет статистику изменений для каждого файла.
git diff --color - покажет различия с использованием цветов.

Кроме того, можно использовать git diff для сравнения любых двух коммитов, веток или тэгов в репозитории. Например, git diff branch1..branch2 покажет различия между двумя ветками branch1 и branch2.


git log

Команда git log используется для просмотра истории коммитов в репозитории Git. Она отображает список коммитов в обратном хронологическом порядке, начиная с последнего.

Пример использования команды git log:

git log

Эта команда показывает список всех коммитов в репозитории, от самых последних до самых старых. Каждый коммит включает SHA-1 хеш, автора коммита, дату и время коммита, и комментарий.

Основные флаги команды git log:

—oneline: показывает каждый коммит в одной строке, содержащей только его SHA-1 хеш и комментарий.

—graph: показывает историю коммитов в виде графа, что позволяет легко визуализировать разветвленную историю ветвлений и слияний.

—author=<имя>: показывает только коммиты, сделанные указанным автором.

—since=<дата>: показывает только коммиты, сделанные после указанной даты.

—until=<дата>: показывает только коммиты, сделанные до указанной даты.

-n <количество>: показывает только указанное количество последних коммитов.

—grep=<строка>: показывает только коммиты, содержащие указанную строку в своих комментариях.

Пример использования флага —since:

git log --since=2022-01-01

Эта команда показывает список всех коммитов, сделанных после 1 января 2022 года.

Пример использования флага —author:

git log --author="John Doe"

Эта команда показывает список всех коммитов, сделанных автором с именем «John Doe».

Пример использования флага —grep:

git log --grep="bug"

Эта команда показывает список всех коммитов, содержащих слово «bug» в своих комментариях.


git checkout

Команда git checkout в Git используется для переключения между ветками, проверки коммитов и отката изменений. Она позволяет переключаться между различными состояниями вашего репозитория.

Основные флаги:

-b: создать новую ветку и переключиться на нее. Например, git checkout -b new-branch создаст новую ветку с названием «new-branch» и переключится на нее.
-f: принудительно перезаписывает локальные изменения, которые не были зафиксированы. Этот флаг используется только в крайних случаях.
-p: позволяет просмотреть и выбрать конкретные изменения для восстановления.
<commit/branch>: позволяет переключиться на определенный коммит или ветку.

Примеры использования:

Переключение на ветку:

git checkout main

Эта команда переключает вас на ветку «main».

Создание новой ветки и переключение на нее:

git checkout -b new-branch

Эта команда создает новую ветку с названием «new-branch» и переключает вас на нее.

Переключение на определенный коммит:

git checkout 2a3e8c9

Эта команда переключает вас на коммит с указанным идентификатором.

Отмена изменений в файле:

git checkout myfile.txt

Эта команда отменяет изменения в файле «myfile.txt» и восстанавливает его до последней зафиксированной версии.

Восстановление определенных изменений:

git checkout -p myfile.txt

Эта команда позволяет вам просмотреть изменения в файле «myfile.txt» и выбрать, какие из них восстановить.


git branch

Команда git branch используется для просмотра, создания и удаления веток в репозитории Git. Ветка — это отдельная линия разработки, которая может включать в себя свой собственный набор коммитов.

Основные флаги команды git branch:

-a — показывает все ветки (включая удаленные)
-d — удаляет ветку (данная команда удаляет только те ветки, которые были слиты в текущую ветку)
-D — удаляет ветку без проверки, были ли все её изменения слиты с текущей веткой
-m — переименовывает текущую ветку
-r — показывает все удаленные ветки

Примеры использования команды git branch:

Просмотр списка веток:

git branch

Создание новой ветки:

git branch new-branch

Переименование текущей ветки:

git branch -m new-branch-name

Удаление ветки:

git branch -d branch-to-delete

Просмотр удаленных веток:

git branch -r

Команда git branch позволяет управлять ветками в репозитории и помогает организовать работу в команде. Она также помогает контролировать историю изменений в проекте.


git fetch

Команда git fetch используется для получения изменений из удаленного репозитория Git, но не вносит изменения в локальную ветку. Эта команда позволяет вам получить информацию о ветках и коммитах, которых еще нет в локальном репозитории.

Синтаксис команды git fetch:

git fetch [<remote>] [<refspec>...]

Основные флаги:

<remote>: имя удаленного репозитория Git (например, origin). Если не указан, Git использует имя origin по умолчанию.
<refspec>: имена веток и тегов, которые вы хотите получить из удаленного репозитория. Если не указан, Git получает все ветки и теги.

Пример использования команды git fetch:

git fetch

Эта команда получает все изменения из удаленного репозитория Git, который связан с вашим локальным репозиторием. После выполнения этой команды вы можете выполнить команду git log origin/master для просмотра истории изменений в удаленной ветке master.

git fetch origin feature-branch

Эта команда получает все изменения из удаленной ветки feature-branch в удаленном репозитории Git, связанном с вашим локальным репозиторием. После выполнения этой команды вы можете выполнить команду git log origin/feature-branch для просмотра истории изменений в удаленной ветке feature-branch.


git pull

Команда git pull используется для получения изменений из удаленного репозитория и объединения их с вашей локальной веткой.

Основной синтаксис команды git pull выглядит следующим образом:

git pull [<options>] [<repository> [<refspec>...]]

Основные флаги git pull:

—rebase: выполняет перебазирование текущей ветки на самый новый коммит вместо создания слияния (merge). Рекомендуется использовать этот флаг, если вы хотите, чтобы история коммитов оставалась простой и понятной.
—no-rebase: отменяет перебазирование и выполняет слияние вместо этого.
—no-commit: предотвращает создание автоматического коммита после выполнения слияния. Это дает возможность внести дополнительные изменения перед фиксацией изменений.
—ff-only: выполнить слияние только в том случае, если это можно сделать быстрым перемещением ветки вперед (fast-forward).
—no-ff: выполнить слияние только как коммит слияния (merge commit), даже если это можно сделать быстрым перемещением ветки вперед.

Примеры использования команды git pull:

Простой git pull, который получает изменения из удаленной ветки и автоматически объединяет их с локальной веткой:

git pull

git pull с использованием флага —rebase, который перебазирует текущую ветку на самый новый коммит из удаленной ветки вместо создания слияния:

git pull --rebase

git pull с использованием флага —no-commit, который предотвращает создание автоматического коммита после выполнения слияния:

git pull --no-commit

git pull с использованием флага —ff-only, который выполнит слияние только в том случае, если это можно сделать быстрым перемещением ветки вперед (fast-forward):

git pull --ff-only

git pull с использованием флага —no-ff, который выполнит слияние только как коммит слияния (merge commit), даже если это можно сделать быстрым перемещением ветки вперед:

git pull --no-ff

git merge

Команда git merge используется для объединения изменений из одной ветки в другую. Она применяется для слияния изменений, которые были внесены в отдельной ветке, обычно для объединения фиксации ошибок или добавления функциональности в проект.

Синтаксис команды git merge:

git merge <имя ветки>

где <имя ветки> — это имя ветки, изменения из которой вы хотите объединить в текущую ветку.

Пример использования команды git merge:

Сначала, вам нужно переключиться на ветку, в которую вы хотите объединить изменения:

git checkout master

Затем вы можете выполнить команду git merge, указав имя ветки, из которой вы хотите получить изменения:

git merge feature-branch

В этом примере мы объединяем изменения из ветки feature-branch в текущую ветку master.

Основные флаги команды git merge:

—no-ff: Отключает быстрое слияние, что создает коммит с объединением, даже если изменения можно было бы просто быстро применить.
—abort: Отменяет текущее слияние и возвращает репозиторий в предыдущее состояние.

Пример использования флага —no-ff:

git merge --no-ff feature-branch

В этом примере мы отключаем быстрое слияние и создаем новый коммит с объединением.

Пример использования флага —abort:

git merge --abort

В этом примере мы отменяем текущее слияние и возвращаем репозиторий в предыдущее состояние.


git rebase

Команда git rebase используется для перебазирования текущей ветки на другую ветку или на определенный коммит. Это означает, что изменения из исходной ветки будут применены поверх коммитов в целевой ветке или коммите.

Основные флаги:

-i (или —interactive): запускает интерактивный режим, который позволяет изменять порядок, объединять или отбрасывать коммиты.
-m (или —merge): используется, когда нужно перебазировать ветку слияния.
—onto <branch>: перебазирует текущую ветку на указанную ветку.

Примеры использования команды git rebase:

Перебазирование текущей ветки на другую ветку:

git checkout feature-branch
git rebase main

В этом примере текущая ветка feature-branch перебазируется на ветку main. Это означает, что изменения из ветки main будут применены поверх коммитов в ветке feature-branch.

Перебазирование текущей ветки на определенный коммит:

git checkout feature-branch
git rebase abc123

В этом примере текущая ветка feature-branch перебазируется на коммит с хеш-кодом abc123. Это означает, что изменения из этого коммита и всех коммитов после него будут применены поверх коммитов в ветке feature-branch.

Использование интерактивного режима:

git checkout feature-branch
git rebase -i main

В этом примере запускается интерактивный режим, который позволяет изменять порядок, объединять или отбрасывать коммиты при перебазировании ветки feature-branch на ветку main.

Перебазирование ветки слияния:

git checkout merge-branch
git rebase -m main

В этом примере ветка merge-branch, являющаяся веткой слияния, перебазируется на ветку main. Опция -m используется для корректной обработки коммитов слияния.


git revert

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

Синтаксис команды git revert:

git revert <commit>

где <commit> — это хэш-идентификатор коммита, который нужно отменить.

Пример использования команды git revert:

$ git log --oneline
d3b3d43 Commit C
786f7f8 Commit B
12556fa Commit A

$ git revert d3b3d43

Эта команда создаст новый коммит, который отменяет изменения, внесенные коммитом с хэш-идентификатором d3b3d43.

Флаги:

—no-commit: применить изменения, но не создавать новый коммит. Это позволяет вам проверить изменения перед тем, как закоммитить их.
-m parent-number: используется, если коммит имеет несколько родительских коммитов (как в случае с объединением веток). Он указывает, какой из родительских коммитов следует использовать при выполнении операции отмены.

Пример использования команды git revert с флагом —no-commit:

$ git revert --no-commit d3b3d43
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        modified:   file.txt

Эта команда отменяет изменения, внесенные коммитом с хэш-идентификатором d3b3d43, и добавляет их в индекс. Но новый коммит не создается, пока не будет выполнена команда git commit.


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

. Пошаговое руководство: как выполнить слияние веток в git, как создать новую ветку и репозиторий, как выписать ветку с github и т.п. Инструкции по git для начинающих.

Git – это распределенная система контроля версий. Это главное отличие git от svn. Каждый разработчик создает на своем компьютере отдельный, полноценный репозиторий.

git config —global user.name ‘Alexander’ создаем глобального пользователя
git config —global user.email est @mail.ru создаем email глобального пользователя
git init создать репозеторий
git status получаем статус изменений
git add (-a добавит в индекс все файлы | или название файла) добавить файл для отслеживания
git diff просморт неидексированных изменений
git diff —cached просморт идексированных изменений
git commit -m «name commit» коммит
git commit -a -m «name commit» комиит с автоматическим добавление в индекс отклеживаемых файлов
git rm «name commit» удаление файлов (из индекса, коммит)
git rm —cached readme.txt удалить файл из индекса
git mv file_from file_to перемещение/переименование файла
git clone git://github.com/schacon/simplegit-progit.git копирование репозитория
git log список комитов
git log —pretty=oneline список коммитов (в 1 строку параметры)
git log -p -2 последние 2 коммита с дельтой разница(-p)
git log —abbrev-commit —pretty=oneline показывает коммит с кратким хешем —abbrev-commit
$ git log —pretty=format:»%h — %an, %ar : %s» список коммитов в строку (вывод по шаблону)
git log master..experiment все коммиты experiment которых нет в master
git log origin/master..HEAD все коммиты в текущей ветке, которых нет в ветке master на сервере origin
git reset HEAD benchmarks.rb отмена последнего действия с файлом (удаление файла из индекса)
git commit —amend добавляет в последний коммит изменения (проиндексированыые)
git checkout — benchmarks.rb отмена изменений в файле (возврат к состоянию предидущего коммита)
cd переход в директорию
mkdir создание деректории
touch создание файла
git remote show origin посмотреть инфу о удаленном репозитории origin
git remote -v просмотр удаленных репозеториев
git remote add pb git://github.com/paulboone/ticgit.git Добавить удаленный репозиторий
git remote add dv ssh://user@domen.ru:22/data/sites/site.ru
где:
user — пользователь
domen.ru — сервер
22 — порт
/data/sites/site.ru — папка сайта

Для разрешения доступа push/pull
git config receive.denyCurrentBranch ignore

Добавить удаленный репозиторий (подключаемся по ssh)
git remote rename pb paul переименование удаленного репозитория
git remote rm paul удаление удаленного репозитория
git fetch pb получить свежие данные с репозитория pb
git pull pb получить свежие данные с репозитория pb + пытается слить ветки
git push origin master поделить данными с репозеторием origin ветка master
git tag список меток
git tag -a v1.4 -m ‘my version 1.4’ добавить аннотированную метку
git tag v1.4-lw добавить легковесную ветку (уменьшенная инфа)
git tag -a v1.2 -m ‘version 1.2’ 9fceb02 добавление метки к коммиту
git show v1.4 посмотреть данные метки, изменения в коммите
git show master@{yesterday} где верхушка ветки находилась вчера
git push origin v1.5 отправить метку в удаленный репозиторий
git push origin —tags отправить все метки в удаленный репозиторий
git branch testing создать ветку
git branch testing test создать ветку testing на основе ветки test
git checkout -b iss53 создать ветку и сразу перейти на нее
git checkout -b iss53 test создать ветку iss53 (и сразу перейти на нее) на основе test
git checkout -b rubyclient jessica/ruby-c создать ветку rubyclient на основе ветки ruby-c удаленного репозитория jessasica
git checkout testing перейти в ветку
git merge hotfix обьединение веток
git branch -d hotfix удаление слитой ветки
git branch -D hotfix удаление ветки (не слитой, принудительно)
git branch список веток
git branch -v список веток с последним коммитом
git branch —merged список веток слитых с текущей
git branch —no-merged список веток не слитых с текущей
git push origin :serverfix удалить ветку на удаленном сервере
git push origin featureB:featureBee отправить локульную ветку featureB в удаленную ветку featureBee
git checkout experiment git rebase master перемещение коммита из одной ветки в другую
git checkout origin/branch переключиться на удаленную ветку
git checkout —track origin/branch переключиться на удаленную ветку и создать локальную для отслеживания
git rebase —onto master server client “переключиться на ветку client, взять изменения от общего предка веток client и server и повторить их на master”.
git rebase master server git checkout master git merge server перемещение ветки server на ветку master без предварительного переключения на эту ветку при помощи команды. выполнить перемотку основной ветки (master)
git push —force переписать изменения на сервере
ssh-keygen генерировтаь открытый ключ
cd ~/.ssh ls посмотреть наличие ssh ключа: .pub — открытый ключ, id_dsa или id_rsa — секретный
cat ~/.ssh/id_rsa.pub посмотреть открытый ключ
git checkout -b featureBv2 origin/master git merge —no-commit —squash featureB Опция —squash берёт всю работу на сливаемой ветке (featureB) и сжимает её в один коммит, не являющийся коммитом-слиянием, и помещает его на верхушку текущей ветки. Опция —no-commit сообщает Git’у, что не нужно автоматически записывать коммит. Это позволит вам внести все изменения с другой ветки и затем сделать ещё ряд изменений перед записью нового коммита.
git format-patch -M origin/master Команда format-patch создаёт файлы с патчами и выводит их названия. Опция -M сообщает Git’у о необходимости отслеживания переименований файлов.
git diff master получить разницу слияния текущей ветки с master
git archive master —prefix=’project/’ | gzip > `git describe master`.tar.gz создать tar архив слепка ветки
git archive master —prefix=’project/’ —format=zip > `git describe master`.zip создать zip архив слепка ветки
git shortlog краткая сводка изменений
git checkout — 4a2f59a32bd1074c42 name_of_file возврат состояния файла к нужному коммиту
git reset —hard 4a2f59a32bd1074c42 возврат всех изменений к нужному коммиту
git log -p feedback_form…origin/feedback_form посмотреть изменения между локальной веткой и удаленной
git merge origin/feedback_form слить локальную ветку с удаленной
git push -u origin feedback_form отправить ветку на удаленный сервер и отслеживать изменения
git config —global alias.st «status» создать алиас для команды
git stash — копилка изменений
git stash save ‘NAME’ сохранить измененные файлы в копилку
git stash list показать что содержится в копилке
git stash show shash@{0} показать список файлов спрятанных в патч копилки
git stash show -p shash@{0} показать список файлов спрятанных в патч копилки
git stash apply взять все из копилки и положить в рабочую директорию гита (в текущую ветку)
git stash pop взять все из копилки и положить в рабочую директорию гита (в текущую ветку) и удалить из копилки
git stash pop stash@{0} взять патч 0 из копилки
git stash drop stash@{0} удалить патч 0 из копилки
git stash clear удаляет все из копилки

Опубликовано:

  • Git
  • Tools

Все, что вам нужно знать, в одной удобной шпаргалке

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

Это руководство представляет собой краткое описание наиболее распространённых команд Git. Оно не претендует на роль исчерпывающего руководства по Git, а скорее является кратким справочником по наиболее распространённым командам.

Вот пересмотренная шпаргалка по git с улучшенными названиями разделов и реорганизацией:

Установка и конфигурирование

# Инициализация нового репозитория Git
git init
# Клонирование и создание локальной копии удалённого репозитория
git clone <url>
# Настройте глобальные параметры Git
git config --global <имя_параметра> <значение>
# Настройка локальных параметров Git для конкретного репозитория
git config --local <имя_параметра> <значение>

# --------------- Расширенные ------------------

# Показать сводку настроек конфигурации Git
git config --list
# Установить пользовательский текстовый редактор для сообщений Git
git config --global core.editor " <команда_редактора>"
# Создать псевдоним команды Git
git config --global alias.<псевдоним> <команда>
# Включить автоматическое окрашивание вывода Git'а
git config --global color.ui auto
# Кэшировать учётные данные Git на определённое время
git config --global credential.helper 'cache --timeout=<секунды>'
# Настроить git на обнаружение определённых типов ошибок пробельных символов
git config --global core.whitespace <опции>
# Автоматически обрезать ветви удалённого отслеживания при получении обновлений
git config --global fetch.prune true
# Установить пользовательский инструмент diff для Git
git config --global diff.tool <инструмент>
# Установить пользовательский инструмент слияния для Git
git config --global merge.tool <инструмент>
# Сравнение изменения с помощью пользовательского инструмента diff
git difftool
# Разрешение конфликтов слияния с помощью пользовательского инструмента слияния
git mergetool

Файловые операции

# Показать состояние рабочего дерева
git status
# Добавить файлы в область хранения
git add <файл(ы)>
# Удалить файлы из рабочего дерева и области хранения
git rm <файл(ы)>
# Переместить или переименовать файл
git mv <старый_файл> <новый_файл>
# Коммит изменений с сообщением
git commit -m "сообщение коммита"
# Показать различия между рабочим деревом и последним коммитом
git diff

# --------------- Расширенные ------------------

# Предположить, что отслеживаемый файл не изменился
git update-index --assume-unchanged <файл>
# Восстановить нормальное поведение отслеживания изменений
git update-index --no-assume-unchanged <файл>
# Показать различия между двумя коммитами
git diff <коммит_id1>..<коммит_id2>
# Удалить файл, но сохранить в рабочем каталоге
git rm --cached <имя_файла>

Ветвление и слияние

# Список всех ветвей
git branch
# Создать новую ветвь
git branch <имя_ветви>
# Переход к определённой ветви
git checkout <имя_ветви>
# Объединить ветвь с текущей ветвью
git merge <имя_ветви>
# Удалить определённую ветвь
git branch -d <имя_ветви>
# Вывести список всех удалённых ветвей
git branch -r

# --------------- Расширенные ------------------

# Список ветвей с дополнительной информацией
git branch -vv
# Создать новую ветвь на основе удалённой ветви
git checkout -b <имя_ветви> <имя_удалённой_ветви>/<имя_удалённой_ветви>
# Отменить слияние в случае конфликтов
git merge --abort
# Перебазировать текущую ветвь на другую ветвь
git rebase <имя_ветви>
# Отменить текущую операцию ребазирования
git rebase --abort
# Интерактивное ребазирование для редактирования, сквоша, переупорядочивания или сброса коммитов
git rebase -i
# Интерактивный возврат коммитов в текущей ветви на удалённую ветвь
git rebase -i <имя_удалённой_ветви>/<удалённая_ветвь>

Удалённые репозитории

# Список удалённых репозиториев
git remote
# Добавить удалённый репозиторий
git remote add <имя> <url>
# Извлечение из удалённого репозитория
git fetch <имя_удалённого_репозитория>
# Извлечь изменения из удалённой ветви
git pull <имя_удалённого_репозитория> <удалённая_ветвь>
# Внести изменения в удалённый репозиторий
git push <имя_удалённого_репозитория> <локальная_ветвь>
# Удалить удалённый репозиторий
git remote rm <имя_удалённого_репозитория>
# Отображение информации о конкретном удалённом репозитории
git remote show <имя_удалённого_репозитория>
# Показать ветви отслеживания для удалённых репозиториев
git remote show <имя удалённого репозитория> --verbose

# --------------- Расширенные -------------------

# Получить обновления из всех удалённых репозиториев
git remote update
# Принудительная отправка изменений в удалённый репозиторий с перезаписью истории удалённого репозитория
git push --force <имя_удалённого_репозитория> <локальная_ветвь>
# Передача всех тегов в удалённый репозиторий
git push --tags <имя_удалённого_репозитория>
# Переименовать удалённый репозиторий
git remote rename <старое_имя> <новое_имя>
# Изменить URL удалённого репозитория
git remote set-url <имя> <новый_url>
# Удалить устаревшие ветви удалённого отслеживания
git remote prune <имя_удалённого_репозитория>
# Перечислить все удалённые ветви, которые были объединены в текущую ветвь
git branch -r --merged
# Список всех удалённых ветвей, которые ещё не объединены в текущую ветвь
git branch -r --no-merged
# Получение обновлений из удалённого репозитория и удаление устаревших ветвей удалённого отслеживания
git fetch -p

# Отслеживание удалённой ветви и настройка локальной ветви на автоматическую синхронизацию с ней
git branch --track <имя_ветви> <имя_удалённого_репозитория>/<имя_удалённой_ветви>
# Установить существующую локальную ветвь для отслеживания удалённой ветви
git branch -u <имя_удалённого_репозитория>/<имя_удалённой_ветви>
# Переместить ветвь в удалённый репозиторий и установить её для отслеживания удалённой ветви
git push -u <имя_удалённого_репозитория> <локальная_ветвь>
# Удалить ассоциацию отслеживания между локальной и удалённой веткой
git branch --unset-upstream <имя_ветви>

История коммитов

# Показать историю коммитов
git log
# Показать сжатую историю коммитов
git log --oneline
# Показать историю коммитов с ветвлением
git log --graph
# Фильтровать историю коммитов по автору
git log --author=<имя_автора>
# Показать историю коммитов с определённой даты
git log --since=<дата>
# Показать историю коммитов до определённой даты
git log --until=<дата>

Тэги

# Список всех тегов
git tag
# Создать новый тег для определённого коммита
git tag <имя_тега> <коммит_id>
# Создать аннотированный тег с сообщением
git tag -a <имя_тега> -m "сообщение тега"
# Удалить определённый тег
git tag -d <имя_тега>
# Удалить определённый удалённый тег
git push <имя_удалённого_репозитория> --delete <имя_тега>
# Показать информацию о конкретном теге
git show <имя_тега>

Тайники/Stashes

# Временно сохраните изменения в рабочем дереве
git stash save "сообщение тайника"
# Перечислить все тайники
git stash list
# Применить изменения из определённого тайника
git stash apply <тайник>
# Удалить определённый тайник
git stash drop <тайник>
# Удалить все тайники
git stash clear

Cherry-Picking

# Применить определённый коммит из одной ветки к другой
git cherry-pick <коммит_id>

Управление коммитами

# Изменить последний коммит
git commit --amend
# Создать новый коммит, который отменяет изменения предыдущего коммита
git revert <коммит_id>
# Отбросить изменения и переместить HEAD в определённый коммит
git reset --hard <коммит_id>
# Переместите HEAD на определённый коммит, но сохраните поэтапные изменения
git reset --soft <коммит_id>
# Показать запись всех изменений, внесённых в локальную голову репозитория
git reflog

Подмодули, поддеревья и расширенные подмодули

# Добавить подмодуль в текущий репозиторий
git submodule add <репозиторий_url> <путь>
# Инициализировать и обновить все подмодули рекурсивно
git submodule update --init --recursive
# Добавить поддерево в текущий репозиторий
git subtree add --prefix=<путь> <репозиторий_url>
# Инициализировать подмодули в репозитории
git submodule init
# Обновить подмодули до последних коммитов
git submodule update
# Выполнить определённую команду в каждом подмодуле
git submodule foreach <команда>
# Снять с регистрации подмодуль
git submodule deinit <путь>

Хуки и автоматизация, а также инструменты Diff и Merge

# Найти каталог hooks в репозитории Git (обычно в .git/hooks/)
git hooks
# Имена сценариев для конкретных хуков, которые могут быть добавлены в каталог hooks
pre-commit, post-commit, pre-push, post-merge и т.д.
# Делаем скрипт хука исполняемым, чтобы обеспечить его срабатывание в случае необходимости
chmod +x <скрипт_хука>

Работа с патчами

# Создать файл патча для определённого коммита
git format-patch <коммит_id>
# Применить патч к текущей ветке
git apply <файл_патча>
# Применить патч с помощью команды "git am" (применить почтовый ящик)
git am <файл_патча>

Совместная работа

# Сгенерировать сводку request-pull с изменениями между двумя коммитами
git request-pull <начальный_коммит> <конечный_коммит> <url>
# Обобщить историю коммитов, перечислив авторов и их вклад
git shortlog
# Список всех файлов, отслеживаемых Git'ом
git ls-files
# Поиск заданного шаблона в файлах, отслеживаемых Git'ом
git grep <шаблон>

Бисекция, отладка и проблемы производительности

# Начать сеанс бисекции, чтобы найти коммит, который ввёл ошибку
git bisect start
# Пометить коммит как "плохой", указывающий на то, что он содержит ошибку
git bisect bad <коммит_id>
# Пометить коммит как "хороший", указывающий на то, что он не содержит ошибку
git bisect good <коммит_id>
# Завершить сеанс биссекции и вернуться к исходной ветке/коммиту
git bisect reset
# Проверить целостность репозитория Git
git fsck
# Запустить сборку мусора для оптимизации производительности репозитория
git gc
# Удаление неотслеживаемых файлов и каталогов (используйте с осторожностью)
git clean -df

Советы и хитрости

# Интерактивный выбор частей (кусков) файлов для добавления
git add -p

# Показать историю коммитов и связанные с ними патчи для определённого файла
git log -p <имя_файла>
# Настройка формата вывода журнала git log
git log --pretty=format:"%h - %an, %ar : %s"
# Найти текст в сообщениях о коммитах (полезно для поиска конкретных изменений)
git log --grep="<текст>"
# Быстрый просмотр изменений в рабочем каталоге с момента последнего коммита
git diff --stat
# Отображение истории ветвей с оформлением, чтобы увидеть, где ветви разделились или объединились
git log --oneline --decorate --graph

# Сохранение изменений в рабочем дереве, включая неотслеживаемые файлы
git stash save -u
# Создание пустого коммита, полезно при тестировании правил защиты ветвей
git commit --allow-empty -m " Сообщение о пустом коммите"

# Настроить пейджер вывода git на выход, если вывод меньше одного экрана, и не очищать экран после отображения
git config --global core.pager 'less -RFX'
# Использовать функцию автокоррекции Git'а для исправления неправильно введённых команд
git config --global help.autocorrect 1
# Список псевдонимов для команд Git'а
git config --get-regexp alias

# Выполнить пробный запуск слияния без реального слияния ветвей
git merge --no-commit --no-ff <имя_ветви>
# Показать древовидное представление структуры репозитория
git ls-tree --name-only -r -t HEAD

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

Введение в Git — это почти всегда пошаговая инструкция, но не всегда достаточно понятная. Именно поэтому мы дополнили гайд схемами, которые сделают информацию максимально доступной.

Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.

  1. Основы Git
  2. Коммиты
  3. Файловая система
  4. Просмотр изменений
  5. Удалённые репозитории
  6. Работа с ветками
  7. Продвинутое использование

Основы 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: от установки до основных команд 1

Коммиты

Основы работы с Git предполагают понимание коммитов. Команда git commit откроет текстовый редактор для ввода сообщения коммита. Также эта команда принимает несколько аргументов:

  • -m позволяет написать сообщение вместе с командой, не открывая редактор. Например git commit -m "Пофиксил баг";
  • -a переносит все отслеживаемые файлы в область подготовленных файлов и включает их в коммит (позволяет пропустить git add перед коммитом);
  • --amend заменяет последний коммит новым изменённым коммитом, что бывает полезно, если вы неправильно набрали сообщение последнего коммита или забыли включить в него какие-то файлы.

Советы для эффективного введения в Git:

  • Коммитьте как можно чаще.
  • Одно изменение — один коммит: не помещайте все не связанные между собой изменения в один коммит, разделите их, чтобы было проще откатиться.
  • Формат сообщений: заголовок должен быть в повелительном наклонении, меньше 50 символов в длину и должен логически дополнять фразу this commit will ___(this commit will fix bugs — этот коммит исправит баги). Сообщение должно пояснять, почему был сделан коммит, а сам коммит показывает, что изменилось.
  • Если у вас много незначительных изменений, хорошим тоном считается делать небольшие коммиты при разработке, а при добавлении в большой репозиторий объединять их в один коммит.

История коммитов в Git

Введение в Git: от установки до основных команд 2

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

Мы можем ссылаться на коммит либо через его контрольную сумму, либо через его позицию относительно HEAD, например HEAD~4 ссылается на коммит, который находится 4 коммитами ранее HEAD.

Файловая система Git

Введение в Git: от установки до основных команд 3

Git отслеживает файлы в трёх основных разделах:

  • рабочая директория (файловая система вашего компьютера);
  • область подготовленных файлов (staging area, хранит содержание следующего коммита);
  • HEAD (последний коммит в репозитории).

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

Просмотр изменений в файловых системах

Команда git status отображает все файлы, которые различаются между тремя разделами. У файлов есть 4 состояния:

  1. Неотслеживаемый (untracked) — находится в рабочей директории, но нет ни одной версии в HEAD или в области подготовленных файлов (Git не знает о файле).
  2. Изменён (modified) — в рабочей директории есть более новая версия по сравнению с хранящейся в HEAD или в области подготовленных файлов (изменения не находятся в следующем коммите).
  3. Подготовлен (staged) — в рабочей директории и области подготовленных файлов есть более новая версия по сравнению с хранящейся в HEAD (готов к коммиту).
  4. Без изменений — одна версия файла во всех разделах, т. е. в последнем коммите содержится актуальная версия.

Примечание Файл может быть одновременно в состоянии «изменён» и «подготовлен», если версия в рабочей директории новее, чем в области подготовленных файлов, которая в свою очередь новее версии в HEAD.

Мы можем использовать опцию -s для команды git status, чтобы получить более компактный вывод (по строке на файл). Если файл не отслеживается, то будет выведено ??; если он был изменён, то его имя будет красным, а если подготовлен — зелёным.

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

  • git diff — сравнение рабочей директории с областью подготовленных файлов;
  • git diff --staged — сравнение области подготовленных файлов с HEAD.

Если использовать аргумент <файл/папка>, то diff покажет изменения только для указанных файлов/папок, например git diff src/.

Обновление файловых систем

Команда git add <файл/папка> обновляет область подготовленных файлов версиями файлов/папок из рабочей директории.

Команда git commit обновляет HEAD новым коммитом, который делает снимки файлов в области подготовленных файлов.

Действие команды git reset <коммит> состоит из трёх потенциальных шагов:

  1. Переместить указатель HEAD на <коммит> (например, при откате коммита в рабочей директории и области подготовленных файлов будут более новые версии файлов, чем в HEAD). Также указатель HEAD ветки будет перемещён на этот коммит.
  2. Обновить область подготовленных файлов содержимым коммита. В таком случае только в рабочей директории будут новейшие версии файлов.
  3. Обновить рабочую директорию содержимым области подготовленных файлов. С этим нужно быть осторожнее, поскольку в итоге будут уничтожены изменения файлов.

По умолчанию команда git reset выполняет только шаги 1 и 2, однако её поведение можно изменить с помощью опций --soft (только 1 шаг) и --hard (все шаги).

Если передать путь к файлу/папке, то команда будет выполнена только для них, например git reset --soft HEAD~1 src/.

Команда git checkout HEAD <файл> приводит к тому же результату, что и git reset --hard HEAD <файл> — перезаписывает версию файла в области подготовленных файлов и в рабочей директорией версией из HEAD, то есть отменяет изменения после последнего коммита.

С другой стороны, git checkout <файл> (уже без HEAD) перезаписывает версию файла в рабочей директории версией в области подготовленных файлов, то есть отменяет изменения с момента последней подготовленной версии.

Наконец, git rm <файл> отменяет отслеживание файла и удаляет его из рабочей директории, опция --cached позволит сохранить файл.

Введение в Git: от установки до основных команд 4

Игнорирование файлов

Зачастую нам не нужно, чтобы 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.

Введение в Git: от установки до основных команд 5

Таким образом несколько людей могут запрашивать изменения с сервера, делать изменения в локальных копиях и затем отправлять их на удалённый сервер, что позволяет взаимодействовать друг с другом в пределах одного репозитория.

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: от установки до основных команд 6

Команды:

  • 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: от установки до основных команд 7

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

После открытия таких файлов вы увидите похожие маркеры разрешения конфликта:

			<<<<<<< HEAD:index.html
 Everything above the ==== is the version in master. 
 =======
 Everything below the ==== is the version in the test branch. 
 >>>>>>> test:index.html
		

Замените в этом блоке всё на версию, которую вы хотите оставить, и подготовьте файл. После разрешения всех конфликтов можно использовать git commit для завершения слияния.

Введение в Git: от установки до основных команд 8

Перемещение

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

Введение в Git: от установки до основных команд 9

Для перемещения используется команда 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. Однако учтите, что при этом вся история перемещается.

Объединение нескольких коммитов

Введение в Git: от установки до основных команд 10

Если коммиты незначительные и небольшие, это может засорить историю проекта. В связи с этим можно объединить несколько коммитов в один большой. Используйте команду pick для выбора первого коммита и squash для последующих.

Перенос отдельного коммита

Кроме слияния/перемещения всех коммитов в тематической ветке, вас может интересовать только определённый коммит. Допустим, у вас есть локальная ветка drafts, где вы работаете над несколькими потенциальными статьями, но хотите опубликовать только одну из них. Для этого можно использовать команду git cherry-pick. Чтобы получить определённые коммиты, из которых мы хотим выбирать, можно использовать git log <основная ветка>..<тематическая>.

Обратите внимание, что таким образом создаётся новый коммит, который только повторяет diff выбранного коммита (то есть разницу между этим коммитом и предыдущим), но не его состояние.

Введение в Git: от установки до основных команд 11

Закрепите введение в Git информацией о типичных ошибках в данной VCS и способах их решения.

Понравилась статья? Поделить с друзьями:
  • Gizeh машинка для самокруток видео инструкция
  • Gismotal 200 инструкция на русском
  • Gisflor инструкция по применению на русском
  • Girls dream конструктор инструкция по сборке
  • Girls creator инструкция на русском видео