Вместо TAB надо использовать 4 пробела.
Строки должны завершаться как в UNIX.
Содержимое ~/.gitattributes
:
*.c filter=treatspaces *.txt filter=treatspaces *.py filter=treatspaces *.html filter=treatspaces *.css filter=treatspaces *.js filter=treatspaces
Настройка атрибутов в ~/.gitconfig
:
[core] attributesfile = /home/rad/.gitattributes [filter "treatspaces"] smudge = expand -t4 clean = expand -t4
Тут надо указать своё имя и электронную почту:
[user] name = Ruslan Popov email = [email protected] [gui] encoding = utf-8 [alias] visual = gitk last = log -1 HEAD st = status # git unstage - убрать всё из индекса (чтобы например добавить/закоммитить сначала что-то другое) unstage = reset HEAD -- up = !(git add . && git stash && git pull --rebase >&2) | grep -v \"No local changes to save\" && git stash pop # git in / git out — смотреть какие коммиты придут/уйдут перед выполнением pull/push in = "!git remote update -p; git log ..@{u}" out = log @{u}.. # git addremove - добавить в индекс новые файлы/изменения и удалить всё что удалилось addremove = !git add . && git ls-files --deleted | xargs --no-run-if-empty git rm # git backup - заархивировать весь локальный репозиторий перед экспериментированием backup = !file=../`git describe`.tar && echo \"Creating `readlink -f $file`\" && tar cf $file . ci = commit co = checkout br = branch bra = branch -a chp = cherry-pick bl = blame -b -w cia = commit --amend lg = log --pretty=format:'%h was %an, %ar, message: %s' --graph who = shortlog -s -- # Позволяет просматривать дерево коммитов в очень удобном виде. gr = "log --all --graph --pretty=format:'%Cred%h%Creset%x09%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative" gha = "log --graph --date=relative --all --topo-order --pretty=format:'%C(cyan)[%an]%Creset %C(green bold)%d%Creset %C(yellow)%h%Creset : %s %C(cyan)[%ad]%Creset'" [core] attributesfile = /home/rad/.gitattributes #[filter "treatspaces"] # smudge = expand -t4 # clean = expand -t4 [color] ui = true
Коммит -- набор изменений в коде проекта, который описывает решённую задачу или блок этой задачи. Крайне нежелательно смешивать несколько задач в одном коммите. Лучше разбейте их на несколько коммитов. Если задача непростая, то желательно разбить её на блоки.
Перед коммитом всегда смотреть, что коммитится с помощью:
git diff
Добавьте файлы в будущий коммит:
git add FILE1 FILE2 ... FILEN
Проверьте, что всё правильно:
git st
Если добавили лишний файл, то его можно убрать из будущего коммита:
git unstage FILE
Добавление части файла в будущий коммит:
git add -ip FILE
дальше надо будет подтвердить поблочно изменения в этом файле. Все неподтверждённые изменения не будут включены в будущий коммит. Если команда не сможет автоматически разделить изменения кода на блоки, то это можно сделать в ручном режиме, присмотритесь к подсказкам на экране.
Формат комментария к коммиту:
git ci -m "Re #NNN: COMMENT."
где NNN
-- номер бага в трекере, COMMENT
-- текст комментария.
Посмотреть журнал коммитов:
git log
Посмотреть подробный журнал коммитов с информацией о ветках:
git gha
Если вы сделали коммит, но забыли добавить в него пару файликов, то их надо добавить в будущий коммит и объединить новый коммит с последним:
git add FILE1 FILE2 git cia
откроется информация последнего коммита, просто сохраните её и файлы будут добавлены в предыдущий коммит.
Если вы сделали коммит, но решили, что он плохой. Правда не настолько, чтобы выбросить сделанные вами изменения. Подсмотрите идентификатор последнего правильного коммита и сделайте мягкий сброс:
git gha git reset --soft COMMIT
где COMMIT
-- идентификатор последнего правильного коммита. Коммит
исчезнет из истории, но все его изменения останутся в коде.
Если же коммит был настолько еретичным, что его надо уничтожить, то можно сделать жёсткий сброс:
git gha git reset --hard СOMMIT
Тут всё аналогично, только изменения в коде будут тоже уничтожены.
После того, как коммиты были отправлены в удалённый репозиторий все ваши косяки становятся достоянием истории и отменять коммиты надо так:
git revert COMMIT
где COMMIT
-- идентификатор коммита, который надо отменить. Будет
создан коммит, который выполнит отмену изменений.
Работа ведётся в ветках.
Получить список локальных веток:
git br
Получить список всех веток, включая ветки удалённого репозитория:
git br -a
Создать новую локальную ветку:
git br BRANCH [идентификатор_коммита или имя ветки удалённого репозитория]
Создать и перейти на новую локальную ветку:
git co -b BRANCH [идентификатор_коммита или имя ветки удалённого репозитория]
Перейти на нужную ветку:
git co BRANCH
Как видно, ветку можно создать из любого коммита, тега или другой ветки.
Получить данные из ветки удалённого репозитория и отправить их обратно:
git pull origin BRANCH git push origin BRANCH
Обратите внимание на то, что работа идёт с текущей веткой. Т.е. если
текущей веткой является branch_a
, а вы делаете pull из ветки
branch_b
, то git попытается сделать их объединение в вашей текущей
ветке. Будьте внимательны!
Удаление локальной ветки:
git br -d BRANCH
Удаление ветки удалённого репозитория:
git push origin --delete BRANCH git push origin :BRANCH
Первая команда работает, начиная с версии 1.7. Вторая команда работает до версии 1.7, обратите внимание на двоеточие перед именем ветки, так обозначалась операция удаления ветки.
Копирование коммита из указанной ветки в текущую:
git chp COMMIT
где COMMIT
-- идентификатор коммита из другой ветки.
Объединение текущей ветки с другой веткой:
git merge BRANCH
При возникновении конфликтов, надо их разрешить. Для этого смотрите
git st
, отредактируйте конфликтные файлы и сделайте коммит с
исправлениями:
git ci -m "merge"