Після того як провели початкові налашутвання 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 directorygit checkout -- filename
git checkout .
Відмінити всі зміни у теці
Видалити всі файли у т.ч. які не були додані командою git addgit clean-xdf
Відміняємо зміни в Staging Area(Index)
git reset -- filename
Відміняємо зміни в Local branchgit commit --ammend -m "MODIFY README"
якщо забули щось додати або змінити, то додаємо файл, і можемо перезаписати commit.git reset HEAD filename
– відміняє add для файлу, робить його unstagedgit reset HEAD^^
– відкотитись на ^ кількість комітів, а файли повертаємо в stagedgit reset HEAD~2
– відкотитись на ~2 кількість комітів, а файл повертаємо в stagedgit 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
створює гілку catgit checkout cat
перемкнутись на гілку catgit checkout v0.0.1
перемкнутись на коміт з міткою(tag) v0.0.1git checkout <commit hash>
перемкнутись на коміт з відповідним хешемgit checkout HEAD~4
перемкнутись на 4 коміти назад від HEADgit checkout -b admin
створює і перемикається на гілку admingit merge cat
вливаємо в ПОТОЧНУ гілку зміни з гілки catgit merge cat --no-ff
вливаємо в ПОТОЧНУ гілку зміни з гілки cat, але без fast-forwardgit branch -d cat
видаляє гілку catgit branch -D cat
видаляє гілку cat, незважаючи на те, що в ній існують не об’єднані зміни.
Об’єднання гілок можливо 2 способами
fast-forward merge – просто пеерміщаємо HEAD на інший коміт
non fast-forward – коли робимо інший коміт який містить зміни з 2 гілок
rebase –
виправлення комітів
щоб уникати конфліктів
- частіше робіть коміти
- не робіть зміни в пробілах, знаках табуляції тощо, бо для гіта це різні речі
- робіть 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>
перемістить всі коміти від останньої спільної точки в початок гілки що вказана в destinationgit 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 – допомога по конкретній команді