![[GIT_шпаргалка.jpg]] ```sh ## Команды для работы с `.gitignore` bash # Проверить, какие файлы игнорируются git status --ignored # Проверить, почему файл игнорируется git check-ignore -v config.h # Удалить файл из индекса Git (но оставить на диске) git rm --cached config.h # Добавить файл в .gitignore echo "config.h" >> .gitignore # Применить .gitignore к уже добавленным файлам git rm -r --cached . git add . git commit -m "Apply .gitignore" #======================================= sudo apt install git git config --global --edit git config --global user.name "Name_Name" git config --global user.email email@example.com git config --list # Создание "своего чистого" репозитория: git init --bare ~/git/RadSens.git git clone vlapa@178.20.46.157:~/git/...... # По умолчанию git clone загружает всю историю изменений, что может быть медленно и требовать много места. Если история не нужна, используйте: git clone --depth=1 git commit -a -m -m "text_commit" -a (заменяет git add) --amend - заменить/исправить последний commit git init git add . # добавить все файлы git commit -m "first commit" git branch -M main git remote add origin vlapa@178.20.46.157:~/git/...... git push -u origin main git remote set-url origin new.git.url/here git@89.110.92.137:/home/git/my/esp8266/8266-clock_ws2812.git ====================== ======= FLENOV ======= ====================== git checkout -b имяветки база # git checkout говорит, что мы должны переключиться на репозиторий. Ключик -b говорит, что нужно не просто переключиться, а создать новую ветку с именем =имяветки=. # После имени бренча через пробел идет база - по документации необязательный параметр - от какой ветки вы хотите создать свою. Я рекомендую всегда указывать этот параметр. Если вы не укажите базу, то в качестве нее будет выступать текущая ветка. Чаще всего ветки нужно создавать от основной master, а не от текущей. Если только вы явно не хотите создать свою ветку от какой-то другой, команда создания будет git checkout -b имяветки origin/master # Стоп, еще немного о именовании. В данном случае я указываю origin/master и это удаленный ствол. На это указывает слово origin. Если мы создаем новую ветку fixdone/345321, то это локальная копия на нашем диске. Удаленная копия на сервере git в репозитории будет иметь имя origin/fixdone/345321. Когда мы создаем новые ветки, то желательно создавать от удаленной версии master, но у нас ее пока нет, поэтому если попытаться выполнить такую команду, то она завершиться ошибкой. # Да, я рекомендую всегда использовать в качестве базы удаленную версию origin/master, которая указывает на версию на сервере, но если ее нет, то придется использовать локальную – просто master. Мы пока создали только локальный репозиторий. Пока нет удаленного, придется использовать локальный. Как только появиться удаленный, всегда используйте его. О удаленных ветках мы поговорим в следующий раз. # Итак, пока нет удаленного мастера, давайте создадим новую ветку от локального: git checkout -b initialwork master # Я назвал ветку initialwork. В результате выполнения команды вы должны увидеть что-то типа: Switched to a new branch 'initialwork' # Теперь мы находимся в ветке, где мы можем исправлять баг или работать над новым функционалом. Давайте создадим файл index.html. Вы можете воспользоваться для этого любым текстовым редактором. git add i* # все файлы начинающиеся с =i= git add -u # все измененные файлы git checkout master git merge initialwork git branch # отображает все ветки созданные локально -M # переименовать ветку -a # все ветки: локальные и удаленные echo "# demo" >> README.md git init git add README.md git commit -m "first commit" # git branch -M main git remote add origin vlapa@178.20.46.157:~/git/name.git git push -u origin master # main # Работа на другом компьютере: git clone vlapa@178.20.46.157:~/git/name.git # или: git init git remote add origin vlapa@178.20.46.157:~/git/name.git # получить последние изменения: git fetch git checkout secondone # изменеяем файл, далее: git diff # file_name git add -u git commit -m "commit" git push origin secondone # теперь на сервере есть 2 ветки # на еще одном компьютере: git checkout -b origin/secondone git merge origin/secondone ============== git show git commit --amend # дополнение и изменение коммита git commit --amend -m "новое название" # переименовать git checkout file_name # откатить последние изменения git reset --hard # сбросить все последние изменения git status # untracked - неотслеживаемый # modified - в рабочей директории есть более новая версия по сравнению с хранящейся в HEAD или в области подготовленных файлов (изменения не находятся в следующем коммите). # staget - в рабочей директории и области подготовленных файлов есть более новая версия по сравнению с хранящейся в HEAD (готов к коммиту). # Без изменений — одна версия файла во всех разделах, т. е. в последнем коммите содержится актуальная версия. # Файл может быть одновременно в состоянии «изменён» и «подготовлен», если версия в рабочей директории новее, чем в области подготовленных файлов, которая в свою очередь новее версии в HEAD. # Мы можем использовать опцию -s для команды git status, чтобы получить более компактный вывод (по строке на файл). # Если файл не отслеживается, то будет выведено ??; если он был изменён, то его имя будет красным, а если подготовлен — зелёным. # Чтобы посмотреть сами изменения, а не изменённые файлы, можно использовать следующие команды: git diff  # — посмотреть что добавилось или сравнение рабочей директории с областью подготовленных файлов; git diff --staged # — сравнение области подготовленных файлов с HEAD. # Если использовать аргумент <файл/папка>, то diff покажет изменения только для указанных файлов/папок, например git diff src/. .gitignore # Чтобы отметить файлы, которые мы хотим игнорировать, можно использовать шаблоны поиска (считайте их упрощёнными регулярными выражениями): # /... — позволяет избежать рекурсивности — соответствует файлам только в текущей директории; # .../ — соответствует всем файлам в указанной директории; # *... — соответствует всем файлам с указанным окончанием; # ! — игнорирование файлов, попадающих под указанный шаблон; # [...] — соответствует любому символу из указанных в квадратных скобках; # ? — соответствует любому символу; # /**/ — соответствует вложенным директориям, например a/**/d соответствует a/d, a/b/d, a/b/c/d и т. д. # Мы даже можем использовать шаблоны поиска при указании файла/папки в других командах. Например:  git add src/*.css # добавит все файлы .css в папке src. git log # - можно передать разные опции: --oneline # короткий лог -p # показывает изменения в каждом коммите; --stat # показывает сокращённую статистику для коммитов, например изменённые файлы и количество добавленных/удалённых строк в каждом их них; -n # показывает n последних коммитов; --since=___ и --until=___ # позволяет отфильтровать коммиты по промежутку времени, например --since="2019-01-01" покажет коммиты с 1 января 2019 года; --pretty # позволяет указать формат логов (например, --pretty=oneline), также можно использовать --pretty=format для большей кастомизации, например --pretty=format:"%h %s"; --grep и -S # фильтруют коммиты с сообщениями/изменениями кода, которые содержат указанную строку, например, git log -S имя_функции позволяет посмотреть добавление/удаление функции; --no-merges # пропускает коммиты со слиянием веток; ветка1..ветка2 # позволяет посмотреть, какие коммиты из ветки 2 не находятся в ветке 1 (полезно при слиянии веток). Например, `git log master..test` покажет, каких коммитов из ветки test нет в master (о ветках поговорим чуть позже). --left-right # ветка1...ветка2 показывает коммиты, которые есть либо в ветке 1, либо в ветке 2, но не в обеих; знак < обозначает коммиты из ветка1, а > — из ветка2. Обратите внимание: используется три точки, а не две; -L # принимает аргумент начало,конец:файл или :функция:файл и показывает историю изменений переданного набора строк или функции в файле. ``` # Свой GIT ```sh # Server: sudo apt install git sudo useradd git sudo passwd git ssh-keygen # - ??? mkdir repo1.git git init --bare git init --bare ~/git/repo1.git #------------------------ # Client: sudo apt install git ssh-copy-id git@server_adresses git config --global --edit git config --global user.name "Name_Name" git config --global _user.email email@example.com git config --global core.editor "vim" # устанавливаем редактор по умолчанию git config --list mkdir /home/user/repo1 cd /home/user/repo git init git add . git commit -m "commit1" git remote add origin git@addresses_server:/home/git/repo1.git git push -u origin master #------------------------- # Создаем свою ветку: git branch # смотрим ветку git branch -a # - смотрим все ветки git branch new_branch # - создаем ветку new_branch git checkout -b new_branch # - так тоже можно создать git checkout new_branch # - переключаемся на нее git diff # - посмотреть изменения git status vim .gitignore # добавляем в игнор все лишнее # .idea/ # .vscode/ # .pio git add . git commit -m "modified .gitignore" git reset HEAD # - убрать файл из индекса git push --set-upstream origin new_branch # установить ветку new_branch как origin # указывается только при первом PUSH git checkout # - переход на другой commit # Сливаемся: git checkout master # переключаемся на ветку master git checkout -b new-branch # создаём новую ветку git merge new_branch # сливаемся: master/new_branch git branch -d new_branch git branch -r git branch -d -r origin/new_branch git push --set-upstream origin new-branch # Удалить файл удаленно и локально: git branch -D new-branch # удаляем лишнюю ветку локально git rm 'file name' git rm -r 'folder name' git commit -m 'message' git push -u origin branch # Удалить файл только удаленно: git push --delete origin new-branch # удаляем ветку в репозитории git rm --cached 'file name' git rm -r 'folder name' git commit -m'message' git push -u origin branch #===================================== git fetch # - загружает коммиты, файлы и ссылки из удаленного репозитория в ваш локальный репозиторий. # Извлеките данные с помощью команды fetch, если хотите увидеть, над чем работают остальные. Эта команда похожа на команду `svn update` и позволяет увидеть прогресс в центральном репозитории, но при этом не вынуждает вас выполнять слияние изменений с вашим репозиторием. git pull # - слить локальную и удаленную версию на локальной машине (на самом деле представляет собой комбинацию двух других команд: git fetch и git merge) git log --oneline # короткий LOG git reset --... # -- soft HEAD~ - на 1 commit назад без удаления последних изменений # -- mixed HEAD~ - на 1 commit назад без удаления последних изменений и не внесенными предпоследними изменениями # -- hard HEAD~ - на 1 commit назад с удалением ВСЕХ последних изменений git rm file.name # - удаление и сразу git add . (если просто самому удалить файл из папки - то нужно самому git add .) git mv file.name new_file.name # - переименование и сразу git add . (если просто самому переименовать файл из папки - то нужно самому git add .) git restore file.name # - откат всех последних изменений до commit --staged # убирает файл из зоны индекса ```