git_level1

Після того як провели початкові налашутвання git, Трохи розберемось в командах.
Як створити репозиторій, гілки, перемикання між гілками, відмінити “погані” зміни. Все це буде далі не перемикайтесь.

Створюємо репозиторій:
mkdir projectA
cd projectA
git init

В результаті буде створена прихована(все що починається з крапки в nix системах є прихованим) папка .git з пустим репозиторієм, де і зберігаються метадані.

При роботі з віддаленими репозиторіями(github тощо) буде зручніше створити перший commit через web-інтерфейс, а потім собі його clone і почати працювати, це дозволить зменшити кількість рухів на додаванні віддаленого репозиторію.

Додаємо перший файл:
touch README.txt
git add README.txt – файл переходит в состояние staged(как бы заставляем за ним следить)
Возможных вариантов добавления масса:
git add README.txt – добавляем один файл
git add README.txt LICENSE добавляем несколько файлов
git add -u . додаємо ЛИШЕ файли, що модифіковані
git add –all добавляет все измененные или новые файлы.
git add *.txt – добавляет все файлы из текущей папки с расширением txt.
git add docs/*.txt – добавляет все файлы из docs с расширением txt.
git add docs/ – добавляет все файлы из docs
git add “*.txt” – добавляет все файлы из всего проекта с расширением txt.

git commit -m “Add README.txt” – делаем наш первый коммит. Описание лучше делать в настоящем времени!
git commit -a -m “MODIFY README” -делаем коммит и автоматически делает add, для всех измененных файлов, новые файлы НЕ добавляет.

HEAD – вказівник, що позначає поточну робочу директорію. Може вказувати на різні гілки, теги і коміти з використанням git switch

git status – показує стан гілки, зміни з останнього коміту.

Відміняємо зміни в working directory
git checkout -- filename
git checkout . Відмінити всі зміни у теці
Видалити всі файли у т.ч. які не були додані командою git add
git clean-xdf


Відміняємо зміни в Staging Area(Index)
git reset -- filename

Відміняємо зміни в Local branch
git commit --ammend -m "MODIFY README" якщо забули щось додати або змінити, то додаємо файл, і можемо перезаписати commit.
git reset HEAD filename – відміняє add для файлу, робить його unstaged
git reset HEAD^^ – відкотитись на ^ кількість комітів, а файли повертаємо в staged
git reset HEAD~2 – відкотитись на ~2 кількість комітів, а файл повертаємо в staged
git reset --soft HEAD^ – Відміняємо останній коміт, переносимо HEAD на попередній коміт, всі файли як до коміта будуть в Index(Staged Area).
git reset --mixed HEAD^ Відміняємо останній коміт, переносимо HEAD на попередній коміт, всі файли як до коміта будуть в working directory.
git reset --hard HEAD^ – відміняє останній коміт і видаляє всі зміни!
git reset --hard HEAD^^ – відміняє 2 останні коміти і видаляє всі зміни!

Відміни в віддаленому репозиторії (git revert)
git revert 63b345 – створює дзеркальний коміт, що відміняє зміни коміту з вказаною хеш сумою(або тегом або HEAD)

Stash – тимчасове місце зберігання змін, якщо ми не хочемо робити коміт, наприклад бо фіча не готова, а негайно потрібно переключитись на іншу гілку, потрібно приховати наші поточні зміни
git stash save “description” сховати всі зміни
git stash list подивитись список того що приховано
git stash pop повернути приховані зміни, та видалити їх зі stash
git stash apply повернути приховані зміни, але залишити їх в stash
git stash drop очистити stash

Показати зміни, що входять в коміт
git show <commit hash>
git show -s --pretty=raw <commit hash> – виведення лише ключової інформації.
Приклад виведення

commit b8a5175a132264ef80f7fc51743ebed2ce868b38
tree e005e8fa1adf7a6e9a80ada0d93ecfb3a277a09c
parent 0d496276812efcb2e55db461fe7e11fc813b3aa6
author bos [email protected] 1659381719 +0300
committer bos [email protected] 1659381719 +0300
Deleted file from repository only

git log – история коммитов.
git log –pretty=oneline выводит историю коммитов, 1 коммит = 1 строка
git log –pretty=format:”%h %ad- %s [%an]” выводит историю коммитов, в определенном формате
git log –oneline -p показывает патчи между коммитами
git log –oneline –stat показывает сколько строк было изменено
git log –oneline –graph показывает в псевдографике историю втч ветки
git log –pretty=format:”%h %ad | %s%d [%an]” –graph –date=short
git log –until=1.minute.ago
git log –since=1.day.ago
git log –since=1.year.ago –until=1.hour.ago
git log –since=2016-01-01 –until=2016-11-01

git reflog логує зміни які відбулись в репозитарії, коміти, переходи з бренча на бренч, умовно кажучи журнал подій.

git diff – показывает историю не staged(контролируемых) файлов с последнего коммита.
git diff –staged показывает историю staged(контролируемых) файлов с последнего коммита.
git diff HEAD – тоже что и git diff
git diff HEAD^ – показывает разницу между текущим состоянием и предыдущим коммитом.
git diff HEAD^^ – показывает разницу между текущим состоянием и пред предыдущим коммитом.
git diff HEAD~4 показывает разницу между текущим состоянием и 4 коммитами ранее
git diff HEAD^ HEAD показывает разницу между предыдущим и текущим коммитом
git diff hash1 hash2 показывает разницу между коммитами с заданными хэшами
git diff master branchB показывает разницу между двумя ветками
git diff –since=2016-01-01 –until=2016-11-01 показывает разницу между состояниями с заданным временем

git blame app.py -показываем построчно кто добавил какую строку
git remote add origin https://myhub.com/ProjectA.git добавляем удаленный репозиторий.
количество репозиториев неограничено, мы можем например добавить тестовый репозиторий
git remote add anotherRepo https://myhub.ua/ProjectA.git
git remote -v смотрим информацию о удаленных репозиториях
git remote show origin смотрим информацию о ветках в удаленном репозитории
git remote rm repoName удаляем удаленный репозиторий
git remote prune origin удаляет локальную ветку,указывающую на ветку в удаленном репозитории


git push -u origin master – отправляем данные с нашего репозитория в удаленный
git push origin <branchname> – отправляем данные по конкретной ветке с нашего репозитория в удаленный
git push origin :branchB – удаляем ветку branchB с удаленного репозитория
git push –tags отправляем в удаленный репозиторий и наши метки
git push origin --all – відправляємо всі зміни в усіх гілках на віддалений репозиторій
git pull получаем данные с удаленного в наш репозиторий и синхронизируем их
git pull origin <branchname> – вытянуть с репозитория все изменения по ветк

git clone https://myhub.ua/projectB.git – создаст папку ProjectB и сделает там копию удаленного репозитория
git clone https://myhub.ua/projectB.git folderName- создаст папку folderName и сделает там копию удаленного репозитория

Працюємо з гілками

git branch відобразити список гілок
git branch -r відобразити список гілок у віддаленому репозиторії
git branch -f <main> <sha1> – встанове у примусовому порядку вказівник на гілку <main> в положення <sha1>
git branch cat створює гілку cat
git checkout cat перемкнутись на гілку cat
git checkout v0.0.1 перемкнутись на коміт з міткою(tag) v0.0.1
git checkout <commit hash> перемкнутись на коміт з відповідним хешем
git checkout HEAD~4 перемкнутись на 4 коміти назад від HEAD
git checkout -b admin створює і перемикається на гілку admin
git merge cat вливаємо в ПОТОЧНУ гілку зміни з гілки cat
git merge cat --no-ff вливаємо в ПОТОЧНУ гілку зміни з гілки cat, але без fast-forward
git branch -d cat видаляє гілку cat
git branch -D cat видаляє гілку cat, незважаючи на те, що в ній існують не об’єднані зміни.

Об’єднання гілок можливо 2 способами

fast-forward merge – просто пеерміщаємо HEAD на інший коміт
non fast-forward – коли робимо інший коміт який містить зміни з 2 гілок
rebase –

виправлення комітів

щоб уникати конфліктів

  1. частіше робіть коміти
  2. не робіть зміни в пробілах, знаках табуляції тощо, бо для гіта це різні речі
  3. робіть merge частіше

git tag -list відобразити список міток(tag), зазвичай використовуються для іменування версій, та для зручності перемикання між комітами по тегам, а не по хешам
git tag -a v0.0.3 -m “version 0.0.3”
git tag ver1 – встановити тег ver1 на поточний коміт
git tag ver1 <sha1> – встановити тег ver1 на коміт з вказаною хеш сумою
git push –tags відправити теги на віддалений репозиторій

git fetch – стянуть информацию с удаленного репозитория но не сливая ее с локальной

git rebase <destination> перемістить всі коміти від останньої спільної точки в початок гілки що вказана в destination
git rebase -i <destination> інтерактивний rebase
git rebase –skip пропускаем патч который вызвал конфликт
git rebase –continue если был конфликт, то запускаем эту команду после его исправления
git rebase –abort отменить объединение

git cherry-pick <sha1> <sha1> взяти якийсь коміт(коміти) на перенести його в поточну точку.

git rm README видаляє файл з диску
git rm --cached README git перестає слідкувати за файлом, але залишає його на диску

git help – допомога по командам
git help config – допомога по конкретній команді

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься.