Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Solved #1

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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
37 changes: 37 additions & 0 deletions .gitconfig-for-nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
[merge]
tool = vscode
[mergetool]
keepbackup = false
[diff]
tool = vscode
guitool = vscode
[core]
autocrlf = input
[pull]
ff = only
rebase = false
[fetch]
prune = false
[rebase]
autoStash = false
[difftool "vscode"]
path = code
cmd = code --wait --diff $LOCAL $REMOTE
[mergetool "vscode"]
path = code
cmd = code --wait $MERGED
[credential]
helper = manager
[alias]
it = !git init && git commit -m 'Initial commit' --allow-empty
st = status -sb
call = !git add . && git commit -m
commend = commit --amend --no-edit
graph = log --oneline --decorate --graph --all
to = checkout
pushup = push -u origin HEAD
please = push --force-with-lease
puff = pull --ff-only
pure = pull --rebase --autostash
undo = reset --soft HEAD^

36 changes: 36 additions & 0 deletions .gitconfig-for-win
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
[merge]
tool = vscode
[mergetool]
keepbackup = false
[diff]
tool = vscode
guitool = vscode
[core]
autocrlf = true
[pull]
ff = only
rebase = false
[fetch]
prune = false
[rebase]
autoStash = false
[difftool "vscode"]
path = code
cmd = code --wait --diff $LOCAL $REMOTE
[mergetool "vscode"]
path = code
cmd = code --wait $MERGED
[credential]
helper = manager
[alias]
it = !git init && git commit -m 'Initial commit' --allow-empty
st = status -sb
call = !git add . && git commit -m
commend = commit --amend --no-edit
graph = log --oneline --decorate --graph --all
to = checkout
pushup = push -u origin HEAD
please = push --force-with-lease
puff = pull --ff-only
pure = pull --rebase --autostash
undo = reset --soft HEAD^
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Коллекция полезных .gitignore от GitHub: https://github.com/github/gitignore


# Исключение из игнорирования конкретного файла:
!init.md
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

useless if there is no .md ignored

18 changes: 18 additions & 0 deletions apply-gitconfig-for-nix.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/bin/bash
git config --local include.path "../.gitconfig-for-nix"

# setting editor for commits
git config --local core.editor nano

# setting anonymous name and email if not configured by user
GitUserEmail=$(git config --get user.email)
if [[ "$GitUserEmail" == "" ]]; then
git config --local user.email "[email protected]"
fi
GitUserName=$(git config --get user.name)
if [[ "$GitUserName" == "" ]]; then
git config --local user.name "John Doe"
fi

echo "Configuration is done"
sleep 3
62 changes: 62 additions & 0 deletions apply-gitconfig-for-win.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
@echo off

set GIT=git

%GIT% --help > nul

if %errorlevel% neq 0 (
set GIT="%ProgramFiles%\Git\bin\gi.exe"
)

%GIT% --help > nul

if %errorlevel% neq 0 (
color 0c
echo.
echo.
echo "Git is not configured properly... Ask for help!"
pause
exit
)

REM setting editor for commits
%GIT% config --local core.editor notepad

REM including predefined config
%GIT% config --local include.path "../.gitconfig-for-win"

REM setting up absolute path to visual studio code
if exist "%ProgramFiles(x86)%\Microsoft VS Code\Code.exe" (
%GIT% config --local difftool.vscode.path "%ProgramFiles(x86)%\Microsoft VS Code\Code.exe"
%GIT% config --local difftool.vscode.cmd "%ProgramFiles(x86)%\Microsoft VS Code\Code.exe --wait --diff $LOCAL $REMOTE"
%GIT% config --local mergetool.vscode.path "%ProgramFiles(x86)%\Microsoft VS Code\Code.exe"
%GIT% config --local mergetool.vscode.cmd "%ProgramFiles(x86)%\Programs\Microsoft VS Code\Code.exe --wait $MERGED"
)
if exist "%ProgramFiles%\Microsoft VS Code\Code.exe" (
%GIT% config --local difftool.vscode.path "%ProgramFiles%\Microsoft VS Code\Code.exe"
%GIT% config --local difftool.vscode.cmd "%ProgramFiles%\Microsoft VS Code\Code.exe --wait --diff $LOCAL $REMOTE"
%GIT% config --local mergetool.vscode.path "%ProgramFiles%\Microsoft VS Code\Code.exe"
%GIT% config --local mergetool.vscode.cmd "%ProgramFiles%\Programs\Microsoft VS Code\Code.exe --wait $MERGED"
)
if exist "%LOCALAPPDATA%\Programs\Microsoft VS Code\Code.exe" (
%GIT% config --local difftool.vscode.path "%LOCALAPPDATA%\Programs\Microsoft VS Code\Code.exe"
%GIT% config --local difftool.vscode.cmd "%LOCALAPPDATA%\Programs\Microsoft VS Code\Code.exe --wait --diff $LOCAL $REMOTE"
%GIT% config --local mergetool.vscode.path "%LOCALAPPDATA%\Programs\Microsoft VS Code\Code.exe"
%GIT% config --local mergetool.vscode.cmd "%LOCALAPPDATA%\Programs\Microsoft VS Code\Code.exe --wait $MERGED"
)

REM setting anonymous name and email if not configured by user
for /f %%i in ('git config --get user.email') do set GitUserEmail=%%i

if [%GitUserEmail%] == [] (
%GIT% config --local user.email "[email protected]"
)

for /f %%i in ('git config --get user.name') do set GitUserName=%%i

if [%GitUserName%] == [] (
%GIT% config --local user.name "John Doe"
)

echo Configuration is done
pause
17 changes: 17 additions & 0 deletions branch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## S3. Манипуляции через ссылки, нет ссылки — в мусор
#### HEAD — текущая ссылка, tag — фиксированная ссылка, branch — движущаяся за HEAD ссылка
#### checkout — перемещение на ветку или коммит, reset — перемещение с веткой на коммит
#### Видно то, на что есть ссылки, остальное — мусор
- `git tag` — вывести список тегов
- `git tag <tagname>` — создать тег
- `git branch` — вывести список локальных веток
- `git branch -av` — вывести список локальных и удаленных веток
- `git branch <branchname>` — создать ветку
- `git branch -d <branchname>` — удалить ветку
- `git checkout <commit>` или `git switch --detach <commit>` — переместить HEAD на коммит, причем получится detached HEAD
- `git checkout <branch>`или `git switch <branch>` — переместить HEAD на ветку
- `git checkout -b <new_branch>` или `git switch -c <new_branch>` — создать ветку и перейти на нее
- `git reset --hard <commit>` — переместить HEAD и текущую ветку на `<commit>`
- `git reflog show <ref>` — показать лог действий со ссылкой
- `git reflog` = `git reflog show HEAD` — показать лог действий с HEAD
- `git gc` — удалить ненужные файлы и оптимизировать локальный репозиторий
14 changes: 14 additions & 0 deletions commit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
## S2. Хранятся состояния директории, постепенная сборка коммита
#### Хранятся файлы, разница вычисляется на лету
#### Commit index для сборки коммита
- `git add .` — добавить все измененные файлы в индекс
- `git commit -m <msg>` — записать изменения из индекса в репозиторий
- `git status -sb` — вывести состояние директории и индекса кратко с указанием текущей ветки
- `git restore .` или `git checkout .` — отменить изменения в директории по индексу
- `git restore -S .` или `git reset .` — отменить изменения индекса по коммиту (отмена `git add .`)
- `git rm <filename>` — удалить файл из индекса, чтобы перестать хранить его историю в репозитории
- `git show <commit>` — показать содержимое коммита
- `git log --oneline --decorate --graph` — вывести историю коммитов от HEAD в виде дерева
- `git log --oneline --decorate --graph --all` — вывести историю всех коммитов в виде дерева
- `gitk` — открыть графическое представление репозитория
- `git clean` — удалить неотслеживаемые файлы из директории
5 changes: 5 additions & 0 deletions fetch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
## R1. Доступен fetch коммитов любого репозитория в любой момент
- `git remote -v` — вывести список удаленных репозиториев с их адресами
- `git remote add <name> <url>` — добавить удаленный репозиторий с URL и дать ему указанное имя
- `git fetch` = `git fetch origin` — получить содержимое основного удаленного репозитория
- `git fetch --all` — получить содержимое всех удаленных репозиториев из списка
28 changes: 28 additions & 0 deletions help.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
## H1. Гибкое конфигурирование и качественная документация
### Гибкая настройка под любой процесс
- `git config -e --system` — редактировать настройки системы
- `git config -e --global` — редактировать настройки пользователя
- `git config -e` — редактировать настройки репозитория
- `git config --global user.name "<name>"` — задать имя пользователя
- `git config --global user.email "<email>"` — задать почту пользователя

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

### Алиасы для краткости команд
- `git config --global alias.it "!git init && git commit -m 'Initial commit' --allow-empty"`
- `git config --global alias.st "status -sb"`
- `git config --global alias.call "!git add . && git commit -m"`
- `git config --global alias.commend "commit --amend --no-edit"`
- `git config --global alias.graph "log --oneline --decorate --graph --all"`
- `git config --global alias.to "checkout"`
- `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.pure "pull --rebase --autostash"`
- `git config --global alias.undo "reset --soft HEAD^"`

### Надо игнорировать все, кроме исходников
https://github.com/github/gitignore — .gitignore для разных языков
91 changes: 91 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs@2/webcomponents-loader.min.js"></script>
<script type="module" src="https://cdn.jsdelivr.net/gh/zerodevx/zero-md@1/src/zero-md.min.js"></script>
<script>
window.ZeroMd = {
config: {
cssUrls: [
'/styles/marked.css',
'/styles/prism.css'
]
}
};
</script>
<style>

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

.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;
height: 40px;
text-align: center;
margin-top: 0px;
margin-bottom: 10px;
}

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

.page {
display: flex;
justify-content: space-between;
page-break-after: always;
margin: 30px;
}

.page .leftColumn {
margin: 0px 30px 0px 0px;
width: 100%;
}

.page .rightColumn {
margin: 0px 0px 0px 30px;
width: 100%;
}

.page .block {
margin: 10px;
width: 100%;
}
</style>
</head>
<body>
<div class="page">
<div class="leftColumn">
<div class="header"><a href="https://github.com/kontur-courses/git">https://github.com/kontur-courses/git</a></div>
<div class="block"><zero-md src="./help.md"/></div>
</div>
<div class="rightColumn">
<h1>Принципы Git</h1>
<div class="block"><zero-md src="./init.md"/></div>
<div class="block"><zero-md src="./commit.md"/></div>
<div class="block"><zero-md src="./branch.md"/></div>
</div>
</div>
<div class="page">
<div class="leftColumn">
<div class="block"><zero-md src="./merge.md"/></div>
<div class="block"><zero-md src="./rebase.md"/></div>
<div class="block"><zero-md src="./reset.md"/></div>
</div>
<div class="rightColumn">
<div class="block"><zero-md src="./fetch.md"/></div>
<div class="block"><zero-md src="./push.md"/></div>
<div class="block"><zero-md src="./upstream.md"/></div>
</div>
</div>
</body>
</html>
4 changes: 4 additions & 0 deletions init.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
## S1. Все локально
#### Все данные хранятся в локальных репозиториях, изменения между ними можно синхронизировать
- `git init` — создать пустой репозиторий
- `git clone <url>` — склонировать репозиторий в новую директорию
6 changes: 6 additions & 0 deletions merge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
## A1. Трехсторонний merge в три шага
#### Два состояния можно объединить через merge, mergetool и commit
#### Участвуют три стороны: current, incoming и base
- `git merge <commit>` — объединить текущую ветку с другой
- `git mergetool` — разрешить имеющиеся конфликты
- `git merge --abort` — отменить слияние
9 changes: 9 additions & 0 deletions push.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## R2. Удаленное изменение — это push
- `git push <remote> <local_branch>:<remote_branch>` — добавить изменения из локальной ветки `<local_branch>` и переместить ветку `<remote_branch>` удаленного репозитория
- `git push` = `git push origin HEAD` — добавить изменения из текущей локальной ветки и переместить соответствующую ветку удаленного репозитория
- `git push -f` — выполнить `push`, даже если удаленная ветка уже не является предком
- `git push --force-with-lease` — выполнить `push`, если является предком или удаленная ветка не сдвигалась (использовать вместо предыдущей команды)
- `git push <remote> -d <branch|tag>` — удалить ветку или тег в удаленном репозитории
- `git push <remote> tag <tag>` — отправить тег в удаленный репозиторий
- `git push <remote> --tags` — отправить все локальные теги в удаленный репозиторий
- `git push --mirror` — выполнить агрессивный `push` для всех тегов, веток и HEAD, подходит для создания удаленной копии локального репозитория
8 changes: 8 additions & 0 deletions rebase.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
## A2. rebase, cherry-pick и amend, чтобы пересоздать историю
#### Нельзя переписать историю — можно создать новую
- `git commit --amend --no-edit` — заменить последний коммит ветки на отредактированный с дополнительными изменениями без изменения сообщения
- `git rebase <upstream>` — применить все коммиты от общего родителя до текущего к `<upstream>`
- `git rebase -i <upstream>` — применить заново все коммиты, указав действие с каждым коммитом
- `git rebase --continue` — продолжить rebase после разрешения конфликтов
- `git rebase --abort` — отменить rabase
- `git cherry-pick <commit>` — применить указанный коммит к HEAD
15 changes: 15 additions & 0 deletions reset.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
## A3. stash, reset, revert для управления изменениями
#### Изменения можно временно припрятать
#### Можно получить разницу между любыми коммитами
#### Коммит можно отменить другим коммитом
- `git stash` — сохранить все модифицированные файлы в виде набора изменений
- `git stash pop` — восстановить последний сохраненный набор изменений и удалить его из списка
- `git stash list` — показать список сохраненных наборов изменений
- `git reset --hard <commit>` — переместить текущую ветку на `<commit>`, задать индекс и директорию согласно коммиту, устранив всю разницу
- `git reset --mixed <commit>` — переместить текущую ветку на `<commit>`, задать индекс согласно коммиту, оставить разницу между исходным и новым состоянием в директории
- `git reset --soft <commit>` — переместить текущую ветку на `<commit>`, не задавать индекс и директорию согласно коммиту, а оставить разницу между исходным и новым состоянием в индексе и директории
- `git reset --hard HEAD~1` — отменить последний коммит
- `git revert <commit>` — создать коммит, отменяющий изменения из коммита
- `git diff <from_commit> [<to_commit>]` — вывести разницу между двумя коммитами
- `git diff --name-status <from_commit> [<to_commit>]` — список измененных файлов
- `git difftool <from_commit> [<to_commit>]` - вывести разницу с помощью difftool из настроек
3 changes: 3 additions & 0 deletions run.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
start npx http-server
timeout 10
start http://127.0.0.1:8080/index.html
Loading