Подробное руководство по хотя

В этой статье помимо архитектуры Git будут рассмотрены принципы работы таких команд, как add, checkout, reset, commit, merge, rebase, cherry-pick, pull, push и tag.

💡 Обо всем по порядку

Вы должны практиковаться параллельно с чтением поста.

Давайте сначала создадим новый проект с именем git-101, а затем инициализируем репозиторий git с помощью команды git init:

        $ mkdir git-101
$ cd git-101
    

Git CLI предоставляет два типа команд:

  • Plumbing – состоит из низкоуровневых команд, используемых Git за кулисами, когда пользователи вводят высокоуровневые команды.
  • Porcelain – которые являются высокоуровневыми командами, обычно используемыми пользователями Git.

В этом руководстве мы увидим, как команды plumbing связаны с командами porcelain, которые мы используем изо дня в день.

Внутри проекта, содержащего репозиторий Git, ознакомимся с компонентами Git:

        $ ls -F1 .git/

HEAD
config
description
hooks/
info/
objects/
refs/
    

Мы остановимся на основных:

  • .git/objects/
  • .git/refs
  • HEAD

Разберем подробно каждый компонент.

💾 База данных объектов

Используя find, инструмент UNIX, мы можем ознакомиться со структурой папки .git/objects:

        $ find .git/objects

.git/objects
.git/objects/pack
.git/objects/info

    

В Git все хранится в структуре .git/objects, которая представляет собой Git Object Database.

Что мы можем сохранить в Git? Все.

🤔 Подождите!

Как это возможно?

С помощью хэш-функций.

🔵 Спасаемся хэшированием

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

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

SHA-1 – известная реализация хэш-функции, которая в целом безопасна и почти не имеет коллизий.

Возьмем, к примеру, хэширование строки my precious:

        $ echo -e "my precious" | openssl sha1
fa628c8eeaa9527cfb5ac39f43c3760fe4bf8bed

    

Примечание. Если вы работаете в Linux, вы можете использовать команду sha1sum вместо OpenSSL.

🔵 Сравнение различий в содержании

Хорошее хэширование – это безопасная практика, когда мы не можем знать необработанное значение, т. е. реверс-инжиниринг.

В случае если мы хотим знать, изменилось ли значение, мы просто помещаем значение в хэш-функцию и вуаля – мы можем сравнить разницу:

        $ echo -e "my precious" | openssl sha1
fa628c8eeaa9527cfb5ac39f43c3760fe4bf8bed

$ echo -e "no longer my precious" | openssl sha1
2e71c9ae2ef57194955feeaa99f8543ea4cd9f9f
    

Если хэши разные, то можно считать, что значение изменилось.

Можете ли вы найти здесь возможность? Как насчет использования SHA-1 для хранения данных и просто отслеживания всего путем сравнения хэшей? Это именно то, что Git делает внутри 🤯.

🔵 Git и SHA-1

Git использует SHA-1 для генерации хэширования всего и сохраняет его в .git/objectsпапке. Просто так!

hash-object, команда plumbing:

        $ echo "my precious" | git hash-object --stdin
8b73d29acc6ae79354c2b87ab791aecccf51701f
    

Сравним с OpenSSL версией:

        $ echo -e "my precious" | openssl sha1
fa628c8eeaa9527cfb5ac39f43c3760fe4bf8bed
    

Упс … это совсем другое. Это потому, что Git добавляет определенное слово, за которым следует размер содержимого и разделитель . Это слово Git называет типом объекта.

Да, у объектов Git есть типы. Первый объект, который мы рассмотрим, – это объект blob.

🔵 blob-объект

Когда мы отправляем, например, строку my precious в команду hash-object, Git добавляет паттерн {object_type} {content_size} к функции SHA-1, так что:

        blob 12myprecious

    

Затем:

        $ echo -e "blob 12my precious" | openssl sha1
8b73d29acc6ae79354c2b87ab791aecccf51701f

$ echo "my precious" | git hash-object --stdin
8b73d29acc6ae79354c2b87ab791aecccf51701f
    

Ура! 🎉

🔵 Хранение blob в базе данных

Но сама команда hash-object не сохраняется в папке .git/objects. Мы должны добавить -w и объект будет сохранен:

        $ echo "my precious" | git hash-object --stdin -w
8b73d29acc6ae79354c2b87ab791aecccf51701f

$ find .git/objects
...
.git/objects/8b
.git/objects/8b/73d29acc6ae79354c2b87ab791aecccf51701f

### Or, simply
$ find .git/objects -type f
.git/objects/8b/73d29acc6ae79354c2b87ab791aecccf51701f
    

📁⚙️ Полное руководство по основам Git

Данное изображение и все последующие взяты отсюда.

🔵 Чтение необработанного содержимого блоба

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

🤔 Хорошо, но подождите.

Как Git узнает исходное значение?

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

cat-file, команда plumbing, при наличии ключа распаковывает сжатые данные, таким образом, получая исходное содержимое:

        $ git cat-file -p 8b73d29acc6ae79354c2b87ab791aecccf51701f
my precious
    

Таким образом, Git – это база данных с ключом и значением!

📁⚙️ Полное руководство по основам Git

🔵 Как поделиться blob

Используя Git, мы хотим работать над содержимым и делиться им с другими людьми

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

Другими словами, нам нужно сгруппировать, продвигать и добавлять метаданные в наши блобы. Этот процесс работает следующим образом:

  1. Добавьте большой двоичный объект в промежуточную область
  2. Сгруппируйте все blob-объекты в рабочей области в древовидную структуру
  3. Добавьте метаданные в древовидную структуру (имя автора, дата, смысловое сообщение)

Давайте рассмотрим описанные выше шаги подробнее.

🔵 Stage area и index

update-index, команда plumbing, позволяет добавить blob в stage area и дать ему имя:

        $ git update-index 
    --add 
    --cacheinfo 100644 
    8b73d29acc6ae79354c2b87ab791aecccf51701f 
    index.txt
    
  • --add: добавляет blob в stage, также называемый индексом.
  • --cacheinfo: используется для регистрации файла, которого еще нет в рабочем каталоге
  • хэш blob
  • index.txt: имя большого двоичного объекта в индексе.

📁⚙️ Полное руководство по основам Git

Где Git хранит индекс?

        $ cat .git/index

DIRCsҚjT¸zQp    index.txtÆ
                          7CJVVÙ
    

Недоступен для чтения человеком и сжат с использованием Zlib.

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

        $ git update-index {sha-1} f1.txt
$ git update-index {sha-1} f2.txt

    

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

🔵 Объект дерева

Команда write-tree (plumbing) позволяет Git группировать все blob, которые были добавлены в индекс, и создает в папке еще один объект: .git/objects

        $ git write-tree
3725c9e313e5ae764b2451a8f3b1415bf67cf471
    

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

        $ find .git/objects

### The new object
.git/objects/37
.git/objects/37/25c9e313e5ae764b2451a8f3b1415bf67cf471

### The blob previously created
.git/objects/8b
.git/objects/8b/73d29acc6ae79354c2b87ab791aecccf51701f
    

Давайте извлечем исходное значение с помощью cat-file для лучшего понимания:

        ### Using the option -t, we get the object type
$ git cat-file -t 3725c9e313e5ae764b2451a8f3b1415bf67cf471
tree

$ git cat-file -p 3725c9e313e5ae764b2451a8f3b1415bf67cf471
100644 blob 8b73d29acc6ae79354c2b87ab791aecccf51701f index.txt
    

Это интересный вывод, он сильно отличается от BLOB-объекта, который вернул исходное содержимое.

В дереве объектов Git возвращает все объекты, которые были добавлены в индекс.

        100644 blob 8b73d29acc6ae79354c2b87ab791aecccf51701f index.txt

    
  • 100644: кэш-информация
  • blob: тип объекта
  • хэш blob
  • имя blob

📁⚙️ Полное руководство по основам Git

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

🔵 Объект коммита

commit-tree, команда plumbing, получает дерево, сообщение коммита и создает еще один объект в папке .git/objects:

        $ git commit-tree 3725c -m 'my precious commit'
505555f4f07d90ae14a0f2e67cba7f7b9af539ee
    

Что это за объект?

        $ find .git/objects
...
.git/objects/50
.git/objects/50/5555f4f07d90ae14a0f2e67cba7f7b9af539ee

### cat-file
$ git cat-file -t 505555f4f07d90ae14a0f2e67cba7f7b9af539ee
commit
    

А как насчет его стоимости?

        $ git cat-file -p 505555f4f07d90ae14a0f2e67cba7f7b9af539ee

tree 3725c9e313e5ae764b2451a8f3b1415bf67cf471
author leandronsp <leandronsp@example.com> 1678768514 -0300
committer leandronsp <leandronsp@example.com> 1678768514 -0300

my precious commit

    
  • tree 3725c: объект дерева ссылок
  • автор/коммиттер
  • сообщение коммита my precious commit

📁⚙️ Полное руководство по основам Git

🤯 ОМГ! Я вижу здесь закономерность?

Кроме того, коммиты могут ссылаться на другие коммиты:

        $ git commit-tree 3725c -p 50555 -m 'second commit'
5ea578a41333bae71527db537072534a199a0b67
    

-p позволяет ссылаться на родительский коммит:

        $ git cat-file -p 5ea578a41333bae71527db537072534a199a0b67

tree 3725c9e313e5ae764b2451a8f3b1415bf67cf471
parent 505555f4f07d90ae14a0f2e67cba7f7b9af539ee
author leandronsp <leandronsp@gmail.com> 1678768968 -0300
committer leandronsp <leandronsp@gmail.com> 1678768968 -0300

second commit
    

Мы видим, что, благодаря коммиту с родителем, мы можем рекурсивно пройти все коммиты по всем их деревьям, пока не доберемся до финальных blob-объектов .

Возможное решение:

        $ git cat-file -p <first-commit-sha1>
$ git cat-file -p <first-commit-tree-sha1>
$ git cat-file -p <first-commit-parent-sha1>
$ git cat-file -p <parent-commit-sha1>
...
    

И так далее. Ну вы попали в точку.

🔵 Логирование для восстановления

git log, команда porcelain, решает эту проблему, просматривая все коммиты, их родителей и деревья, давая нам представление о временной хронологии нашей работы.

        $ git log 5ea57

commit 5ea578a41333bae71527db537072534a199a0b67
Author: leandronsp <leandronsp@gmail.com>
Date:   Mon Mar 13 22:42:48 2023 -0300

    second commit

commit 505555f4f07d90ae14a0f2e67cba7f7b9af539ee
Author: leandronsp <leandronsp@gmail.com>
Date:   Mon Mar 13 22:35:14 2023 -0300

    my precious commit
    

🤯 ОМГ!

Git – это гигантская, но легкая база данных графа ключ-значение!

🔵 Граф Git

В Git мы можем манипулировать указателями на граф.

📁⚙️ Полное руководство по основам Git

  • Blob – это моментальные снимки данных/файлов.
  • Деревья представляют собой набор блобов или другое дерево.
  • Коммиты ссылаются на деревья и/или другие коммиты, добавляя метаданные

Это очень мило и все такое, но использование sha1 в команде git log может быть громоздким.

Как насчет присвоения имен хэшам? Используйте ссылки.

Ссылки на Git

Ссылки находятся в папке .git/refs:

        $ find .git/refs

.git/refs/
.git/refs/heads
.git/refs/tags
    

🔵 Дадим имена коммитам

Мы можем связать любой хэш коммита с произвольным именем, расположенным в .git/refs/heads, например:

        echo 5ea578a41333bae71527db537072534a199a0b67 > .git/refs/heads/test

    

Теперь давайте выполним git log, используя новую ссылку:

        $ git log test

commit 5ea578a41333bae71527db537072534a199a0b67
Author: leandronsp <leandronsp@gmail.com>
Date:   Mon Mar 13 22:42:48 2023 -0300

    second commit

commit 505555f4f07d90ae14a0f2e67cba7f7b9af539ee
Author: leandronsp <leandronsp@gmail.com>
Date:   Mon Mar 13 22:35:14 2023 -0300

    my precious commit
    

Что еще лучше, Git предоставляет update-ref, команду plumbing, и мы можем использовать ее для обновления связи коммита со ссылкой:

        $ git update-ref refs/heads/test 5ea578a41333bae71527db537072534a199a0b67

    

Звучит знакомо, да? Да, речь идет о ветках.

🔵 Ветки

Ветки – это ссылки, указывающие на конкретный коммит.

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

📁⚙️ Полное руководство по основам Git

На мгновение давайте подумаем о том, как git log работает без аргументов:

        $ git log

fatal: your current branch 'main' does not have any commits yet
    

🤔 Хм…

Как Git узнает, что моя текущая ветка является «основной»?

🔵 HEAD

Ссылка на HEAD находится в .git/HEAD. Это один файл, который указывает на главную ссылку (ветвь):

        $ cat .git/HEAD

ref: refs/heads/main
    

Точно так же, используя команду porcelain:

        $ git branch
* main
    

Используя symbolic-ref, команду plumbing, мы можем управлять тем, на какую ветку указывает HEAD:

        $ git symbolic-ref HEAD refs/heads/test

### Check the current branch
$ git branch
* test
    

Как и update-ref в ветках, мы можем обновить HEAD, используя symbolic-ref в любое время.

📁⚙️ Полное руководство по основам Git

На картинке ниже мы изменим HEAD с ветки main на ветку fix:

📁⚙️ Полное руководство по основам Git

Без аргументов команда git log обходит корневой коммит, на который ссылается текущая ветвь (HEAD):

        $ git log

commit 5ea578a41333bae71527db537072534a199a0b67 (HEAD -> test)
Author: leandronsp <leandronsp@gmail.com>
Date:   Tue Mar 14 01:42:48 2023 -0300

    second commit

commit 505555f4f07d90ae14a0f2e67cba7f7b9af539ee
Author: leandronsp <leandronsp@gmail.com>
Date:   Tue Mar 14 01:35:14 2023 -0300

    my precious commit
    

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

Пришло время связать все эти знания с porcelain командами, которые мы используем ежедневно.

🍽️ Porcelain команды

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

Эти команды называются porcelain командами.

🔵 git add

Команда git add принимает файлы в рабочем каталоге в качестве аргументов, сохраняет их как blob-объекты в базе данных и добавляет их в индекс.

📁⚙️ Полное руководство по основам Git

Короче говоря, git add:

  1. запускает hash-object для каждого аргумента файла
  2. запускает update-index для каждого аргумента файла

🔵 git commit

git commit принимает в качестве аргумента сообщение, группирует все ранее добавленные в индекс файлы и создает объект коммита.

Сначала выполняется write-tree:

📁⚙️ Полное руководство по основам Git

Затем выполняется commit-tree:

📁⚙️ Полное руководство по основам Git

        $ git commit -m 'another commit'

[test b77b454] another commit
 1 file changed, 1 deletion(-)
 delete mode 100644 index.txt

    

🕸️ Управление указателями в Git

Широко используются следующие команды porcelain, которые манипулируют ссылками Git под капотом.

Предполагая, что мы только что клонировали проект, в котором HEAD указывает на main ветку, которая указывает на коммит C1:

📁⚙️ Полное руководство по основам Git

Как мы можем создать еще одну новую ветку из текущей HEAD и переместить HEAD в эту новую ветку?

🔵 git checkout

Используя git checkout с параметром -b, Git создаст новую ветку из текущей (HEAD) и переместит HEAD в эту новую ветку.

        ### HEAD
$ git branch
* main

### Creates a new branch "fix" using the same reference SHA-1
#### of the current HEAD
$ git checkout -b fix
Switched to a new branch 'fix'

### HEAD
$ git branch
* fix
main
    

Какая plumbing-команда отвечает за перемещение HEAD? Точно, symbolic-ref.

📁⚙️ Полное руководство по основам Git

После этого мы делаем новую работу в ветке fix, а затем выполняем git commit, который добавит новый коммит под названием C3:

📁⚙️ Полное руководство по основам Git

Запустив git checkout, мы можем продолжать переключать HEAD между разными ветвями:

📁⚙️ Полное руководство по основам Git

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

Мы уже знаем, что это делает команда plumbing update-ref:

        $ git update-ref refs/heads/fix 356c2

    

🔵 git reset

Команда git reset (porcelain) запускает update-ref внутри, поэтому нам просто нужно выполнить:

        $ git reset 356c2

    

Но как Git узнает, какую ветку нужно переместить? Что ж, git reset перемещает ветку, на которую указывает HEAD.

📁⚙️ Полное руководство по основам Git

Что делать, если есть различия между ревизиями? Используя reset, Git перемещает указатель, но оставляет все различия в рабочей области (индексе).

        $ git reset b77b

    

Проверка с помощью git status:

        $ git status

On branch fix
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        another.html
        bye.html
        hello.html

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

Коммит ревизии был изменен в ветке fix и все отличия перенесены в index .

Тем не менее, что нам делать, если мы хотим сбросить и отбросить все различия? Просто использовать параметр --hard:

📁⚙️ Полное руководство по основам Git

При использовании git reset --hard любые различия между ревизиями будут отброшены, и они не будут отображаться в индексе .

💡 Золотой совет о перемещении ветки

Если мы хотим выполнить подключение update-ref к другой ветке, нет необходимости проверять ветку, как это необходимо в git reset.

Вместо этого мы можем выполнить porcelain-команду git branch -f source target:

        $ git branch -f main b77b

    

Под капотом он выполняет git reset --hard в исходной ветке. Давайте проверим, на какой коммит указывает основная ветка:

        $ git log main --pretty=oneline -n1
b77b454a9a507f839880879a895ac4f241177a28 (main) another commit
    

Также мы подтверждаем, что ветка fix по-прежнему указывает на коммит 369cd:

        $ git log fix --pretty=oneline -n1
369cd96b1f1ef6fa7de1ff2ed12e15be979dcffa (HEAD -> fix, test) add files

    

Мы сделали git reset без перемещения HEAD!

📁⚙️ Полное руководство по основам Git

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

🔵 git cherry-pick

С помощью porcelain-команды git cherry-pick мы можем применить произвольную фиксацию к текущей ветке.

Возьмем следующий сценарий:

📁⚙️ Полное руководство по основам Git

  • main-пункты к C3 – C2 – C1
  • fix для точек на C5 – C4 – C2 – C1
  • HEAD указывает на fix

В ветке исправления отсутствует фиксация C3, на которую ссылается основная ветка.

Для этого запустим git cherry-pick C3:

📁⚙️ Полное руководство по основам Git

Обратите внимание, что:

  • коммит C3 будет клонирован в новый коммит с именем C3
  • этот новый коммит будет ссылаться на коммит C5
  • fix переместит указатель на C3′
  • HEAD продолжает указывать на исправление

После применения изменений график будет представлен следующим образом:

📁⚙️ Полное руководство по основам Git

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

Вы не ошиблись, здесь мы говорим о git merge.

🔵 git merge

Опишем следующий сценарий:

📁⚙️ Полное руководство по основам Git

  • Main-пункты к C3 – C2 – C1
  • Fix точек на C4 – C3 – C2 – C1
  • HEAD указывает на main

Мы хотим применить исправленную ветку к текущей (основной) ветке, т. е. выполнить git merge fix.

Обратите внимание, что ветка fix содержит все коммиты, принадлежащие основной ветке (C3 – C2 – C1), имея только один коммит перед основным (C4).

В этом случае основная ветвь будет «переадресована», указывая на тот же коммит, что и ветка исправления.

Такое слияние называется fast-forward, как показано на изображении ниже:

📁⚙️ Полное руководство по основам Git

Когда fast-forward невозможен

Иногда текущее состояние нашей древовидной структуры не позволяет выполнять ускоренную перемотку вперед. Рассмотрим сценарий ниже:

📁⚙️ Полное руководство по основам Git

Когда в ветке слияния – ветке исправления в приведенном выше примере – отсутствует одна или несколько коммитов из текущей ветки (основной): коммит C3.

Таким образом, fast-forward невозможен.

Однако, чтобы слияние прошло успешно, Git выполняет технику, называемую Snapshotting, состоящую из следующих шагов.

Во-первых, Git ищет следующего общего родителя двух ветвей, в этом примере коммит C2.

📁⚙️ Полное руководство по основам Git

Во-вторых, Git делает снимок целевой ветки фиксации C3:

📁⚙️ Полное руководство по основам Git

В-третьих, Git делает снимок исходной ветки фиксации C5:

📁⚙️ Полное руководство по основам Git

Наконец, Git автоматически создает слияние фиксации (C6) и указывает на двух родителей соответственно: C3 (цель) и C5 (источник):

📁⚙️ Полное руководство по основам Git

Вы когда-нибудь задумывались, почему в дереве Git отображаются некоторые коммиты, созданные автоматически?

Не заблуждайтесь, этот процесс слияния называется трехсторонним слиянием!

📁⚙️ Полное руководство по основам Git

Далее давайте изучим другой метод слияния, при котором fast-forward невозможен, но вместо моментального снимка и автоматического слияния коммита Git применяет различия поверх исходной ветки.

Да, это git rebase.

🔵 git rebase

Рассмотрим следующее изображение:

📁⚙️ Полное руководство по основам Git

  • Main-пункты к C3 – C2 – C1
  • fix точек на C5 – C4 – C2 – C1
  • HEAD указывает на fix

Мы хотим перебазировать основную ветку в ветку исправления, посредством git rebase main. Но как работает git rebase?

👉git reset

Сначала Git выполняет git reset main, при этом ветка fix будет указывать на тот же указатель основной ветки: C3 – C2 – C1.

📁⚙️ Полное руководство по основам Git

На данный момент у коммитов C5-C4 нет ссылок.

👉git cherry-pick

Во-вторых, Git выполняет git cherry-pick C5 в текущую ветку:

📁⚙️ Полное руководство по основам Git

Обратите внимание, что выбранные коммиты клонируются, поэтому окончательный хэш изменится: C5 – C4 станет C5′ – C4′.

После у нас может быть следующий сценарий:

📁⚙️ Полное руководство по основам Git

👉git reset еще раз

Наконец, Git выполнит git reset C5', поэтому указатель ветки fix переместится с C3 на C5'.

Процесс rebase завершен.

📁⚙️ Полное руководство по основам Git

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

🌐 Удаленные ветки

Чтобы работать с удаленными ветками, нам нужно добавить удаленную ветку в наш локальный репозиторий с помощью команды porcelain – git remote.

        $ git remote add origin git@github.com/myaccount/myrepo.git

    

Удаленные репозитории находятся в папке .git/refs/remotes:

        $ find .git/refs
...
.git/refs/remotes/origin
.git/refs/remotes/origin/main
    

🔵 Скачать с удаленного репозитория

Как нам синхронизировать удаленную ветку с нашей локальной веткой?

Git предлагает два шага:

👉git fetch

С помощью git fetch origin main Git загрузит удаленную ветку и синхронизирует ее с новой локальной веткой с именем origin/main, также известной как upstream branch (восходящая ветка).

📁⚙️ Полное руководство по основам Git

👉git merge

После извлечения и синхронизации вышестоящей ветки мы можем выполнить git merge origin/main и, поскольку восходящая ветка опережает нашу локальную ветку, Git безопасно применит ускоренное слияние.

📁⚙️ Полное руководство по основам Git

Однако комбинация fetch + merge может повториться, так как мы будем синхронизировать локальные/удаленные ветки несколько раз в день.

Но сегодня наш счастливый день, и Git предоставляет команду git pullchina, которая выполняет fetch + merge от нашего имени.

👉git pull

git pull выполнит выборку (синхронизирует удаленную ветвь с вышестоящей ветвью), а затем объединит восходящую ветвь с локальной ветвью.

📁⚙️ Полное руководство по основам Git

Итак, мы увидели, как получать/загружать изменения с репозитория. С другой стороны, как насчет отправки локальных изменений на удаленные?

🔵 Загрузить на удаленный репозиторий

Git предоставляет porcelain команду под названием git push:

👉git push

Выполнение git push origin main приведет к загрузке изменения на удаленный репозиторий:

📁⚙️ Полное руководство по основам Git

Затем Git объединит восходящую ветвь origin/main с локальной main-веткой:

📁⚙️ Полное руководство по основам Git

В конце мы получим следующее изображение:

📁⚙️ Полное руководство по основам Git

Где:

  • Удаленный репозиторий обновлен (локальные изменения отправлены)
  • main к C4
  • origin/main к C4
  • HEAD указывает на main

🔵 Предоставление неизменяемых имен коммитам

Мы знаем, что ветки – это просто изменяемые ссылки на коммиты, поэтому мы можем переместить указатель ветки.

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

Неизменяемые ссылки полезны, например, когда мы хотим пометить/отметить коммиты, которые готовы для какого-то производственного выпуска.

Да, мы говорим о тегах.

👉git tag

Используя команду (porcelain) git tag, мы можем давать имена коммитам, но мы не можем выполнить сброс или любую другую команду, которая изменила бы указатель.

📁⚙️ Полное руководство по основам Git

Это очень полезно для управления версиями. Теги находятся в папке .git/refs/tags:

        $ find .git/refs

...
.git/refs/tags
.git/refs/tags/v1.0
    

Если мы хотим изменить указатель тега, мы должны удалить его и создать еще один с тем же именем.

💡 Git reflog

И последнее, но не менее важное – вызываемая команда git reflog, которая сохраняет все изменения, которые мы сделали, в нашем локальном репозитории.

        $ git reflog

369cd96 (HEAD -> fix, test) HEAD@{0}: reset: moving to main
b77b454 (main) HEAD@{1}: reset: moving to b77b
369cd96 (HEAD -> fix, test) HEAD@{2}: checkout: moving from main to fix
369cd96 (HEAD -> fix, test) HEAD@{3}: checkout: moving from fix to main
369cd96 (HEAD -> fix, test) HEAD@{4}: checkout: moving from main to fix
369cd96 (HEAD -> fix, test) HEAD@{5}: checkout: moving from fix to main
369cd96 (HEAD -> fix, test) HEAD@{6}: checkout: moving from main to fix
369cd96 (HEAD -> fix, test) HEAD@{7}: checkout: moving from test to main
369cd96 (HEAD -> fix, test) HEAD@{8}: checkout: moving from main to test
369cd96 (HEAD -> fix, test) HEAD@{9}: checkout: moving from test to main
369cd96 (HEAD -> fix, test) HEAD@{10}: commit: add files
b77b454 (main) HEAD@{11}: commit: another commit
5ea578a HEAD@{12}:
    

Это очень полезно, если мы хотим перемещаться вперед и назад по временной шкале Git. Наряду с reset, cherry-pick и подобными, это мощный инструмент, если мы хотим освоить Git.

Подведение итогов

Какое долгое путешествие!

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

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

***

Материалы по теме

  • Git за полчаса: руководство для начинающих
  • 📁 Настраиваем Git для правильной работы с опенсорс-проектами
  • Основы Git: контроль версий для самых маленьких
  • 💽 Git для Data Science: контроль версий моделей и датасетов с помощью DVC
  • 👍 Как правильно писать сообщения коммитов в GIT, чтобы всем было хорошо

Содержание

  • 1 Что такое командная строка
  • 2 В каких ситуациях командная строка может оказаться полезной
  • 3 Как пользоваться командной строкой
    • 3.1 Как вызвать командную строку
  • 4 Работа в командной строке
  • 5 Видео по теме

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

Эта статья содержит общую ознакомительную информацию для разных версий Windows. После прочтения вы можете пополнить свои знания по конкретной разновидности ОС: 7-ка, 8 версия или узнать о множестве улучшений программы в 10 версии Windows.

Конечно, до сих пор существуют такие ОС, которые используют для общения с пользователями, так называемый, интерфейс командной строки. Но ими обычно пользуются профессиональные программисты, системные администраторы и прочие работники IT-индустрии. Для обычных пользователей производители операционных систем создали удобный графический интерфейс, который позволяет «общаться» с компьютером или, допустим, смартфоном при помощи мышки или нажатий по кнопкам на экране.

Несмотря на это, каждая операционная система (включая Windows XP, 7, 8 и так далее) всё же, как и раньше, поддерживает ввод и вывод информации посредством текстовых команд. Командная строка Windows — явный тому пример. Разберёмся, что это такое.

Что такое командная строка

В первую очередь — это программа cmd.exe, находящаяся в директории system32 папки операционной системы. Вариант ее месторасположения: C:Windowssystem32cmd.exe. Путь может и отличаться, в зависимости от версии Windows и места ее установки.

В общих чертах, командная строка — это инструмент операционной системы, состоящий, как правило, из оболочки ОС и текстового интерфейса. Оболочка обеспечивает пользователя инструментарием для «общения» с операционной системой, которыми, в данном случае, выступают текстовые команды.

Окно командной строки

Командная строка операционных систем Windows, начиная с XP, призвана обеспечить пользователей возможностью применения MS-DOS и множества других компьютерных команд. Важная её особенность заключается в том, что она способна выполнять пользовательские команды без помощи графического интерфейса. Необходимость в понимании и знании всех этих команд делает затруднительным использование командной строки для управления операционной системой рядовыми пользователями. Однако, это не так уж и сложно, как кажется на первый взгляд.

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

В каких ситуациях командная строка может оказаться полезной

Существует ряд причин использования командной строки. Бывают и такие ситуации, в которых без её использования просто невозможно обойтись. А в некоторых случаях выполнение определённых функций Windows, а также настройка операционной системы через командную строку происходит удобней и быстрей.

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

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

Ещё одна ситуация. Допустим, Windows XP (или любая другая версия) просто перестала работать, а на жёстком диске остались важные данные, которые срочно необходимо скопировать на флешку. Если под рукой имеется хотя бы установочный диск с Windows, то на определённом моменте установки операционной системы (без ожидания окончания установки) можно вызвать командную строку и скопировать эти данные. Эта возможность часто приходится весьма кстати в случае с повреждённым диском, когда к примеру, установка Windows прекращается во время копирования установочных файлов на жёсткий диск.

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

Как пользоваться командной строкой

На различных компьютерных форумах и сайтах можно найти сотни руководств по использованию тех или программ, выполнению каких-то системных настроек и массу других статей, в которых авторы призывают к использованию командной строки. Многие неопытные пользователи сразу теряются, видя фразу «Запустите командную строку…». Если вы также входите в их число, вам будет очень полезно ознакомиться с работой этого полезного инструмента. Начнём с того, как её вызвать.

Как вызвать командную строку

Начиная с Windows XP и до последней версии этого семейства операционных систем, командная строка вызывается посредством диалога «Выполнить» («Run»), в который необходимо ввести команду — «cmd». Запуск этого диалога осуществляется с помощью одновременного нажатия клавиш Win + R:

Выполнить cmd

В Windows XP (в отличие от последующих версий) в меню «Пуск» имеется специальный ярлык, который так и называется «Выполнить…». Если нажать на него, то диалог также запустится.

Запуск через поиск

Вызвать командную строку можно и другими способами. Вот они:

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

В версии Windows 8 есть другие способы запуска cmd. Также как и в 10-ке, про особенности которой можно узнать здесь подробнее.

Работа в командной строке

Чтобы «cmd» выполнил ту или иную команду, достаточно ввести её в окно, после чего нажать клавишу Enter. Для проверки можете ввести «help» — эта команда отобразит список всех имеющихся стандартных команд.

Команда help

Как вы могли заметить, их множество. Однако, это далеко не все команды, которые могут быть выполнены при помощи командной строки. Существует множество различных программ, которые также могут управляться через эту консоль. В принципе, «cmd» является расширяемой оболочкой, что говорит о возможности внесения в список выполняемых ею действий всё новых и новых команд.

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

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

После запуска командной строки, вы могли заметить перед мигающим курсором адрес: «C:/Users/Имя пользователя» (в нашем случае — тут «Reptile»). Имя последней папки означает ваше текущее местоположение (то же самое, как если бы вы зашли в эту папку через Проводник). А «С:» — это локальный диск, на котором вы находитесь. Чтобы сменить текущий локальный диск, достаточно ввести его букву и двоеточие сразу после неё — например, «D:».

Смена диска

Так вы попадёте на диск «D:» (или любой другой). Чтобы просмотреть содержимое диска (или вообще любой папки) используется команда «dir». Введите её прямо здесь, и вы увидите список файлов и папок, имеющихся на диске «D:».

Команда dir

Теперь создадим папку прямо в корне диска. Для этого используем команду — «mkdir», а в качестве параметра через пробел нужно вписать имя будущей папки, например, «mkdir xp». В данном случае создастся папка с именем «xp».

Команда mkdir

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

Для перехода в ту или иную папку используйте команду «cd». Здесь в качестве аргумента также используется имя каталога для перехода. Введём «cd xp» и попадём внутрь папки (сделаем эту папку текущей).

Команда cd

Создадим в папке ещё одну, используя команду «mkdir». Пусть это будет папка «123».

Создаем папку

Теперь удалим её. Для этого вводим «rmdir 123». Выполните теперь в каталоге «xp» команду «dir» и вы увидите, что папки «123» больше нет.

Результат удаления папки с помощью rmdir

Если вы захотите подробнее ознакомиться с описанием той или иной команды, просто введите ключ «/?» сразу после команды, и на экран будет выведена подсказка. Например, введите «dir /?». Другой вариант запуска подсказки: «help dir».

Вызов помощи по команде dir

Запомнить все существующие команды не просто — их огромное множество. На официальном сайте Microsoft имеется наиболее полное руководство по командной строке, хотя и описаний, выдаваемых командой help вполне достаточно.

Видео по теме

В Hearts of Iron IV нелегко завоевать несколько наций, не говоря уже о целом мире, но цель этого руководства — сделать все возможное, чтобы направить вас по пути, затрагивая темы, о которых редко говорят.

При этом это руководство предназначено для последнего DLC By Blood Alone. Так что, пожалуйста, отнеситесь к этому руководству со щепоткой соли от заядлого игрока Hearts of Iron IV.

Политическая власть и система

Обзор вашей нации и политической вкладки

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

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

Как выглядит национальный фокус экономики Германии

Когда вы начинаете игру, вы начинаете без PP, и это нормально. Что важно в начале игры, так это то, что вы выбираете национальную направленность и начинаете консолидировать свой PP. Когда у вас будет достаточно PP, вы можете выбрать советника. Рекомендуемым советником будет тот, кто обеспечивает дополнительный PP или стабильность, поскольку накопление PP позволяет вам принимать больше решений.

У вас может быть только три политических советника, так что выбирайте тщательно.

Некоторые политические советники — если стоит большой крестик, значит, они недоступны (пока)

Основная информация

(Слева направо) — политическая власть, стабильность, военная поддержка, рабочая сила, фабрики, количество топлива, снабжение, конвои.

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

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

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

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

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

Некоторые решения могут повысить вашу стабильность

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

Опыт и ЗП

Экран офицерского корпуса без авиации

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

Опыт армии , флота и ВВС можно найти прямо рядом с CP. Их можно получить, назначив начальника в различные ветви, тренируя свои силы или участвуя в конфликтах. Полученный здесь опыт можно использовать для различных функций, кроме обычных для настройки духа офицерского корпуса и открытия новых доктрин.

Армейский опыт позволяет вам редактировать шаблоны ваших дивизий и создавать варианты для ваших танков.

Navy XP позволяет вам редактировать шаблоны кораблей, добавлять новые детали или использовать их в качестве сокращения в ваших военно-морских исследованиях.

Air Force XP можно потратить на дизайн вашего самолета, что позволяет вносить модификации.

Боевые планы группы армий и/или армии

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

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

Исследовать

Обзор текущих исследовательских проектов

В настоящее время существует 8 категорий исследований (слева направо): пехота, роты поддержки, бронетехника, артиллерия, флот, морская поддержка, авиация, инженерия и промышленность. 

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

Вспомогательные компании содержат вспомогательные компании и проекты поездов.

 Броня содержит танковые конструкции и оборудование.

Артиллерия включает артиллерийские, реактивные, противовоздушные и противотанковые средства.

Naval содержит корпуса кораблей, а также некоторое оборудование.

Морская поддержка содержит вооружение, торпеды, средства защиты от повреждений, транспорты и мины.

Air содержит самолеты, их авианосцы и реактивные истребители.

Инженерия содержит радио, радар, ракеты, атомную энергию и ядерные бомбы.

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

     

    Пример разумного времени исследования

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

Поставлять

Пример хорошей системы снабжения

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

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

   

                            Судя по значку лошади, эта армия использует кавалерию для перевозки

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

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

Шаблоны отделов

Рекомендуемый шаблон подразделения: добавляйте компании поддержки по своему усмотрению

Максимальное количество частей, которые можно добавить в свои дивизии, составляет 25 полков и 5 рот поддержки. К сожалению, пока нет возможности настроить это.

Список статистики можно найти справа от шаблона дивизиона. Поскольку это довольно большой выбор, мы рассмотрим некоторые ключевые характеристики:

Организация — насколько организована дивизия, чем выше организованность, тем дольше она может продержаться в бою.

Скорость восстановления — насколько быстро ваше подразделение восстанавливает свою организацию, позволяя ему организовывать дальнейшие атаки или сопротивление.

Мягкая атака — насколько эффективна дивизия против пехоты, хотя иногда под это влияние могут попадать и грузовики.

Тяжелая атака — насколько эффективна дивизия при столкновении с бронетехникой.

Боевая ширина — сколько места потребуется, чтобы вывести его на поле боя.

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

        

          По мере продвижения по дереву исследований вы сможете разблокировать больше типов юнитов.
 

Как только вы получите XP, вы можете начать возиться с шаблонами дивизий. Добавление роты поддержки стоит 10 XP, а добавление батальона — 5 XP. На данный момент лучше иметь единый шаблон для всей вашей армии, но как только вы освоите его, не стесняйтесь вносить изменения и экспериментировать.

Генералы и способности

Пример черт генерала

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

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


Основные три способности

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

 

Пример доступных офицеров для высшего командования

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

Строительство

По конструкции выделяют три категории:

Государственные структуры:

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

Авиабазы ​​позволяют размещать там самолеты. На каждом уровне можно разместить 200 самолетов.

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

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

Общие структуры:

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

Гражданские фабрики позволяют строить новые здания, импортировать ресурсы или ремонтировать поврежденные объекты.

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

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

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

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

Провинциальные постройки:

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

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

Прибрежные форты работают почти так же, как наземные форты, за исключением того, что на этот раз они служат оплотом против морских вторжений.

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

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

Точно так же вы можете строить точки снабжения, чтобы поддерживать свою армию в порядке.

Дипломатия

Вкладка дипломатии позволит вам увидеть список стран, а также действия, которые можно предпринять против них или по отношению к ним. Дипломатические действия, как правило, не требуют какой-либо политической власти, но есть некоторые, такие как гарантия независимости, улучшение отношений и отправка атташе (что требует первоначальной стоимости CP, а также снижения вашего максимального CP, пока атташе все еще активен) . 

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

 

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

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

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

Решения

Пример решения для Германии

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

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

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

Поскольку вы можете снизить популярность оппозиции с помощью решений, рекомендуется пойти по этому пути с решением «институт цензуры прессы», поскольку более высокая популярность правящей партии приведет к большей стабильности и большему ежедневному приросту PP.

Торговля

Обзор вкладки торговли для Германии

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

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

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

 

Взгляд на то, что потребуется для импорта ресурсов из другой страны

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

Спецслужба

Обзор разведывательного управления Германии

Вкладка «Разведывательное агентство» позволяет вам построить разведывательное агентство для вашей страны или, если оно уже существует, применять улучшения, нанимать агентов и запускать миссии. Для всех улучшений агентства требуются гражданские заводы, и на их завершение уйдет 30 дней. Точно так же агентам нужен период ожидания, прежде чем их можно будет завербовать.

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

Производство

Обзор вкладки недоиспользованной и недопоставленной продукции

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

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

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

Полная производственная линия, как видно на зеленой полосе выше, уже достигла предела своего производства.

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

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

Наймите и разверните

Вкладка «Набор и развертывание» (обратите внимание, что дивизия не может быть развернута из-за отсутствия местоположения)

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

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

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

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

Укажите регион, чтобы мы точнее рассчитали условия доставки

Начните вводить название города, страны, индекс, а мы подскажем

Например: 
Москва,
Санкт-Петербург,
Новосибирск,
Екатеринбург,
Нижний Новгород,
Краснодар,
Челябинск,
Кемерово,
Тюмень,
Красноярск,
Казань,
Пермь,
Ростов-на-Дону,
Самара,
Омск

И немного о том, как играть не надо.

Один из фонов игры. Если кому интересно.

Небольшой Дисклеймер

Привет DTF, это мой первый лонгрид (если его можно назвать таковым) и хочу сказать лишь несколько вещей:

1. Вся информация, которая потенциально вас тут обучает — исключительно субъективная, т.к. у каждого игрока свой стиль игры и если я говорю ТАК, то кто-то может говорить ИНАЧЕ.

2. Я ничего не пропагандирую, никакую идеологию и бла-бла-бла, этот пост максимально аполитичен. +Свастика, которую кто-то особо внимательный может заметить так же ничего с этим общего не имеет и является лишь модом, подчёркивающим историчность игры для большего погружения. (и как всегда мы против фашизма/национализма/политсрачей, ведь помните, что курение фашизма вредит здоровью)

3.Я не буду раздавать советы о том, какие покупать DLC. (у меня они все куплены итак, если кому интересно)

4. Обойдёмся без крабов и Безумных Безумцев, пожалуйста.

Итак, начнём.

При запуске игры вас встречает такое вот меню

Меню в Hearts of Iron IV Фон меню зависит от количества купленных DLC и их свежести. 

Не будем на нём особо зацикливаться и нажмём на одиночную игру.

Несколько сценариев развития событий. Но не так много, как в HOI3, советую погуглить.

Кроме 1936 есть ещё 1939 год. К сожалению, он не такой вариативный, да и нужен он лишь для тренировки.

Перед нами предстаёт выбор из нескольких сценариев, 36 и 39 года. Мы выберем 1936 из-за вариативности в развитии стран.

Список мощных государств. (Мажоры) А за ними идёт список малых государств. (Миноры)

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

Вот он, мир. За 3 года до.

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

От Рейна до Кёнигсберга. Германия, под управлением НСДАП.

Перед вами представлена Германия, но это не то, на что стоит акцентировать внимание с начала. С начала мы посмотрим с вами на верхнюю панель с представленными на ней иконками.

Верхняя панель.

Судебный молот — это решения, которые принимает гос-во. От таких базовых, как «региональная промышленная интеграция» для строительства, вплоть до объединения нескольких государств.

Решения Судебный Молот

Глаз — это разведка (да, то самое нововведение, начиная с версии 1.9), где вы за 5 фабрик (валюта, за которую покупаются ресурсы и строятся все прочие сооружения) сможете создать своё агенство и посылать разведчиков в другие страны, дабы выкрасть секретную информацию или же дестабилизировать ситуацию в стране.

Разведка Глаз

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

Исследования Колба

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

Дипломатия Рукопожатие

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

Торговля Просто торговля, сойдёмся на этом

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

Строительство  Ковш на Гусеницах

Ключ на 9 — это производство, оно происходит на военных заводах и верфях, которые строятся за счёт фабрик (которых если будет не хватать, некоторые военные заводы откажутся работать).

Производство Ключ на 9

Танк со стрелочкой — это создание дивизий, которые создаёт игрок за военный опыт. Так как военный опыт появится у нас лишь потом, остаётся воевать теми, что есть, так что о дивизиях мы поговорим чуть позже. Так же можно регулировать приоритет припасов в отдельные гарнизоны: Активные дивизии, При поступлении новой техники её замена, Для операций и для Гарнизонов на оккупированных территориях.

Создание Дивизий Танк-Феменист

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

Логистика АйПад

Итак, это вся панель, иконки левее от панели лишь уведомления о некоторых предстоящих или уже происходящих действиях.

Тот же скриншот Для разжевывания каждой мелкой кнопки

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

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

Внизу справа находятся режимы карты: Карта со снабжением, Карта с ресурсами, Карта с пехотой; авиацией; флотом и разведкой, Карта с сопротивлением, Включение/Отключение смены Дня и Ночи, Тумана Войны, Батлпланов союзников и прочее.

Снизу находятся две иконки: Назначение маршалов (та, что мелкая) и Назначение фельдмаршалов (та, что большая).

Телефон и звёзды — это опыт армии, флота, авиации, а так же опыт генералов, помечаемый телефоном.

Слева от иконок с опытом, слева на право:

Политическая Власть (вторая валюта, за которую можно нанимать советников, принимать решения),

Стабильность (если она маленькая, то в стране бунты, мятежи, никто не хочет работать, следовательно заводы пустуют, лимит капитуляции вашей страны большой и она при прорыве противника может пасть очень быстро, а при высокой всё в точности наоборот),

Поддержка Войны (нужна для изменения призыва, экономики и мобилизации, то как активно народ топит за войну),

Мэнпауер (т.е. призывники, чем больше, тем лучше, можно повысить призывом),

Количество пром. предприятий (ничего особенного, фабрики, заводы, верфи),

Количество топлива (чем больше, тем быстрее Роммель будет гнать на своём танке),

Количество Конвоев (нужны для переправки товаров из других стран, будь то ресурсы, ленд-лиз и своих войск)

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

Свержение… …вы знаете кого.

Мы выберем фокус, направление и путь, по которому пойдёт страна. Как можно заметить, мы решили свергнуть Шикельгрубера, путём гос. переворота.

Само древо фокусов Германии. Не самое обширное.

Зачастую фокусы делятся на несколько типов:

1. Промышленность, бонусы для строительства и халявные заводы/фабрики.

2. Военная ветка, для прокачки армии, опыт и бонусы на исследование.

3. Политический курс вашей страны, на ваше усмотрение.

Исторический путь. И исторические (и не очень) события.

Наш, не исторический путь. Не исторические события, и акцент на другом.

Итак, теперь укомплектуем нашу армию в боеспособную единицу. Мы можем укомплектовать один дивизию (т.е. юнит) в армию, под управление маршала в армии может находится не более 24 дивизий, под управлением фельд-маршала не более 5 армий.

Армия Германии. В начале 1936 года.

Укомплектовали, собрали Купили школьную атрибутику на 1 сенятбря. 

К слову каждого генерала можно прокачивать, нажав лишь на этот плюс, слева ниже иконки для выбора маршала. Каждая фактор даёт своё преимущество и лучше, время от времени, прокачивать ген-штаб (но умнее он от этого не станет, it’s still on your own)

Выбор маршала

Прокачка маршала

Как управлять армией:

Внизу есть менюшка, над армией, расскажу что означают эти кнопки, слева на право:

Повторяющийся скриншот Повторение — мать учения 

Тренировка дивизий — накапливает опыт и тренирует личный состав,

Необходимость в наступлении — аккуратное ли будет продвижение или в лоб,

Высадка с моря — для высадки с моря,

ВДВ — для десантирования,

Линия фронта — тот самый батлплан, который водит дивизиями на поле боя (тупой, поэтому лучше ручками),

Линия наступления — по этой линии движутся войска,

Прорыв — по этой линии войска прутся в лоб и рвутся из последних сил,

Линия обороны — для обороны,

Занятие территории — для занимания территории.

Предпоследние 2 кнопки — изменение планов наступления и прорыва,

Последние 2 кнопки — изменение линии фронта и удаление линии фронта, наступления, прорыва или высадки.

Теперь стоит позаботится о флоте, лично я сгоняю его в один и объединяю и гоняю куда мне надо. (если что, то так никто не делает, просто я дурачок, а так мог бы лишь посоветовать посмотреть отдельные видео на YouTube на эту тему)

Карта Флотилий

Выбор всех флотилий Германии.

Сгоняю в один порт для объединения

Управление целым флотом, нижние кнопки слева на право:

Тренировка флотилий,

Патруль/Разведка чужих кораблей,

Ударное соединение кораблей,

Поиск и уничтожение конвоев,

Защита своих конвоев,

Минирование,

Траление мин,

Поддержка высадки.

Поскольку я забыл сделать скриншот с целым флотом То вот вам картинка из гугла

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

Карта воздушного флота

Управление авиацией, верхние кнопки слева на право:

Тренировка авиации,

Превосходство в воздухе,

Защита войск/Прикрытие,

Защита от бомбардировок,

Бомбардировка,

Морская бомбардировка,

и те прочии функции, которыми я не пользуюсь…

Собранная авиацаия

Итак, собрали флот и авиацию, что дальше?

Как мы знаем: наука не стоит на месте! Вот и мы поспешим, открывая вкладку исследований.

Исследования пехоты Винтовки, Пулемёты, Моторизированная Пехота

Поддержка Саперные роты, Разведка в бою и прочая помощь для шаблонов дивизий

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

Артилерия А так же средства противовоздушные, противотанковые и ракетная арта

Военные доктрины Тактики при войне батлпланом, каждая полезна и даёт свои преимущества

Флотилии На любой вкус, от крейсеров до линкоров, от авианосцев до подлодок

Морские доктрины Нужны лишь… а ни зачем они и не нужны, по крайней мере для меня

Авиация Штурмовики, Истребители и Бомбардировщики. Вплоть до реактивных

Авиационные доктрины Под каждый тип авиации

Технологии на электронику и атомы Всё что быстрее исследует и показывает кузькину мать

Технологии на строительство Пятилетка за 5 секунд, желательно с этих фокусов и начинать

Фокусы для начала Желательно что бы был такой список

Итак — мы готовы. Вооружены и опасны, но тут (через 70 дней, средняя продолжительность фокуса) случается переворот и генерал ПМВ МакКензен готовится свергать Адольфа со командуя из Франкфурта.

Начало конца Что дальше?

Дальше… дальше началась война, друг мой.

Распределяем армии по всей линии фронта При помощи батлплана, конечно же

Так же расставляем (если они успели перебраться к нам на сторону) лёгкие танковые дивизии посередине фронта и прорвав оборону врага рвёмся до границ Чехословакии. Желательно уменьшить скорость для того, что бы успевать совершать манёвры и не угодить в котёл.

Прорыв… …и углубление

Желательно за прорывом следить и прикрывать въезд танков пехотными частями не давая возможности противнику пройти в пустую клетку и закрыть котёл.

Это конец для Мюнхенской группы Котёл закрыт и вариться 

Из за закрытия котла перестраиваем батлплан и можем жать до конца, изредка лишь давая армии повод отдышатся и пополнить организацию + припасы.

Спустя неопределённое время Котёл был закрыт

Моментально перебрасываем части с авиацией на восток и начинаем показывать как играть НЕ надо.

Давим, как можем И это плохо

А именно: Давить неплохо снабженных солдат своими солдатами, просто разбрасываясь ими на рожон, так делать нельзя. Особенно если ваш враг снабжен людьми и винтовками, а у вас хер с маслом и дивизии из трёх касок, но давить нам как раз надо для накопления военного опыта (который так же копится от ленд-лиза в другую воюющую страну или от посыла туда же атташе).

Берлин наш!

Тем не менее там Берлин пал, а Адольф был найден мёртвым в Рейхсканцелярии. Что же, это победа.

Как трофеи после войны мы получаем запас припасов И последствия мирного договора

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

А теперь про шаблоны

Вот он Стандартный пехотный шаблон Германии

Шаблоны — Это то из чего состоит ваша армия. Если в кратце, то:

Слева сверху — Моделька и название шаблона

Слева снизу — Та самая поддержка, дополнительное обеспечение + арта

Посередине — Сама армия, каски (люди), арта, танки, мотопехота и кавалерия.

Справа сверху — информация о шаблоне (приоритетным я бы назвал пункт — Ширина Фронта, т.к. чем он больше в одной дивизии солдат, приоритетные ширины фронта — это 20 и 40)

Слева снизу — то, как соседствует та или иная местность с вашей дивизией, для этого и нужны дивизии горные или кавалерийские, а так же полностью артиллерийские для прорыва, так же как и танковые.

Неплохой пехотный шаблон 20 ширина

Неплохой лёгкий-танковый шаблон тоже 20 ширина

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

Итоги:

Что я бы хотел ещё обсудить, но не вышло как-то, или же те темы, которые были затронуты лишь поверхностно будут затронуты в этих роликах:

*внимание, в этих роликах может быть старая версия, поэтому некоторые вещи могут отличатся от мною показанного*

Доктрины в Hearts of Iron IV
Гайд по шаблонам в Hearts of Iron IV
Механика боя Hearts of Iron 4
Ширина фронта в Hearts of Iron 4. Ввод резервов и ротация.

Ну и мотиватор для всех начинающих:

*превью сделано в развлекательных целях и ничего не пропагандирует*

Спасибо!

Спасибо тебе! Спасибо всем кто это дочитал! Для меня этот пост был отдушиной, его хотел написать ещё с апреля этого года и тут дотянулись руки сделать его. Надеюсь эта информация была для кого-то полезна и я привлёк новых людей в этот мир игр от Параходов (Paradox Interactive), в любом случае спасибо и.. пока!

В этой статье помимо архитектуры Git будут рассмотрены принципы работы таких команд, как add, checkout, reset, commit, merge, rebase, cherry-pick, pull, push и tag.

💡 Обо всем по порядку

Вы должны практиковаться параллельно с чтением поста.

Давайте сначала создадим новый проект с именем git-101, а затем инициализируем репозиторий git с помощью команды git init:

        $ mkdir git-101
$ cd git-101
    

Git CLI предоставляет два типа команд:

  • Plumbing – состоит из низкоуровневых команд, используемых Git за кулисами, когда пользователи вводят высокоуровневые команды.
  • Porcelain – которые являются высокоуровневыми командами, обычно используемыми пользователями Git.

В этом руководстве мы увидим, как команды plumbing связаны с командами porcelain, которые мы используем изо дня в день.

Внутри проекта, содержащего репозиторий Git, ознакомимся с компонентами Git:

        $ ls -F1 .git/

HEAD
config
description
hooks/
info/
objects/
refs/
    

Мы остановимся на основных:

  • .git/objects/
  • .git/refs
  • HEAD

Разберем подробно каждый компонент.

💾 База данных объектов

Используя find, инструмент UNIX, мы можем ознакомиться со структурой папки .git/objects:

        $ find .git/objects

.git/objects
.git/objects/pack
.git/objects/info

    

В Git все хранится в структуре .git/objects, которая представляет собой Git Object Database.

Что мы можем сохранить в Git? Все.

🤔 Подождите!

Как это возможно?

С помощью хэш-функций.

🔵 Спасаемся хэшированием

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

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

SHA-1 – известная реализация хэш-функции, которая в целом безопасна и почти не имеет коллизий.

Возьмем, к примеру, хэширование строки my precious:

        $ echo -e "my precious" | openssl sha1
fa628c8eeaa9527cfb5ac39f43c3760fe4bf8bed

    

Примечание. Если вы работаете в Linux, вы можете использовать команду sha1sum вместо OpenSSL.

🔵 Сравнение различий в содержании

Хорошее хэширование – это безопасная практика, когда мы не можем знать необработанное значение, т. е. реверс-инжиниринг.

В случае если мы хотим знать, изменилось ли значение, мы просто помещаем значение в хэш-функцию и вуаля – мы можем сравнить разницу:

        $ echo -e "my precious" | openssl sha1
fa628c8eeaa9527cfb5ac39f43c3760fe4bf8bed

$ echo -e "no longer my precious" | openssl sha1
2e71c9ae2ef57194955feeaa99f8543ea4cd9f9f
    

Если хэши разные, то можно считать, что значение изменилось.

Можете ли вы найти здесь возможность? Как насчет использования SHA-1 для хранения данных и просто отслеживания всего путем сравнения хэшей? Это именно то, что Git делает внутри 🤯.

🔵 Git и SHA-1

Git использует SHA-1 для генерации хэширования всего и сохраняет его в .git/objectsпапке. Просто так!

hash-object, команда plumbing:

        $ echo "my precious" | git hash-object --stdin
8b73d29acc6ae79354c2b87ab791aecccf51701f
    

Сравним с OpenSSL версией:

        $ echo -e "my precious" | openssl sha1
fa628c8eeaa9527cfb5ac39f43c3760fe4bf8bed
    

Упс … это совсем другое. Это потому, что Git добавляет определенное слово, за которым следует размер содержимого и разделитель \0. Это слово Git называет типом объекта.

Да, у объектов Git есть типы. Первый объект, который мы рассмотрим, – это объект blob.

🔵 blob-объект

Когда мы отправляем, например, строку my precious в команду hash-object, Git добавляет паттерн {object_type} {content_size}\0 к функции SHA-1, так что:

        blob 12\0myprecious

    

Затем:

        $ echo -e "blob 12\0my precious" | openssl sha1
8b73d29acc6ae79354c2b87ab791aecccf51701f

$ echo "my precious" | git hash-object --stdin
8b73d29acc6ae79354c2b87ab791aecccf51701f
    

Ура! 🎉

🔵 Хранение blob в базе данных

Но сама команда hash-object не сохраняется в папке .git/objects. Мы должны добавить -w и объект будет сохранен:

        $ echo "my precious" | git hash-object --stdin -w
8b73d29acc6ae79354c2b87ab791aecccf51701f

$ find .git/objects
...
.git/objects/8b
.git/objects/8b/73d29acc6ae79354c2b87ab791aecccf51701f

### Or, simply
$ find .git/objects -type f
.git/objects/8b/73d29acc6ae79354c2b87ab791aecccf51701f
    

📁⚙️ Полное руководство по основам Git

Данное изображение и все последующие взяты отсюда.

🔵 Чтение необработанного содержимого блоба

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

🤔 Хорошо, но подождите.

Как Git узнает исходное значение?

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

cat-file, команда plumbing, при наличии ключа распаковывает сжатые данные, таким образом, получая исходное содержимое:

        $ git cat-file -p 8b73d29acc6ae79354c2b87ab791aecccf51701f
my precious
    

Таким образом, Git – это база данных с ключом и значением!

📁⚙️ Полное руководство по основам Git

🔵 Как поделиться blob

Используя Git, мы хотим работать над содержимым и делиться им с другими людьми

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

Другими словами, нам нужно сгруппировать, продвигать и добавлять метаданные в наши блобы. Этот процесс работает следующим образом:

  1. Добавьте большой двоичный объект в промежуточную область
  2. Сгруппируйте все blob-объекты в рабочей области в древовидную структуру
  3. Добавьте метаданные в древовидную структуру (имя автора, дата, смысловое сообщение)

Давайте рассмотрим описанные выше шаги подробнее.

🔵 Stage area и index

update-index, команда plumbing, позволяет добавить blob в stage area и дать ему имя:

        $ git update-index \
    --add \
    --cacheinfo 100644 \
    8b73d29acc6ae79354c2b87ab791aecccf51701f \
    index.txt
    
  • --add: добавляет blob в stage, также называемый индексом.
  • --cacheinfo: используется для регистрации файла, которого еще нет в рабочем каталоге
  • хэш blob
  • index.txt: имя большого двоичного объекта в индексе.

📁⚙️ Полное руководство по основам Git

Где Git хранит индекс?

        $ cat .git/index

DIRCsҚjT¸zQp    index.txtÆ
                          7CJVVÙ
    

Недоступен для чтения человеком и сжат с использованием Zlib.

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

        $ git update-index {sha-1} f1.txt
$ git update-index {sha-1} f2.txt

    

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

🔵 Объект дерева

Команда write-tree (plumbing) позволяет Git группировать все blob, которые были добавлены в индекс, и создает в папке еще один объект: .git/objects

        $ git write-tree
3725c9e313e5ae764b2451a8f3b1415bf67cf471
    

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

        $ find .git/objects

### The new object
.git/objects/37
.git/objects/37/25c9e313e5ae764b2451a8f3b1415bf67cf471

### The blob previously created
.git/objects/8b
.git/objects/8b/73d29acc6ae79354c2b87ab791aecccf51701f
    

Давайте извлечем исходное значение с помощью cat-file для лучшего понимания:

        ### Using the option -t, we get the object type
$ git cat-file -t 3725c9e313e5ae764b2451a8f3b1415bf67cf471
tree

$ git cat-file -p 3725c9e313e5ae764b2451a8f3b1415bf67cf471
100644 blob 8b73d29acc6ae79354c2b87ab791aecccf51701f index.txt
    

Это интересный вывод, он сильно отличается от BLOB-объекта, который вернул исходное содержимое.

В дереве объектов Git возвращает все объекты, которые были добавлены в индекс.

        100644 blob 8b73d29acc6ae79354c2b87ab791aecccf51701f index.txt

    
  • 100644: кэш-информация
  • blob: тип объекта
  • хэш blob
  • имя blob

📁⚙️ Полное руководство по основам Git

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

🔵 Объект коммита

commit-tree, команда plumbing, получает дерево, сообщение коммита и создает еще один объект в папке .git/objects:

        $ git commit-tree 3725c -m 'my precious commit'
505555f4f07d90ae14a0f2e67cba7f7b9af539ee
    

Что это за объект?

        $ find .git/objects
...
.git/objects/50
.git/objects/50/5555f4f07d90ae14a0f2e67cba7f7b9af539ee

### cat-file
$ git cat-file -t 505555f4f07d90ae14a0f2e67cba7f7b9af539ee
commit
    

А как насчет его стоимости?

        $ git cat-file -p 505555f4f07d90ae14a0f2e67cba7f7b9af539ee

tree 3725c9e313e5ae764b2451a8f3b1415bf67cf471
author leandronsp <leandronsp@example.com> 1678768514 -0300
committer leandronsp <leandronsp@example.com> 1678768514 -0300

my precious commit

    
  • tree 3725c: объект дерева ссылок
  • автор/коммиттер
  • сообщение коммита my precious commit

📁⚙️ Полное руководство по основам Git

🤯 ОМГ! Я вижу здесь закономерность?

Кроме того, коммиты могут ссылаться на другие коммиты:

        $ git commit-tree 3725c -p 50555 -m 'second commit'
5ea578a41333bae71527db537072534a199a0b67
    

-p позволяет ссылаться на родительский коммит:

        $ git cat-file -p 5ea578a41333bae71527db537072534a199a0b67

tree 3725c9e313e5ae764b2451a8f3b1415bf67cf471
parent 505555f4f07d90ae14a0f2e67cba7f7b9af539ee
author leandronsp <leandronsp@gmail.com> 1678768968 -0300
committer leandronsp <leandronsp@gmail.com> 1678768968 -0300

second commit
    

Мы видим, что, благодаря коммиту с родителем, мы можем рекурсивно пройти все коммиты по всем их деревьям, пока не доберемся до финальных blob-объектов .

Возможное решение:

        $ git cat-file -p <first-commit-sha1>
$ git cat-file -p <first-commit-tree-sha1>
$ git cat-file -p <first-commit-parent-sha1>
$ git cat-file -p <parent-commit-sha1>
...
    

И так далее. Ну вы попали в точку.

🔵 Логирование для восстановления

git log, команда porcelain, решает эту проблему, просматривая все коммиты, их родителей и деревья, давая нам представление о временной хронологии нашей работы.

        $ git log 5ea57

commit 5ea578a41333bae71527db537072534a199a0b67
Author: leandronsp <leandronsp@gmail.com>
Date:   Mon Mar 13 22:42:48 2023 -0300

    second commit

commit 505555f4f07d90ae14a0f2e67cba7f7b9af539ee
Author: leandronsp <leandronsp@gmail.com>
Date:   Mon Mar 13 22:35:14 2023 -0300

    my precious commit
    

🤯 ОМГ!

Git – это гигантская, но легкая база данных графа ключ-значение!

🔵 Граф Git

В Git мы можем манипулировать указателями на граф.

📁⚙️ Полное руководство по основам Git

  • Blob – это моментальные снимки данных/файлов.
  • Деревья представляют собой набор блобов или другое дерево.
  • Коммиты ссылаются на деревья и/или другие коммиты, добавляя метаданные

Это очень мило и все такое, но использование sha1 в команде git log может быть громоздким.

Как насчет присвоения имен хэшам? Используйте ссылки.

Ссылки на Git

Ссылки находятся в папке .git/refs:

        $ find .git/refs

.git/refs/
.git/refs/heads
.git/refs/tags
    

🔵 Дадим имена коммитам

Мы можем связать любой хэш коммита с произвольным именем, расположенным в .git/refs/heads, например:

        echo 5ea578a41333bae71527db537072534a199a0b67 > .git/refs/heads/test

    

Теперь давайте выполним git log, используя новую ссылку:

        $ git log test

commit 5ea578a41333bae71527db537072534a199a0b67
Author: leandronsp <leandronsp@gmail.com>
Date:   Mon Mar 13 22:42:48 2023 -0300

    second commit

commit 505555f4f07d90ae14a0f2e67cba7f7b9af539ee
Author: leandronsp <leandronsp@gmail.com>
Date:   Mon Mar 13 22:35:14 2023 -0300

    my precious commit
    

Что еще лучше, Git предоставляет update-ref, команду plumbing, и мы можем использовать ее для обновления связи коммита со ссылкой:

        $ git update-ref refs/heads/test 5ea578a41333bae71527db537072534a199a0b67

    

Звучит знакомо, да? Да, речь идет о ветках.

🔵 Ветки

Ветки – это ссылки, указывающие на конкретный коммит.

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

📁⚙️ Полное руководство по основам Git

На мгновение давайте подумаем о том, как git log работает без аргументов:

        $ git log

fatal: your current branch 'main' does not have any commits yet
    

🤔 Хм…

Как Git узнает, что моя текущая ветка является «основной»?

🔵 HEAD

Ссылка на HEAD находится в .git/HEAD. Это один файл, который указывает на главную ссылку (ветвь):

        $ cat .git/HEAD

ref: refs/heads/main
    

Точно так же, используя команду porcelain:

        $ git branch
* main
    

Используя symbolic-ref, команду plumbing, мы можем управлять тем, на какую ветку указывает HEAD:

        $ git symbolic-ref HEAD refs/heads/test

### Check the current branch
$ git branch
* test
    

Как и update-ref в ветках, мы можем обновить HEAD, используя symbolic-ref в любое время.

📁⚙️ Полное руководство по основам Git

На картинке ниже мы изменим HEAD с ветки main на ветку fix:

📁⚙️ Полное руководство по основам Git

Без аргументов команда git log обходит корневой коммит, на который ссылается текущая ветвь (HEAD):

        $ git log

commit 5ea578a41333bae71527db537072534a199a0b67 (HEAD -> test)
Author: leandronsp <leandronsp@gmail.com>
Date:   Tue Mar 14 01:42:48 2023 -0300

    second commit

commit 505555f4f07d90ae14a0f2e67cba7f7b9af539ee
Author: leandronsp <leandronsp@gmail.com>
Date:   Tue Mar 14 01:35:14 2023 -0300

    my precious commit
    

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

Пришло время связать все эти знания с porcelain командами, которые мы используем ежедневно.

🍽️ Porcelain команды

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

Эти команды называются porcelain командами.

🔵 git add

Команда git add принимает файлы в рабочем каталоге в качестве аргументов, сохраняет их как blob-объекты в базе данных и добавляет их в индекс.

📁⚙️ Полное руководство по основам Git

Короче говоря, git add:

  1. запускает hash-object для каждого аргумента файла
  2. запускает update-index для каждого аргумента файла

🔵 git commit

git commit принимает в качестве аргумента сообщение, группирует все ранее добавленные в индекс файлы и создает объект коммита.

Сначала выполняется write-tree:

📁⚙️ Полное руководство по основам Git

Затем выполняется commit-tree:

📁⚙️ Полное руководство по основам Git

        $ git commit -m 'another commit'

[test b77b454] another commit
 1 file changed, 1 deletion(-)
 delete mode 100644 index.txt

    

🕸️ Управление указателями в Git

Широко используются следующие команды porcelain, которые манипулируют ссылками Git под капотом.

Предполагая, что мы только что клонировали проект, в котором HEAD указывает на main ветку, которая указывает на коммит C1:

📁⚙️ Полное руководство по основам Git

Как мы можем создать еще одну новую ветку из текущей HEAD и переместить HEAD в эту новую ветку?

🔵 git checkout

Используя git checkout с параметром -b, Git создаст новую ветку из текущей (HEAD) и переместит HEAD в эту новую ветку.

        ### HEAD
$ git branch
* main

### Creates a new branch "fix" using the same reference SHA-1
#### of the current HEAD
$ git checkout -b fix
Switched to a new branch 'fix'

### HEAD
$ git branch
* fix
main
    

Какая plumbing-команда отвечает за перемещение HEAD? Точно, symbolic-ref.

📁⚙️ Полное руководство по основам Git

После этого мы делаем новую работу в ветке fix, а затем выполняем git commit, который добавит новый коммит под названием C3:

📁⚙️ Полное руководство по основам Git

Запустив git checkout, мы можем продолжать переключать HEAD между разными ветвями:

📁⚙️ Полное руководство по основам Git

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

Мы уже знаем, что это делает команда plumbing update-ref:

        $ git update-ref refs/heads/fix 356c2

    

🔵 git reset

Команда git reset (porcelain) запускает update-ref внутри, поэтому нам просто нужно выполнить:

        $ git reset 356c2

    

Но как Git узнает, какую ветку нужно переместить? Что ж, git reset перемещает ветку, на которую указывает HEAD.

📁⚙️ Полное руководство по основам Git

Что делать, если есть различия между ревизиями? Используя reset, Git перемещает указатель, но оставляет все различия в рабочей области (индексе).

        $ git reset b77b

    

Проверка с помощью git status:

        $ git status

On branch fix
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        another.html
        bye.html
        hello.html

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

Коммит ревизии был изменен в ветке fix и все отличия перенесены в index .

Тем не менее, что нам делать, если мы хотим сбросить и отбросить все различия? Просто использовать параметр --hard:

📁⚙️ Полное руководство по основам Git

При использовании git reset --hard любые различия между ревизиями будут отброшены, и они не будут отображаться в индексе .

💡 Золотой совет о перемещении ветки

Если мы хотим выполнить подключение update-ref к другой ветке, нет необходимости проверять ветку, как это необходимо в git reset.

Вместо этого мы можем выполнить porcelain-команду git branch -f source target:

        $ git branch -f main b77b

    

Под капотом он выполняет git reset --hard в исходной ветке. Давайте проверим, на какой коммит указывает основная ветка:

        $ git log main --pretty=oneline -n1
b77b454a9a507f839880879a895ac4f241177a28 (main) another commit
    

Также мы подтверждаем, что ветка fix по-прежнему указывает на коммит 369cd:

        $ git log fix --pretty=oneline -n1
369cd96b1f1ef6fa7de1ff2ed12e15be979dcffa (HEAD -> fix, test) add files

    

Мы сделали git reset без перемещения HEAD!

📁⚙️ Полное руководство по основам Git

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

🔵 git cherry-pick

С помощью porcelain-команды git cherry-pick мы можем применить произвольную фиксацию к текущей ветке.

Возьмем следующий сценарий:

📁⚙️ Полное руководство по основам Git

  • main-пункты к C3 – C2 – C1
  • fix для точек на C5 – C4 – C2 – C1
  • HEAD указывает на fix

В ветке исправления отсутствует фиксация C3, на которую ссылается основная ветка.

Для этого запустим git cherry-pick C3:

📁⚙️ Полное руководство по основам Git

Обратите внимание, что:

  • коммит C3 будет клонирован в новый коммит с именем C3
  • этот новый коммит будет ссылаться на коммит C5
  • fix переместит указатель на C3′
  • HEAD продолжает указывать на исправление

После применения изменений график будет представлен следующим образом:

📁⚙️ Полное руководство по основам Git

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

Вы не ошиблись, здесь мы говорим о git merge.

🔵 git merge

Опишем следующий сценарий:

📁⚙️ Полное руководство по основам Git

  • Main-пункты к C3 – C2 – C1
  • Fix точек на C4 – C3 – C2 – C1
  • HEAD указывает на main

Мы хотим применить исправленную ветку к текущей (основной) ветке, т. е. выполнить git merge fix.

Обратите внимание, что ветка fix содержит все коммиты, принадлежащие основной ветке (C3 – C2 – C1), имея только один коммит перед основным (C4).

В этом случае основная ветвь будет «переадресована», указывая на тот же коммит, что и ветка исправления.

Такое слияние называется fast-forward, как показано на изображении ниже:

📁⚙️ Полное руководство по основам Git

Когда fast-forward невозможен

Иногда текущее состояние нашей древовидной структуры не позволяет выполнять ускоренную перемотку вперед. Рассмотрим сценарий ниже:

📁⚙️ Полное руководство по основам Git

Когда в ветке слияния – ветке исправления в приведенном выше примере – отсутствует одна или несколько коммитов из текущей ветки (основной): коммит C3.

Таким образом, fast-forward невозможен.

Однако, чтобы слияние прошло успешно, Git выполняет технику, называемую Snapshotting, состоящую из следующих шагов.

Во-первых, Git ищет следующего общего родителя двух ветвей, в этом примере коммит C2.

📁⚙️ Полное руководство по основам Git

Во-вторых, Git делает снимок целевой ветки фиксации C3:

📁⚙️ Полное руководство по основам Git

В-третьих, Git делает снимок исходной ветки фиксации C5:

📁⚙️ Полное руководство по основам Git

Наконец, Git автоматически создает слияние фиксации (C6) и указывает на двух родителей соответственно: C3 (цель) и C5 (источник):

📁⚙️ Полное руководство по основам Git

Вы когда-нибудь задумывались, почему в дереве Git отображаются некоторые коммиты, созданные автоматически?

Не заблуждайтесь, этот процесс слияния называется трехсторонним слиянием!

📁⚙️ Полное руководство по основам Git

Далее давайте изучим другой метод слияния, при котором fast-forward невозможен, но вместо моментального снимка и автоматического слияния коммита Git применяет различия поверх исходной ветки.

Да, это git rebase.

🔵 git rebase

Рассмотрим следующее изображение:

📁⚙️ Полное руководство по основам Git

  • Main-пункты к C3 – C2 – C1
  • fix точек на C5 – C4 – C2 – C1
  • HEAD указывает на fix

Мы хотим перебазировать основную ветку в ветку исправления, посредством git rebase main. Но как работает git rebase?

👉git reset

Сначала Git выполняет git reset main, при этом ветка fix будет указывать на тот же указатель основной ветки: C3 – C2 – C1.

📁⚙️ Полное руководство по основам Git

На данный момент у коммитов C5-C4 нет ссылок.

👉git cherry-pick

Во-вторых, Git выполняет git cherry-pick C5 в текущую ветку:

📁⚙️ Полное руководство по основам Git

Обратите внимание, что выбранные коммиты клонируются, поэтому окончательный хэш изменится: C5 – C4 станет C5′ – C4′.

После у нас может быть следующий сценарий:

📁⚙️ Полное руководство по основам Git

👉git reset еще раз

Наконец, Git выполнит git reset C5', поэтому указатель ветки fix переместится с C3 на C5'.

Процесс rebase завершен.

📁⚙️ Полное руководство по основам Git

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

🌐 Удаленные ветки

Чтобы работать с удаленными ветками, нам нужно добавить удаленную ветку в наш локальный репозиторий с помощью команды porcelain – git remote.

        $ git remote add origin git@github.com/myaccount/myrepo.git

    

Удаленные репозитории находятся в папке .git/refs/remotes:

        $ find .git/refs
...
.git/refs/remotes/origin
.git/refs/remotes/origin/main
    

🔵 Скачать с удаленного репозитория

Как нам синхронизировать удаленную ветку с нашей локальной веткой?

Git предлагает два шага:

👉git fetch

С помощью git fetch origin main Git загрузит удаленную ветку и синхронизирует ее с новой локальной веткой с именем origin/main, также известной как upstream branch (восходящая ветка).

📁⚙️ Полное руководство по основам Git

👉git merge

После извлечения и синхронизации вышестоящей ветки мы можем выполнить git merge origin/main и, поскольку восходящая ветка опережает нашу локальную ветку, Git безопасно применит ускоренное слияние.

📁⚙️ Полное руководство по основам Git

Однако комбинация fetch + merge может повториться, так как мы будем синхронизировать локальные/удаленные ветки несколько раз в день.

Но сегодня наш счастливый день, и Git предоставляет команду git pullchina, которая выполняет fetch + merge от нашего имени.

👉git pull

git pull выполнит выборку (синхронизирует удаленную ветвь с вышестоящей ветвью), а затем объединит восходящую ветвь с локальной ветвью.

📁⚙️ Полное руководство по основам Git

Итак, мы увидели, как получать/загружать изменения с репозитория. С другой стороны, как насчет отправки локальных изменений на удаленные?

🔵 Загрузить на удаленный репозиторий

Git предоставляет porcelain команду под названием git push:

👉git push

Выполнение git push origin main приведет к загрузке изменения на удаленный репозиторий:

📁⚙️ Полное руководство по основам Git

Затем Git объединит восходящую ветвь origin/main с локальной main-веткой:

📁⚙️ Полное руководство по основам Git

В конце мы получим следующее изображение:

📁⚙️ Полное руководство по основам Git

Где:

  • Удаленный репозиторий обновлен (локальные изменения отправлены)
  • main к C4
  • origin/main к C4
  • HEAD указывает на main

🔵 Предоставление неизменяемых имен коммитам

Мы знаем, что ветки – это просто изменяемые ссылки на коммиты, поэтому мы можем переместить указатель ветки.

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

Неизменяемые ссылки полезны, например, когда мы хотим пометить/отметить коммиты, которые готовы для какого-то производственного выпуска.

Да, мы говорим о тегах.

👉git tag

Используя команду (porcelain) git tag, мы можем давать имена коммитам, но мы не можем выполнить сброс или любую другую команду, которая изменила бы указатель.

📁⚙️ Полное руководство по основам Git

Это очень полезно для управления версиями. Теги находятся в папке .git/refs/tags:

        $ find .git/refs

...
.git/refs/tags
.git/refs/tags/v1.0
    

Если мы хотим изменить указатель тега, мы должны удалить его и создать еще один с тем же именем.

💡 Git reflog

И последнее, но не менее важное – вызываемая команда git reflog, которая сохраняет все изменения, которые мы сделали, в нашем локальном репозитории.

        $ git reflog

369cd96 (HEAD -> fix, test) HEAD@{0}: reset: moving to main
b77b454 (main) HEAD@{1}: reset: moving to b77b
369cd96 (HEAD -> fix, test) HEAD@{2}: checkout: moving from main to fix
369cd96 (HEAD -> fix, test) HEAD@{3}: checkout: moving from fix to main
369cd96 (HEAD -> fix, test) HEAD@{4}: checkout: moving from main to fix
369cd96 (HEAD -> fix, test) HEAD@{5}: checkout: moving from fix to main
369cd96 (HEAD -> fix, test) HEAD@{6}: checkout: moving from main to fix
369cd96 (HEAD -> fix, test) HEAD@{7}: checkout: moving from test to main
369cd96 (HEAD -> fix, test) HEAD@{8}: checkout: moving from main to test
369cd96 (HEAD -> fix, test) HEAD@{9}: checkout: moving from test to main
369cd96 (HEAD -> fix, test) HEAD@{10}: commit: add files
b77b454 (main) HEAD@{11}: commit: another commit
5ea578a HEAD@{12}:
    

Это очень полезно, если мы хотим перемещаться вперед и назад по временной шкале Git. Наряду с reset, cherry-pick и подобными, это мощный инструмент, если мы хотим освоить Git.

Подведение итогов

Какое долгое путешествие!

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

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

***

Материалы по теме

  • Git за полчаса: руководство для начинающих
  • 📁 Настраиваем Git для правильной работы с опенсорс-проектами
  • Основы Git: контроль версий для самых маленьких
  • 💽 Git для Data Science: контроль версий моделей и датасетов с помощью DVC
  • 👍 Как правильно писать сообщения коммитов в GIT, чтобы всем было хорошо

Подробное руководство

Cтраница 1

Подробное руководство по эксплуатации автоматов Молчанова изложено в брошюре автора.
 [1]

Подробным руководством для таких расчетов может служить недавно изданная книга: Бродянский В. М., Фратшер В.
 [2]

В подробном руководстве [28] по этому вопросу отмечается следующее Чистка очков является важным элементом их обслуживания. Наличие в каждом цехе специальных настенных шкафчиков или аптечек с принадлежностями для чистки очков дает возможность рабочим постоянно держать свои средства защиты глаз в чистом состоянии, не выходя из цеха, и увеличивает интервалы времени, через которые эти средства должны подвергаться генеральной чистке и дезинфекции.
 [3]

В подробных руководствах по определению концентрации водородных ионов можно найти указания также на ошибки, обусловленные восстановительными и окислительными процессами, имеющими место в некоторых растворах.
 [4]

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

Они включают подробное руководство действиями должностных лиц и производственных и объектовых подразделений по организации оповещения, сбора и сосредоточения на месте аварии и ( или) пожара, необходимого количества сил и средств, проведение первоочередных аварийно-спасательных работ и ( или) тушения пожара, а также взаимодействия с привлекаемыми для этих целей сторонними подразделениями.
 [6]

Данная книга представляет собой подробное руководство по правилам применения уникального и эффективного метода японского технического анализа, получившего в последние годы огромную популярность среди трейдеров и аналитиков во всем мире. Этот метод позволяет анализировать все современные рынки, что наглядно иллюстрируется на сотнях примеров, охватывающих рынки ценных бумаг с фиксированным доходом, акций, фьючерсов, опционов и валют.
 [7]

Здесь мы предлагаем подробное Руководство пользователя по информационно-торговой системе MetaTrader. Любая практическая деятельность на финансовых рынках начинается с научения торговых терминалов.
 [8]

Настоящая книга задумана как подробное руководство по технологии тонких пленок и введение в различные аспекты физики тонких пленок.
 [9]

Настоящая книга не может заменить подробное руководство по качественному анализу хотя бы потому, что частные реакции на катионы и анионы не рассматриваются авторами отдельно от систематического хода анализа.
 [10]

Курсы включают основной учебник, дополнительные учебные материалы, подробное руководство по изучению курса — study guide, содержащий методические указания по изучению курса и обеспечивающее навигацию по всем основным и дополнительным материалам, практические задания, основная часть которых представляет собой учебные кейсы — то есть конкретные практические ситуации, которые предлагается решить студенту и сравнить с вариантами, содержащимися в разделе разбор заданий. В процессе обучения студент обязательно выполняет групповое задание, участвует в тематическом учебном форуме. В интегрированные курсы встроена система тестирования, позволяющая учащемуся осуществлять регулярную самопроверку знаний и проходить рубежное тестирование по каждой составляющей курс дисциплине.
 [11]

В связи с этим появление за рубежом современного, достаточно подробного руководства по методам исследования — первого руковод ства такого рода — представляет очень большой интерес для широкого круга специалистов вследствие общеизвестного научного и технического значения углеводов. Отбор материала для сокращенного перевода этого пятитомника представлял довольно трудную задачу, поскольку руко водство содержит очень много ценных методик.
 [12]

Учитывая, что в настоящее время каждый прибор снабжают достаточно подробным руководством для того, чтобы можно было сопоставить и выбрать аппаратуру для конкретных условий, кратко рассмотрим принцип устройства и работы наиболее типичных приборов.
 [13]

Национальная система бухгалтерского учета ( Plan Comptable General) представляет собой подробное руководство, которое включает определения бухгалтерских терминов, правила оценки и образцы форм бухгалтерской отчетности. План счетов Национальной системы бухгалтерского учета представлен в приложении 17.2. Первый план был разработан в 1947 г. Исправленная его версия вступила в силу в 1982 г., восприняв положения Четвертой Директивы Европейского Союза.
 [14]

Наряду с обменом опытом, изучением литературы начинающему мастеру, начальнику цеха необходимо иметь подробное руководство по этим вопросам.
 [15]

Страницы:  

   1

   2

   3

Понравилась статья? Поделить с друзьями:
  • Препарат оциллококцинум инструкция по применению цена отзывы
  • Собака из носка своими руками пошаговая инструкция
  • Гамавит для цыплят инструкция по применению дозировка
  • Руководство районных прокуратур
  • Агрессивный стиль руководства это