# GIT Top Commands

##### <span style="color: rgb(53, 152, 219);">Операции STATUS</span>

**Инициализация каталога как Git-репозитория**

```ruby
git init
```

**Команда показывающая какие файлы в каком состоянии находятся**

```ruby
git status
```

**Показать историю коммитов в текущей ветке / всех ветках**

```ruby
git log
git log --all
```

##### <span style="color: rgb(53, 152, 219);">Операции BRANCH ветвления</span>

**Отобразить активные ветки / все активные и доступные ветки**

```ruby
git branch
git branch -a
```

**Переключиться на другую ветку**

```ruby
git checkout <branch-name>
```

**Создать новую ветку и переключиться на неё**

```ruby
git checkout -b <branch-name>
```

**Проиндексировать все файлы в папке** (для commit)

```ruby
git add .
```

**Удалить ветку из remote REPO**

```ruby
git push origin --delete develop
```

**Отправка всех веток локального репозитория на удалённый репозиторий**

```ruby
git push <link.repo> --all
git push --force <branch-name>
```


##### <span style="color: rgb(53, 152, 219);">Операции с COMMITs</span>

**Создать коммит с указанием имени**

```ruby
git commit -m "new commit"
```

**Автоматическая индексация всех уже отслеживаемых файлов**

```ruby
git commit -a
git commit -am "new commit" (автоиндекс+имя)
```

**Редактор названия коммитов по-умолчанию**

```ruby
git config --global core.editor "vim"
```

**Изменить сообщение последнего коммита**

```ruby
git commit --amend
```

**Забыть все последующие коммиты от указанного по &lt;hash&gt;**

```ruby
git reset --hard <hash>
```

**Изменить дату текущего коммита**

```ruby
GIT_COMMITTER_DATE="Thu Jun 08 13:44:15 2023 +0300" git commit --amend
```

##### <span style="color: rgb(53, 152, 219);">Операции с TAGs</span>

**Создать новый Tag**

```ruby
git tag -a v1.0 -m "feature01"
git tag --list
```

**Отправить Tag на удалённый репозиторий**

```ruby
git push origin v1.0
```

##### <span style="color: rgb(53, 152, 219);">Операции с ALIASes</span>

**Алиасы для графического формата команды git log:**

**Подключить алиас с ключом --all** (отображение всех ветвей)

```ruby
git config --global alias.log0 "log \
  --graph \
  --abbrev-commit \
  --decorate \
  --format=format:'\
%C(bold blue)%h%C(reset) - \
%C(bold green)(%ci)%C(reset) \
%C(white)%s%C(reset) \
%C(dim white)- %an%C(reset)\
%C(auto)%d%C(reset)' \
  --all
```

**Подключить алиас с ключом --branches (отображение локальных веток)**

```ruby
git config --global alias.log1 "log \
  --graph \
  --abbrev-commit \
  --decorate \
  --format=format:'\
%C(bold blue)%h%C(reset) - \
%C(bold green)(%ci)%C(reset) \
%C(white)%s%C(reset) \
%C(dim white)- %an%C(reset)\
%C(auto)%d%C(reset)' \
  --branches"
```

**Отключить алиас**

```ruby
git config --global --unset alias.log1
```

##### <span style="color: rgb(53, 152, 219);">Операции с REPOs</span>

**Клонировать удалённый репозиторий** (папка будет создана)

```ruby
git clone <link.repo>
```

**Клонировать удалённый репозиторий по branch+tag**

```ruby
git clone <link.repo> --branch '<tag-name>'
```

**Скачать изменения без слияния (fetch)**  
Изменения сохраняются в FETCH\_HEAD

```ruby
git fetch origin develop
```

**Посмотреть HASH скачанного коммита**

```ruby
git rev-parse FETCH_HEAD         # полный hash
git log FETCH_HEAD -1 --oneline  # краткий hash
git diff HEAD FETCH_HEAD         # посмотреть изменения
```

**Слить изменения**

Способ 1: Через временную ветку

```ruby
git branch temp-branch FETCH_HEAD # создать ветку
git merge temp-branch             # смержить
git branch -d temp-branch         # удалить ветку
```

Способ 2: Через HASH

```ruby
git merge FETCH_HEAD     # смержить напрямую
git merge <hash>         # смержить по hash
git pull origin develop  # fetch + merge одной командой
```

##### <span style="color: rgb(53, 152, 219);">Примеры Операций с REPOs</span>

**<span style="color: rgb(0, 0, 0);">Пример с Новым Repo</span>**

```ruby
# Инициализация и Push-инг Commit-а в Новый Repo
git init
git config --global user.name "Yuriy"
git config --global user.email "xeonmp22@gmail.com"
git init --initial-branch=main
#git remote set-url origin git@gitlab.rebrainme.com:devops_users_repos/725/devops/07_cicd.dev.git
#git remote remove origin
git remote add origin git@gitlab.rebrainme.com:devops_users_repos/725/devops/07_cicd.dev.git
git add .
git commit -am "34: Logging 6/prom.grafana"
# При 1-ом Commit-е делаем --set-upstream
git push -u origin main
# Для последующих Commit-ов
git push --all
```

**Пример с Рабочим Repo**

```ruby
# Очистка рабочего Repo от файлов Старых Commit-ов
cd $HOME/rebrainme/devops/07_cicd
git rm -rf roles/
cd ../07_cicd.dev
rm -rf .git

# Копирование новых файлов в рабочий Repo
cp -r .gitignore main.tf playbook.yml README.md roles/ ../07_cicd
cd ../07_cicd
git add .
git commit -am "34: Logging 6/prom.grafana"
git push --all
```