Це є вільний переклад цієї статті
Як перевірити GIT конфігурацію:
Команда нижче, поверне список, що містить інфрмацію про вас (user name, email):
git config -l
Як додати ім'я користувача Git:
git config --global user.name ""Fabio""
Як додати email користувача Git:
git config --global user.email ""signups@fabiopacifici.com""
Як запам'ятати ваші Git логін / пароль:
Це занотує ваші креденшиалси до кешу, щоб не вводити їх кожного разу. Просто виконайте команду:
git config --global credential.helper cache
Створити новий Git репозиторій:
Якщо Ви починаєте новий проект, то завжди виконуєте у корені проєкту:
git init
Якщо необхідно створити ""голий"" репозіторій, то треба виконати
git init --bare /path/to/bare/repo.git
Щоб відповісти на ваші подальші запитання, голі репозиторії (за визначенням) не мають робочого дерева, тому ви не можете легко додавати файли до них, як у звичайному не-голому репозиторії (наприклад, за допомогою git add і подальшої git commit).
Майже завжди ви оновлюєте ""голий"" репозиторій шляхом push до нього з іншого репозиторію.
Як додати файл в Git staging:
Команда нижче, додає файл в staging.
git add filename_here
Додати всі файли до Git staging
Якщо потрібно додати всі файли, що було змінено, використайте маску для файлів.
git add .
... або
git add fil*
Перевірка статуса репозиторія в Git:
git status
Комміт в Git:
Ця команда відкриє ваш текстовий редактор за замовчуванням, куди необхідно додати коментар до вашого коміту.
git commit
Можливо додати комментар прямо разом з командою коміта.
git commit -m ""your commit message here""
Можливо додати файли та коментар однією командою (за допомогою ключів -а то -m)
git commit -a -m ""your commit message here""
Як переглянути історію комітів в Git:
git log
... разом з інформацією про зміни:
git log -p
... або в 1 рядок
git log --oneline origin/master -3
Тут цікаво, що ми побачимо 3 останні коміти, з
origin/master, тобто з серверної гілки!
Лог комітів у графічному вигляді в GIT:
git log --graph --oneline
Ключ
--graph, и ключ--oneline, щоб виводити коміт коменти одним рядком.
Графік комітів для усіх бранчів в Git:
git log --graph --oneline --all
Перегляд статистики у логох Git:
git log --stat
Команда показує розгорнутий лог, включаючи інформацію про рядки та імена файлів.
I тепер шнформація за конкретним комітом
git show commit-id-hash
Як подивитись diff між файлами у різних бранчах
git diff branch1:full/path/to/foo.txt branch2:full/path/to/foo-another.txt
Або з відносним шляхом
git diff branch1:./relative/path/to/foo.txt branch2:./relative/path/to/foo-another.txt
Як переглянути зміни до їх фіксації. Команда ""diff"" в Git:
Можна додати ім'я файлу, якщо ви маєте намір побачити зміни у окремому файлі. git diff ігнорує зміни у файлах, що було сховано (staged)
Додайте --staged флаг , щоб бачити всі зміни.
git diff
git diff all_checks.py
git diff --staged
Клонуємо репозиторій
Я полюбляю доступ за допомогою ключів SSH. Але виникає те саме "АЛЕ", коли потрібно клонувати репозиторій, доступ до нього (репозиторію) маємо через ssh key, але додати цей ключ до конфігу репозиторія не маємо можливості. Репозиторій ми ще тільки маємо клонувати.
Magic command:
git clone -c "core.sshCommand=ssh -i ~/.ssh/id_rsa_example -F /dev/null" git@github.com:example/example.git
Профіт!
Додавання змін за допомогою ""git add -p"":
Команда запитає чи бажаємо ми прийняти кожну зміну.
git add -p
Видалити файл в GIT:
git rm filename
Зміна назви файлу в Git:
git mv oldfile newfile
Як ігнорувати окремі файли в Git:
Потрібно створити файл .gitignore та додати його до комміту.
Відкат змін у файлі:
git checkout filename
Як відмінити зміни, якщо файл було вже додано до staged в Git:
** Використовуйте флаг
-pщоб ""відкотити тільки потрібні зміни.
git reset HEAD filename
git reset HEAD -p
Заміна останнього коміту в GIT:
git commit --amend дозволяє міняти та додавати останній коміт
git commit --amend
Note: Зміни в локальному коміті - це добре, і ви можете це робити до того, як додали коміт до спільного репозиторію. Але не треба цього робити, якщо коміт було опубліковано.
Откат останнього в Git:
git revert додасть новий коміт, що є ""протилежним"" перед ним.
Але користуйтесь обережно.
git revert HEAD
Авжеж, можна використовувати
commit_idзамістьHEAD. Ця команда відкриє редактор, щоб Ви написали підстави для відкату.
git revert comit_id_here
Створюємо новий бранч в Git:
За замовчуванням GIT завжди створює один бранч. Ця команда створить новий. GIT автоматично активує новий бранч.
git branch branch_name
Як зробити активним інший бранч в Git:
git checkout branch_name
Перелік бранчей в Git:
Щоб отримати перелік використовуйте git branch . Це Буде показано список усіх локальніх бранчів. Активний буде позначено ""*"". Щоб отримати взагалі весь перелік, додайте ключ -a.
git branch
git branch -a
Новий бранч та його активація однією командою:
git checkout -b branch_name
Видалення бранча в Git:
git branch -d branch_name
Як мержити два бранча в Git:
git merge branch_name
Ця команда виконає мерж бранча
branch_nameдо локального активного мержу
Не продовжувати кофліктний мерж Git:
Якщо Ви маєте відмовитися від мержу і почати заново, тоді виконуємо:
git merge --abort
Додати репо в Git
Ця команда додає віддалене сховище до вашого локального сховища (просто замініть https://repo_here на URL-адресу вашого віддаленого сховища).
git remote add <branch_name> https://repo_here
Як побачити URLs в Git:
git remote -v
Більше інформаціі про remote repo in Git:
Замініть origin (що є ім'ям за замовчуванням) на те, що бачили результатом попередньої команди.
git remote show origin
Публікація змін на сервері Git:
git push
Отримати зміни активного бранча с сервера Git:
git pull
Перелік всіх бранчів з сервера GIT:
Команда покаже перелік усіх бранчів GIT-а поточного репозиторію:
git branch -r
Як одержати всі зміни с сервера Git:
Ця команда дозволяє одержати всю информацію з remote repository, але не виконує злиття з активним бранчем, як pull команда
git fetch
Як замержити віддалений бранч с локальним в GIT:
Ось команда, що виконає це для вас:
git merge origin/main
Публікація нового бранчу на сервер GIT:
Просто пам'ятайте, що -u це upstream:
git push -u origin branch_name
Видалити бранч на сервері в Git:
git push --delete origin branch_name_here
Як створити релиз і замержити його у окрему гілку
Припустимо, ваша поточна гілка — main (або інша робоча гілка).
Додайте опис змін, фіксів, нових фіч, що важливого відбулося з останнього релізу у файл CHANGELOG.md
Крок 1: Переконайтеся, що всі зміни зафіксовані
$ git status
$ git add .
$ git commit -m "Prepare for beta_v2 release"
Крок 2: Перейдіть на гілку releases
$ git checkout releases
Якщо гілки ще немає, створіть її:
git checkout -b releases
Крок 3: Оновіть гілку releases (якщо ви працюєте не один)
$ git pull origin releases
Крок 4: Змержіть вашу робочу гілку в releases
$ git merge main # Замініть main на назву вашої поточної гілки
Крок 5: Створіть анотований тег
$ git tag -a beta_v2 -m "Release version beta_v2: added notebook management and inline editing"
Використання
-a(annotated) краще за звичайний тег, бо воно зберігає дату, автора та опис.
Крок 6: Відправте зміни та теги на сервер
$ git push origin releases
$ git push origin beta_v2
# Або відправити всі теги відразу:
$ git push origin --tags
Як користуватись Git rebase:
git rebase branch_name_here
Git Rebase може стати Вашим нестерпним болем, якщо Ви будете використовувати його не належним чином. Тому, перед використанням, уважно читаєм here
Виконуємо rebase інтерактивно в Git:
Треба використати флаг -i. Це відкриє редактор з короткими підказками.
git rebase -i master
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like ""squash"", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
Як примусово виконати push до Git:
git push -f
GIT's Tips & Trick
Повна очистка історіі комітів
Основна ідеятака: треба перенести всю розробку до іншої гілки. У основній зафіксувати останній коміт. А потім можна видалити вже непотрібну гілку...
Поїхали:
$ git checkout --orphan temp_branch
--orphan- створює новий бранч уgit init-likeстилі
Додаємо файли
$ git add -A
$ git commit -am "The first commit"
Видаляємо master
$ git branch -D master
Зараз ми стоїмо на temp_branch, тому просто ьіняєьо йому ім'я
$ git branch -m master
Все, тепер запам'ятовуємо зміни на сервері
$ git push -f origin master
Перевірити, чи пов'язаний локальний репозиторій з репозиторіем на Git сервері:
git remote
покаже перелік псевдонимів. Наприклад:
origin
... далі можна дивитись URL:
git remote show origin
Робота с diff
Наприклад, маємо коміт із необхідними змінами, які треба додати до інших, аналогічних за структурою, репозиторіїв:
- Знаходимо перелік змін («diff»):
git log -n 1 -p хэш-коміта > /file/path
- Якщо зміни фіксувалися кількома комітами, можно додати число після -n, тоді до файлу буде записано всі зміни, що відбулися за вказане число комітів, починаючи з вказанного хешем
- Якщо комітів декілька, але вони йдуть не по порядку, просто додавайте ці коміти у хвіст файлу (уважно до знаку перенаправлення -
>>замість>):git log -n 1 -p хэш-другого-коммита >> /file/path
- Далі, актиивуємо католог іншого репозиторію:
cd /path/to/catalog
- та додаєм зміни з першого кроку:
git apply /file/path - Якщо виникли конфлікти, то розв'язуємо їх, додаємо коміт, і повторюємо кроки для інших реаозиторіїв.
Настройка SSH ключів
git config core.sshCommand ""ssh -i ~/.ssh/git_key""
git debug
Linux/MacOS
$ GIT_TRACE=true \
GIT_CURL_VERBOSE=true \
GIT_SSH_COMMAND=""ssh -vvv"" \
git clone git://host.xz/path/to/repo.git
Windows
C:\> set GIT_TRACE=true
C:\> set GIT_CURL_VERBOSE=true
C:\> set GIT_SSH_COMMAND=ssh -vvv
C:\> git clone git://host.xz/path/to/repo.git
Як працювати з субмодулями
-
Клонуемо інший репозиторій до катадлогу в якості субмодуля
git submodule add git://github.com/chneukirchen/rack.git rackInitialized empty Git repository in /opt/subtest/rack/.git/ remote: Counting objects: 3181, done. remote: Compressing objects: 100% (1534/1534), done. remote: Total 3181 (delta 1951), reused 2623 (delta 1603) Receiving objects: 100% (3181/3181), 675.42 KiB | 422 KiB/s, done. Resolving deltas: 100% (1951/1951), done. -
Переглянути фай конфігураціі .gitmodules, що відповідають за відповідність між URL та каталогом де було збережени субмодуль
cat .gitmodules[submodule ""rack""] path = rack url = git://github.com/chneukirchen/rack.git -
Ініціалізація локального файла конфігураціі .gitmodules
git submodule initSubmodule 'rack' (git://github.com/chneukirchen/rack.git) registered for path 'rack' -
Оновити субмодул:
git submodule update
Initialized empty Git repository in /opt/myproject/rack/.git/
remote: Counting objects: 3181, done.
remote: Compressing objects: 100% (1534/1534), done.
remote: Total 3181 (delta 1951), reused 2623 (delta 1603)
Receiving objects: 100% (3181/3181), 675.42 KiB | 173 KiB/s, done.
Resolving deltas: 100% (1951/1951), done.
Submodule path 'rack': checked out '08d709f78b8c5b0fbeb7821e37fa53e69afcf433'
- Якщо маємо рекурсивно вкладені модулі:
git submodule update --init --recursive
Submodule 'vendors' (https://github.com/project/project.git) registered for path 'vendors'
Cloning into '/home/colleague/submodules/vendors'...
Submodule path 'vendors': checked out '43d08138766b3592352c9d4cbeea9c9948537359'
- У деяких випадках ви не витягуєте підмодуль Git'а, а просто хочете оновити існуючий підмодуль Git'а в проекті.
Для того, щоб оновити існуючий підмодуль Git'а, вам потрібно виконати команду ""git submodule update"" з опцією ""-remote"" і ""-merge"".
git submodule update --remote --merge
Використовуючи команду ""-remote"", ви зможете оновлювати існуючі підмодулі Git'а без необхідності запускати команди ""git pull"" в кожному підмодулі вашого проекту.
При використанні цієї команди ваш відокремлений HEAD буде оновлений до найновішої фіксації в репозиторії підмодуля.
З огляду на приклад, який ми використовували раніше, при оновленні підмодуля ми б отримали наступний результат
Updating 43d0813..93360a2
Fast-forward
README.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
Submodule path 'vendors': merged in '93360a21dc79011ff632b68741ac0b9811b60526'
- Отримання нових комітів підмодулів
Щоб отримати нові комміти, зроблені в репозиторії підмодуля, перейдіть в папку вашого підмодуля і спочатку виконайте команду ""git fetch"" (ви отримаєте нові комміти підмодуля)
cd repository/submodule
git fetch
Тепер, якщо ви знову запустите команду ""git log"", ви зможете побачити нові комміти, які ви хочете інтегрувати.
git log --oneline origin/master -3
93360a2 (origin/master, origin/HEAD) Second commit
88db523 First commit
43d0813 (HEAD -> master) Initial commit
Тепер, для того, щоб ваш підмодуль відповідав останнім комітам, ви можете виконати команду ""git checkout"" і вказати SHA, до якого ви хочете оновити ваш підмодуль (в даному випадку 93360a2)
git checkout -q 93360a2
Чудово! Ваш HEAD тепер узгоджено з найновішими комітами з репозиторію підмодуля.
Тепер ви можете повернутися до основного сховища і зафіксувати ваші зміни, щоб інші розробники могли отримати ці нові комміти.
$ cd сховище
$ git add .
$ git commit -m ""Додано нові коміти з репозиторію підмодуля""
$ git push
Тепер, якщо ви знову запустите команду ""git log"", ви зможете побачити нові комміти, які ви хтіли інтегрувати.
- Видалення підмодулів Git'а
Для того, щоб видалити підмодуль Git'а зі сховища, скористайтеся командою git submodule deinit, а потім командою git rm і вкажіть ім'я папки підмодуля.
$ git submodule deinit <субмодуль> ..."" to unstage)
new file: .gitmodules
new file:
Submodule changes to be committed:
* 0000000...ae14a2 (1):
> Change submodule name
- Детальний diff для підмодулів
Для того, щоб команда git diff мала детальну інформацію про ваші підмодулі, використовуйте команду git config з параметром diff.submodule, встановленим в true.
$ git config --global diff.submodule log
Тепер при виконанні команди git diff ви зможете бачити коміти, які були зроблені в папці submodules.
$ git diff
Submodule 0000000...ae14a2:
> Submodule commit n°1
> Submodule commit n°2
Як відокремити бранч у окремий репозіторій
Буває так, що Ви розумієте, проєкт потребує відокремлення якогось функціоналу. Або, як було у мене, те, що починалось як один універсальний сайт, тепер є двома окремими сайтами на окремих хостах, та ще і їх функціонал все далі і далі не співпадає. Виникає нагальна потреба ""видалити"" гілку (або якийсь фіксований стан) у окремий репозиторій.
План такий (Універсальний. Переміщення разом з гілками, тегами та історією комітів):
-
Перейдіть до каталогу, в якому ви хочете створити новий репозиторій
cd repository_B -
Клонуйте оригінальний репозиторій до теки, названої на честь нового репозиторію.
git clone path/repositiry_A.git . -
відфільтруйте та збережіть лише коміти та гілки для задіяні у repository_B за допомогою команди git filter-branch.
git filter-branch --prune-empty YOUR_BRANCH_NAME -- --allgit filter-branchдуже руйнівна функція. НІКОЛИ не виконуйте це у основному репозіторіїї, не маючи бекапа. Вас попереджено!Ви можете або вирішити зберегти всі гілки і мітки за допомогою
-all, або вказати назву гілки на цьому місці. -
Встановіть remote для поточної теки в якості нового сховища
git remote set-url origin path/repository_B.GITЦей репозиторій повинен вже існувати, або створіть його зараз
-
Перевірте віддалений репозиторій
git remote -v -
Перенесіть зміни на сервер
git push -u origin --all