Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,4 @@ Icon[]


# Далее можно добавлять другие правила
secrets.txt
12 changes: 12 additions & 0 deletions a1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# A1. Слияние

> Два состояния можно объединить через merge, mergetool и commit

> Участвуют три стороны: current, incoming и base

> Идентичные изменения в разных ветках не приводят к конфликтам

- `git merge <commit>` — объединить текущую ветку с другим коммитом
- `git merge --no-ff <commit>` — объединить текущую ветку с другим коммитом, причем обязательно создать новый объединяющий коммит
- `git mergetool` — разрешить имеющиеся конфликты
- `git merge --abort` — отменить слияние
18 changes: 18 additions & 0 deletions a2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# A2. Пересоздание коммитов

> Нельзя изменить коммит — можно только пересоздать

> Дополнить или переименовать коммит — commit --amend

> Разобрать коммиты — reset --soft

> Отменить коммит другим коммитом — revert

- `git commit --amend` — заменить последний коммит ветки на коммит с дополнительными изменениями и задать новое сообщение к коммиту
- `git commit --amend --no-edit` — заменить последний коммит ветки на коммит с дополнительными изменениями, но с тем же сообщением
- `git reset --hard <commit>` — переместить текущую ветку на `<commit>`, задать индекс и каталог по целевому коммиту `<commit>`
- `git reset <commit>` = `git reset --mixed <commit>` — переместить текущую ветку на `<commit>`, переместить текущую версию каталога, задать индекс по целевому коммиту `<commit>`
- `git reset --soft <commit>` — переместить текущую ветку на `<commit>`, переместить текущие версии каталога и индекса
- `git reset --soft HEAD^1` — отменить последний коммит
- `git revert <commit>` — создать коммит, отменяющий изменения из коммита
- `git revert <commit> -m <parent_number>` — создать коммит, отменяющий изменения одной из объединенных коммитом слияния веток, причем обычно 1 — основная ветка до слияния, 2 — ветка, которая была влита.
22 changes: 22 additions & 0 deletions a3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# A3. Перенос изменений

> Получить отдельные правки из другой ветки — cherry-pick

> Перенести локальные изменения в новое место — stash

> Переместить коммиты для выстраивания истории в линию — rebase

> Схлопнуть коммиты в один — интерактивный rebase со squash или fixup

- `git cherry-pick <commit>` — применить изменения из указанного коммита к HEAD и сделать коммит
- `git cherry-pick -n <commit>` — применить изменения из указанного коммита, оставив их в индексе
- `git stash push -u` — сохранить все изменения в отслеживаемых файлах и новые файлы в виде набора изменений
- `git stash pop` — восстановить последний сохраненный набор изменений и удалить его из списка
- `git stash list` — показать список сохраненных наборов изменений
- `git stash apply --index <stash>` — применить конкретный сохраненный набор изменений
- `git stash drop --index <stash>` — удалить конкретный сохраненный набор изменений
- `git rebase <newbase>` — применить все коммиты от общего родителя до текущего коммита к `<newbase>`
- `git rebase --autostash <newbase>` — сохранить локальные изменения, выполнить rebase, а затем восстановить локальные изменения
- `git rebase -i <newbase>` — применить заново все коммиты, указав действие с каждым коммитом
- `git rebase --continue` — продолжить rebase после разрешения конфликтов
- `git rebase --abort` — отменить rebase
35 changes: 35 additions & 0 deletions c1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# C1. Минимальная конфигурация

## Установка Git
С официального сайта: [https://git-scm.com/downloads](https://git-scm.com/downloads)

Или с помощью одного из пакетных менеджеров:
- Windows: `choco install git`
- Linux: `sudo apt install git`
- macOS: `brew install git`


## Первоначальная настройка

### Имя и почта пользователя
- `git config --global user.name "<name>"` — задать имя пользователя
- `git config --global user.email "<email>"` — задать почту пользователя

### Текстовый редактор
#### Для Windows
`git config --global core.editor notepad`

#### Для Linux, macOS
По умолчанию vim, но можно поменять на nano: `git config --global core.editor nano`


## Настройка нового репозитория

### Описать, что внутри репозитория и как этим пользоваться
`README.md`

### Надо игнорировать все, кроме исходников
[https://github.com/github/gitignore](https://github.com/github/gitignore) — `.gitignore` для разных языков программирования

### Обычно хранится стандартный текст, но есть исключения
[https://github.com/alexkaratarakis/gitattributes](https://github.com/alexkaratarakis/gitattributes) — `.gitattributes` для разных языков программирования
12 changes: 12 additions & 0 deletions c2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# C2. Аутентификация

## SSH
1. Сгенерировать ключи: `ssh-keygen -t ed25519 -C "your_email@example.com"`
2. Оставить закрытый ключ в домашнем каталоге пользователя `~/.ssh/id_ed25519`
3. Зарегистрировать открытый ключ, т.е. содержимое файла `~/.ssh/id_rsa.pub` из домашнего каталога пользователя, на GitHub по адресу [https://github.com/settings/ssh/new](https://github.com/settings/ssh/new)
4. Добавить GitHub в доверенные узлы на клиенте: `ssh -T git@github.com`
5. При клонировании репозиториев использовать SSH: `git@github.com:username/repo.git`

## HTTPS
1. Подключить Credential Manager: `git config --global credential.helper manager`
2. При клонировании репозиториев использовать HTTPS: `https://github.com/username/repo.git`
103 changes: 103 additions & 0 deletions c3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# C3. Комфортная конфигурация

## Гибкая настройка под любой процесс
- `git config -e --system` — редактировать настройки системы
- `git config -e --global` — редактировать настройки пользователя
- `git config -e` — редактировать настройки репозитория


## Документация ко всем командам
- `git help` — список команд
- `git <command> -h` — помощь по команде в терминале
- `git <command> --help` — помощь по команде в браузере


## Донастройка команд

### Название первой ветки репозитория
`git config --global init.defaultBranch main`

### Настройка вывода log
1. `git config --global format.pretty %C(auto)%h %C(black bold)%ad% %C(reset)%C(auto)%d %s %C(black bold)[%an]%C(reset)`
2. `git config --global log.date format-local:%d.%m.%Y %H:%M`

### Выбор difftool
1. `git config --global diff.tool vscode`
2. `git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'`

### Выбор и настройка mergetool
1. `git config --global merge.tool vscode`
2. `git config --global mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'`

`git config --global mergetool.keepbackup false`

### Разрешение fast-forward merge
По умолчанию и это хорошо: `git config --global merge.ff true`
при необходимости можно: `git config --global merge.ff false`

### Автосохранение локальных изменений при rebase
`git config --global rebase.autostash true`

### Автонастройка отслеживания при push новых веток
`git config --global push.autoSetupRemote true`

### Запрет merge для pull
Удобно заменить на rebase: `git config --global pull.rebase true`
либо можно запретить: `git config --global pull.ff only`

### Режим simple сопоставления веток для push
`git config --global push.default simple` — это режим по умолчанию в Git 2.0 и выше


## Алиасы для краткости команд
`git config --global alias.configure "config --global -e"`
Только bash: `git config --global alias.aliases '!git config -l | grep alias'`
Только PowerShell: `git config --global alias.aliases "!git config -l | findstr alias"`

`git config --global alias.cleanup "clean -xdf"`

`git config --global alias.cm "commit -m"`
`git config --global alias.call "!git add --all && git commit"`
`git config --global alias.calm "!git add --all && git commit -m"`
`git config --global alias.amend "commit --amend --no-edit"`

`git config --global alias.st "status -sb"`

`git config --global alias.gr "log --graph"`
`git config --global alias.gra "log --graph --all"`
`git config --global alias.graph "log --graph --oneline --decorate --all"`
`git config --global alias.grr "log --graph --all --reflog"`

`git config --global alias.br "branch -vv --sort=-committerdate --list"`

`git config --global alias.co "checkout"`
`git config --global alias.cob "checkout -b"`
`git config --global alias.sw "switch"`
`git config --global alias.swc "switch -c"`
`git config --global alias.back "checkout -"`

`git config --global alias.undo "reset --soft HEAD^"`
`git config --global alias.forget "reset --hard HEAD^"`
`git config --global alias.restart "reset --hard @{u}"`

`git config --global alias.merc "merge --no-ff"`
`git config --global alias.ff "merge --ff-only FETCH_HEAD"`

`git config --global alias.autorebase "rebase --autostash"`
`git config --global alias.rr "rebase --autostash FETCH_HEAD"`

`git config --global alias.pushup "push -u origin HEAD"`
`git config --global alias.please "push --force-with-lease"`
`git config --global alias.puff "pull --ff-only"`
`git config --global alias.purr "pull --rebase --autostash"`
`git config --global alias.sync "!git pull --rebase --autostash && git push"`


## Окончание строк текстовых файлов
### Для Windows
1. `git config --global core.autocrlf true`
2. `git config --global core.safecrlf warn`

### Для Linux, macOS
1. `git config --global core.autocrlf input`
2. `git config --global core.safecrlf warn`
82 changes: 82 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/github-markdown-css@5/github-markdown.min.css" />
<script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs@2/webcomponents-loader.min.js"></script>
<script type="module">
import ZeroMd, { STYLES } from 'https://cdn.jsdelivr.net/npm/zero-md@3'

customElements.define('zero-md', class extends ZeroMd {
async load() {
await super.load()
this.template = STYLES.preset('light')
if (this.attributes.src && this.attributes.src.value) {
this.attributes.src.value += '?' + (new Date().getTime() / 1000)
}
}
})
</script>
<style>
body {
margin: 0px;
}

.header {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
line-height: 1.25;
text-align: center;
margin-top: 0px;
margin-bottom: 10px;
}

.header h1 {
font-weight: 600;
margin: 0px;
}

.header a {
display: inline-block;
font-size: 14px;
font-weight: 600;
}

.page {
display: flex;
justify-content: center;
padding: 40px;
}

.column {
display: flex;
flex-direction: column;
gap: 10px;
max-width: 800px;
}

.page .block {
width: 100%;
}
</style>
</head>
<body>
<div class="page">
<div class="column">
<div class="header">
<h1>ULearn Git Guide</h1>
<a href="https://ulearn.me/course/git">https://ulearn.me/course/git</a>
</div>
<div class="block"><zero-md src="./c1.md"></zero-md></div>
<div class="block"><zero-md src="./s1.md"></zero-md></div>
<div class="block"><zero-md src="./s2.md"></zero-md></div>
<div class="block"><zero-md src="./s3.md"></zero-md></div>
<div class="block"><zero-md src="./a1.md"></zero-md></div>
<div class="block"><zero-md src="./a2.md"></zero-md></div>
<div class="block"><zero-md src="./a3.md"></zero-md></div>
<div class="block"><zero-md src="./r1.md"></zero-md></div>
<div class="block"><zero-md src="./c2.md"></zero-md></div>
<div class="block"><zero-md src="./r2.md"></zero-md></div>
<div class="block"><zero-md src="./r3.md"></zero-md></div>
<div class="block"><zero-md src="./c3.md"></zero-md></div>
</div>
</div>
</body>
</html>
13 changes: 13 additions & 0 deletions r1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# R1. Получение версий

> В репозитории есть список псевдонимов удаленных репозиториев

> fetch — безопасная операция получения данных из любого другого репозитория

- `git remote -v` — вывести список удаленных репозиториев с их адресами
- `git remote add <name> <url>` — добавить удаленный репозиторий по URL и дать ему указанное имя
- `git remote set-url <name> <newurl>` — задать удаленному репозиторию новый URL
- `git remote remove <name>` — удалить запись об удаленном репозитории
- `git fetch <remote>` — получить коммиты указанного по имени или URL удаленного репозитория
- `git fetch` = `git fetch origin` — получить коммиты основного удаленного репозитория
- `git fetch --all` — получить коммиты всех удаленных репозиториев из списка
17 changes: 17 additions & 0 deletions r2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# R2. Отправка версий

> Любое изменение в удаленном репозитории — это push

> Обычный push будет успешным, если локальная ветка является потомком удаленной ветки

> Нельзя делать force push with lease в общие ветки, а force push вообще делать нельзя

- `git push <remote> <local_branch>:<remote_branch>` — отправить коммиты из локальной ветки `<local_branch>` в удаленный репозиторий, а затем переместить ветку `<remote_branch>` на коммит, соответствующий `<local_branch>`
- `git push` = `git push origin HEAD` — отправить коммиты из текущей локальной ветки в основной удаленный репозиторий, а затем переместить соответствующую ветку удаленного репозитория на коммит, на который указывает текущая локальная ветка
- `git push -f` — выполнить push, даже если локальная ветка не является потомком удаленной ветки
- `git push --force-with-lease` — выполнить push, даже если локальная ветка не является потомком удаленной ветки, но при условии, что удаленная ветка не сдвигалась (всегда использовать вместо предыдущей команды)
- `git push --all <remote>` — отправить все локальные ветки в удаленный репозиторий
- `git push <remote> -d <branch|tag>` — удалить ветку или тег в удаленном репозитории
- `git push <remote> tag <tag>` — отправить тег в удаленный репозиторий
- `git push <remote> --tags` — отправить все локальные теги в удаленный репозиторий
- `git push --mirror` — выполнить агрессивный push для всех тегов, веток и HEAD, подходит для создания удаленной копии локального репозитория
Loading