День 15 · Контрольная точка 3: функции, тесты и репозиторий · страница 3 из 4

Памятка по git

Справочник по репозиторию: всё, чем вы пользуетесь в блоке 3, на одной странице. Центра — общего сервера, куда работу отправляют, — в блоке 3 нет: репозиторий живёт на вашей машине. Обмен с сервером будет в блоке 8.


Зачем это на контрольной

Репозиторий даёт три вещи, без которых разбиение на функции — хождение по канату без страховки:


Настройка подписи — один раз

Каждый коммит подписан именем и почтой. Это просто текст в истории, никакой регистрации где-либо:

Пример · только посмотреть, набирать не нужно
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.go

fbaad33 — короткое имя коммита; по нему к нему можно вернуться.


Что не коммитят

Собранные программы (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 — вот его содержимое целиком:

✎ Наберите в файл .gitignore
prog
*.test
before.txt

Потом посмотрите, что изменилось, и закоммитьте:

▶ Выполните
git status -s
git diff
git add .
git commit -m "gitignore для собранных файлов"
git log --oneline

4. Дальше — коммит после каждой решённой задачи контрольной.

Готово, когда: 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