Памятка по git
Справочник по репозиторию: всё, чем вы пользуетесь в блоке 3, на одной странице. Центра — общего сервера, куда работу отправляют, — в блоке 3 нет: репозиторий живёт на вашей машине. Обмен с сервером будет в блоке 8.
Зачем это на контрольной
Репозиторий даёт три вещи, без которых разбиение на функции — хождение по канату без страховки:
- точка возврата. Вынесли функцию, вывод изменился, где сломалось — непонятно.
git diffпокажет всё, что вы поменяли с последнего коммита, а при совсем неудачной правке коммит даёт, куда откатиться. - история шагов.
git log --onelineпосле дня работы показывает, из каких шагов сложилось решение. Это же увидит любой, кто будет разбираться в вашем коде — включая вас через месяц. - привычка. Вне курса коммит — обязательная часть работы, как сохранение файла.
Настройка подписи — один раз
Каждый коммит подписан именем и почтой. Это просто текст в истории, никакой регистрации где-либо:
stagiaire@lab:~$ git config --global user.name "Ivan Petrov"
stagiaire@lab:~$ git config --global user.email "ivan@example.org"Без этого первый же коммит отвечает так:
Author identity unknown
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'stagiaire@lab.(none)')Пять команд
| Команда | Что делает |
|---|---|
git init |
сделать текущий каталог репозиторием; один раз на каталог |
git status |
что изменено, что добавлено к коммиту, что git вообще не видит |
git diff |
построчно, что изменилось с прошлого коммита и ещё не добавлено |
git add . |
добавить к будущему коммиту всё из текущего каталога |
git commit -m "что сделали" |
записать добавленное в историю |
git log --oneline |
история: по строке на коммит |
Репозиторий дня
stagiaire@lab:~/gocourse/day15$ git init
Initialized empty Git repository in /home/stagiaire/gocourse/day15/.git/Одна строка — ради неё команду и запускали: рядом с файлами появился подкаталог .git, и каталог стал репозиторием. Первая ветка называется main — так велит настройка init.defaultBranch из дня 11. Ветки — блок 8, пока они не нужны.
Если git init вместо одной строки напечатал десяток строк со словом hint про имя ветки master, значит, эта настройка не сделана. Репозиторий всё равно создан, на работу дня это не влияет: ветка будет называться master, и дальше в выводах вместо main будет master. Настройка однократная, она есть в «Попробуйте сейчас» в конце страницы.
stagiaire@lab:~/gocourse/day15$ git status
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
main.go
nothing added to commit but untracked files present (use "git add" to track)Untracked files — файлы, о которых git ещё не знает. Короткая форма того же:
stagiaire@lab:~/gocourse/day15$ git status -s
?? main.go?? — git этот файл не отслеживает, M — отслеживает и файл изменён. Пустой ответ git status -s значит «всё записано, менять нечего».
stagiaire@lab:~/gocourse/day15$ git add .
stagiaire@lab:~/gocourse/day15$ git commit -m "стенд дня 15"
[main (root-commit) fbaad33] стенд дня 15
1 file changed, 1 insertion(+)
create mode 100644 main.gofbaad33 — короткое имя коммита; по нему к нему можно вернуться.
Что не коммитят
Собранные программы (go build -o prog .) в истории не нужны: они получаются из исходников и занимают место. Список того, что git должен не замечать, кладут в файл .gitignore в каталоге репозитория:
prog
*.test
before.txtПервая строка — та же, что в дне 11: собранную программу везде называем prog (go build -o prog .), и одного правила хватает на все задания. Строка — образец имени, * — любые символы. После этого git status про эти файлы молчит. before.txt — тот самый файл с прежним выводом из первой страницы: он нужен на время правки, а в истории ему не место.
Что именно я меняю
До git add изменения видит git diff:
stagiaire@lab:~/gocourse/day15$ git diff
diff --git a/main.go b/main.go
index 06ab7d0..9ef0695 100644
--- a/main.go
+++ b/main.go
@@ -1 +1,7 @@
package main
+
+import "fmt"
+
+func main() {
+ fmt.Println("склад")
+}Строки со знаком + добавлены, со знаком - — убраны, без знака — соседние, для опоры. После git add эти изменения из git diff уходят (он показывает только ещё не добавленное) — тогда их показывает git diff --staged.
Перед каждым коммитом стоит посмотреть git diff: в нём сразу видно и забытую отладочную печать, и случайно стёртую строку.
Ритм дня
Одна задача — один коммит. Сообщение пишут о том, что сделали, а не «правки»:
stagiaire@lab:~/gocourse/day15$ git log --oneline
2a407d9 kt3: вынес печать отчёта в функцию
0758f93 kt2: разбор числа с ошибкой
fbaad33 стенд дня 15В задаче 3 полезны коммиты помельче — по коммиту на каждую вынесенную функцию: если вывод изменился, видно, какой именно вынос это сделал.
Попробуйте сейчас: первый коммит дня.
Цель: в
~/gocourse/day15есть репозиторий, в нём два коммита, аgit status -sмолчит.1. Подпись — если ещё не настраивали (вместо имени и почты подставьте свои):
▶ Выполнитеgit config --global user.name "Ivan Petrov" git config --global user.email "ivan@example.org" git config --global init.defaultBranch mainТретья строка — та самая настройка имени первой ветки из дня 11: если
git initпечатал строкиhint:, её не хватало.2. Репозиторий и первый коммит:
▶ Выполнитеcd ~/gocourse/day15 git init git status -s git add . git commit -m "стенд дня 15"3. Создайте файл
.gitignoreв~/gocourse/day15— вот его содержимое целиком:✎ Наберите в файл.gitignoreprog *.test before.txtПотом посмотрите, что изменилось, и закоммитьте:
▶ Выполнитеgit status -s git diff git add . git commit -m "gitignore для собранных файлов" git log --oneline4. Дальше — коммит после каждой решённой задачи контрольной.
Готово, когда:
git log --onelineпечатает две строки,git status -sничего не печатает, а в отчётеcourse check 15зелёный пунктt_gitdiff. Пунктgitстанет зелёным, когда коммитов наберётся восемь.
Что может пойти не так
| Что видите | Что это значит | Что делать |
|---|---|---|
Author identity unknown |
не настроены имя и почта | git config --global user.name и user.email |
nothing to commit, working tree clean |
с прошлого коммита ничего не менялось | коммитить нечего — это не ошибка |
no changes added to commit (use "git add" and/or "git commit -a") |
забыли git add перед коммитом |
git add ., потом git commit -m "…" |
fatal: not a git repository (or any of the parent directories): .git |
вы не в каталоге репозитория или git init не делали |
cd ~/gocourse/day15, при необходимости git init |
Reinitialized existing Git repository |
git init во второй раз в том же каталоге |
ничего не сломалось, репозиторий прежний |
git init напечатал тринадцать строк hint: про имя ветки master |
настройка init.defaultBranch из дня 11 не сделана |
репозиторий создан, работать можно; чтобы впредь была одна строка — git config --global init.defaultBranch main |
git diff ничего не печатает, хотя файл правили |
изменения уже добавлены через git add |
git diff --staged |
в git status собранные программы: kt1/kt1, kt2/kt2 |
их собрали под другими именами, а правило в .gitignore одно — prog |
собирать как go build -o prog . или дописать имя в .gitignore |
пункт git красный: коммитов: 3, нужно от 8 |
коммит делается один раз в конце дня | коммит после каждой задачи, это и есть привычка |
Дальше: правила контрольной точки 3 — course next