learning:git
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
learning:git [26.01.2025 09:02] – [rebase вместо merge] viacheslav | learning:git [02.02.2025 07:32] (текущий) – [Получение изменений из общего репозитория] viacheslav | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== githowto.com ====== | ||
+ | |||
+ | ===== Первоначальная настройка ===== | ||
+ | <code bash> | ||
+ | # Кто автор коммитов в этом экземпляре гита - имя и адрес | ||
+ | git config --global user.name "Your Name" | ||
+ | git config --global user.email " | ||
+ | # Задать main веткой по умолчанию | ||
+ | git config --global init.defaultBranch main | ||
+ | # Корректно обрабатывать окончания строк (для Windows) | ||
+ | git config --global core.autocrlf true | ||
+ | git config --global core.safecrlf warn | ||
+ | </ | ||
+ | |||
+ | ===== Создание проекта ===== | ||
+ | <code bash> | ||
+ | # Создать новый репозиторий (можно уже после создания файлов проекта в каталоге) | ||
+ | git init # создастся подкаталог .git | ||
+ | # Добавить файл и закоммитить с комментарием | ||
+ | git add hello.html | ||
+ | git commit -m " | ||
+ | # Проверить состояние репозитория | ||
+ | git status | ||
+ | On branch main # Сейчас на ветке main | ||
+ | nothing to commit, working tree clean # Нет файлов, | ||
+ | # Переименовать master в main, если гит старый и команда, | ||
+ | git branch -m master main | ||
+ | </ | ||
+ | |||
+ | ===== Внесение изменений ===== | ||
+ | <code bash> | ||
+ | # Если что-то добавить в файл и посмотреть состояние репозитория: | ||
+ | git status | ||
+ | On branch main | ||
+ | Changes not staged for commit: | ||
+ | (use "git add < | ||
+ | (use "git restore < | ||
+ | modified: | ||
+ | |||
+ | no changes added to commit (use "git add" and/or "git commit -a") | ||
+ | # Можно откатить файл обратно | ||
+ | git restore hello.html | ||
+ | # А можно добавить его в коммит (проиндексировать) | ||
+ | git add hello.html | ||
+ | # После добавления статус показывает, | ||
+ | git status | ||
+ | On branch main | ||
+ | Changes to be committed: | ||
+ | (use "git restore --staged < | ||
+ | modified: | ||
+ | # Можно откатить индексацию (файл вернётся к добавленному, | ||
+ | git restore --staged hello.html | ||
+ | |||
+ | # Отдельный шаг индексации позволяет разделять добавленные файлы на разные коммиты, | ||
+ | # чтобы не связанные между собой изменения не попадали в один коммит. | ||
+ | # К примеру, | ||
+ | git add a.html | ||
+ | git add b.html | ||
+ | git commit -m " | ||
+ | git add c.html | ||
+ | git commit -m " | ||
+ | </ | ||
+ | |||
+ | ===== Коммит ===== | ||
+ | Если не задать параметр -m для git commit, то откроется редактор. Он задаётся в одной из настроек | ||
+ | * переменная среды GIT_EDITOR | ||
+ | * параметр конфигурации core.editor | ||
+ | * переменная среды VISUAL | ||
+ | * переменная среды EDITOR | ||
+ | <code bash> | ||
+ | git config --global core.editor emacs # emacs | ||
+ | git config --global core.editor "code --wait" | ||
+ | </ | ||
+ | Гит фокусируется на изменениях в файле, а не на самом файле. К примеру, | ||
+ | при коммите добавится только проиндексированное изменение. Второе нужно будет сначала проиндексировать и потом коммитить. | ||
+ | |||
+ | ===== История проекта ===== | ||
+ | <code bash> | ||
+ | git log | ||
+ | |||
+ | git log | ||
+ | commit 204912e8c6cf87c0743ffa5646f4c7438d6ebeaa (HEAD -> main) | ||
+ | Author: Your Name < | ||
+ | Date: Tue Jan 21 16:26:12 2025 +0300 | ||
+ | |||
+ | Added HTML header | ||
+ | |||
+ | commit 88622c4f43f5caa7a891542f09564c68fc362682 | ||
+ | Author: Your Name < | ||
+ | Date: Tue Jan 21 16:15:07 2025 +0300 | ||
+ | |||
+ | Added H1 tag | ||
+ | |||
+ | commit 1a3a27e686a3baeec77a9f44a65471b88495a3e1 | ||
+ | Author: unknown < | ||
+ | Date: Tue Jan 21 15:17:07 2025 +0300 | ||
+ | |||
+ | Initial Commit | ||
+ | | ||
+ | # Вид настраивается, | ||
+ | git log --pretty=oneline | ||
+ | 204912e8c6cf87c0743ffa5646f4c7438d6ebeaa (HEAD -> main) Added HTML header | ||
+ | 88622c4f43f5caa7a891542f09564c68fc362682 Added H1 tag | ||
+ | 1a3a27e686a3baeec77a9f44a65471b88495a3e1 Initial Commit | ||
+ | # Ещё варианты | ||
+ | git log --oneline --max-count=2 # 2 последних коммита | ||
+ | git log --oneline --since=" | ||
+ | git log --oneline --until=" | ||
+ | git log --oneline --author=" | ||
+ | git log --all --pretty=format:" | ||
+ | 204912e Tue Jan 21 16:26:12 2025 +0300 Added HTML header (Your Name) | ||
+ | 88622c4 Tue Jan 21 16:15:07 2025 +0300 Added H1 tag (Your Name) | ||
+ | 1a3a27e Tue Jan 21 15:17:07 2025 +0300 Initial Commit (unknown) | ||
+ | git log --pretty=format:" | ||
+ | 204912e 2025-01-21 | Added HTML header (HEAD -> main) [Your Name] | ||
+ | 88622c4 2025-01-21 | Added H1 tag [Your Name] | ||
+ | 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | |||
+ | # Сделать последний вариант pretty format по умолчанию | ||
+ | git config --global format.pretty '%h %ad | %s%d [%an]' | ||
+ | git config --global log.date short | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | ===== Откат на старые версии ===== | ||
+ | <code bash> | ||
+ | # Откатиться на самый первый коммит (достаточно первых 7 символов хэша как указатель) | ||
+ | git checkout 1a3a27e | ||
+ | Note: switching to ' | ||
+ | |||
+ | You are in ' | ||
+ | changes and commit them, and you can discard any commits you make in this | ||
+ | state without impacting any branches by switching back to a branch. | ||
+ | |||
+ | If you want to create a new branch to retain commits you create, you may | ||
+ | do so (now or later) by using -c with the switch command. Example: | ||
+ | |||
+ | git switch -c < | ||
+ | |||
+ | Or undo this operation with: | ||
+ | |||
+ | git switch - | ||
+ | |||
+ | Turn off this advice by setting config variable advice.detachedHead to false | ||
+ | |||
+ | HEAD is now at 1a3a27e Initial Commit | ||
+ | |||
+ | # hello.html выглядит как в самом начале | ||
+ | cat .\hello.html | ||
+ | Hello, World | ||
+ | # Вернуться на последнюю версию в ветке main | ||
+ | git switch main | ||
+ | # hello.html теперь опять со всеми изменениями | ||
+ | cat .\hello.html | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===== Создание тэгов версий ===== | ||
+ | Работать с хэшами коммитов неудобно. Можно задать человеческий тэг, тогда можно будет сослаться на него. | ||
+ | <code bash> | ||
+ | git tag v1 # задать тэг текущей версии | ||
+ | git log -n 1 | ||
+ | 204912e 2025-01-21 | Added HTML header (HEAD -> main, tag: v1) [Your Name] | ||
+ | |||
+ | ### Задать тэг предыдущей версии | ||
+ | # Переключиться на предыдущую версию | ||
+ | git checkout v1^ # или git checkout v1~1 | ||
+ | git tag v1-beta | ||
+ | git log -n 1 | ||
+ | 88622c4 2025-01-21 | Added H1 tag (HEAD, tag: v1-beta) [Your Name] | ||
+ | |||
+ | # Теперь можно переключаться по тэгам | ||
+ | git checkout v1 | ||
+ | Previous HEAD position was 88622c4 Added H1 tag | ||
+ | HEAD is now at 204912e Added HTML header | ||
+ | git checkout v1-beta | ||
+ | Previous HEAD position was 204912e Added HTML header | ||
+ | HEAD is now at 88622c4 Added H1 tag | ||
+ | |||
+ | # Список тэгов | ||
+ | git tag | ||
+ | v1 | ||
+ | v1-beta | ||
+ | |||
+ | # Тэги в логе | ||
+ | git log main --all | ||
+ | 204912e 2025-01-21 | Added HTML header (tag: v1, main) [Your Name] | ||
+ | 88622c4 2025-01-21 | Added H1 tag (HEAD, tag: v1-beta) [Your Name] | ||
+ | 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | </ | ||
+ | |||
+ | ===== Отмена локальных изменений ===== | ||
+ | ==== До индексации ==== | ||
+ | Чтобы откатить изменения в файле, ещё не добавленном в коммит: | ||
+ | <code bash> | ||
+ | # Вот есть изменения, | ||
+ | git status | ||
+ | On branch main | ||
+ | Changes not staged for commit: | ||
+ | (use "git add < | ||
+ | (use "git restore < | ||
+ | modified: | ||
+ | |||
+ | no changes added to commit (use "git add" and/or "git commit -a") | ||
+ | |||
+ | # Откатить изменения | ||
+ | git restore hello.html | ||
+ | |||
+ | # Теперь чисто, изменений нет | ||
+ | git status | ||
+ | On branch main | ||
+ | nothing to commit, working tree clean | ||
+ | </ | ||
+ | |||
+ | ==== После индексации ==== | ||
+ | Отмена изменений в файле, добавленном в коммит | ||
+ | <code bash> | ||
+ | git status | ||
+ | On branch main | ||
+ | Changes to be committed: | ||
+ | (use "git restore --staged < | ||
+ | modified: | ||
+ | |||
+ | # Убрать файл из индекса (коммита). Файл при этом остался изменённым! | ||
+ | git restore --staged hello.html | ||
+ | |||
+ | # Дальше действовать как до индексации | ||
+ | git restore hello.html | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Отмена коммитов ===== | ||
+ | Есть несколько способов откатить кривой коммит. | ||
+ | ==== Новый коммит, | ||
+ | '' | ||
+ | <code bash> | ||
+ | git revert HEAD | ||
+ | [main 20dea26] Revert "Wrong commit" | ||
+ | 1 file changed, 1 deletion(-) | ||
+ | PS C: | ||
+ | 20dea26 2025-01-21 | Revert "Wrong commit" | ||
+ | c90b848 2025-01-21 | Wrong commit [Your Name] | ||
+ | 204912e 2025-01-21 | Added HTML header (tag: v1) [Your Name] | ||
+ | 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | </ | ||
+ | |||
+ | ==== Удаление коммита из истории ==== | ||
+ | '' | ||
+ | * Изменит текущую ветку, чтобы она указывала на выбранный коммит. | ||
+ | * Опционально сбросит область подготовки до соответствия с указанным коммитом. | ||
+ | * Опционально сбросит рабочую директорию до соответствия с указанным коммитом. | ||
+ | <code bash> | ||
+ | # Сбросит ветку до коммита v1 (здесь: | ||
+ | git reset --hard v1 | ||
+ | |||
+ | # Лог чист | ||
+ | git log | ||
+ | 204912e 2025-01-21 | Added HTML header (HEAD -> main, tag: v1) [Your Name] | ||
+ | 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | # Тем не менее, коммиты ещё есть в списке всех, просто их нет в ветке main | ||
+ | git log --all | ||
+ | 20dea26 2025-01-21 | Revert "Wrong commit" | ||
+ | c90b848 2025-01-21 | Wrong commit [Your Name] | ||
+ | 204912e 2025-01-21 | Added HTML header (HEAD -> main, tag: v1) [Your Name] | ||
+ | 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | </ | ||
+ | На удалённые коммиты можно сослаться либо по хэшу, либо по тэгу, если он есть. Удалённые коммиты, | ||
+ | |||
+ | Здесь у одного из удалённых коммитов есть тэг, его надо удалить, | ||
+ | <code bash> | ||
+ | git tag -d wrong | ||
+ | Deleted tag ' | ||
+ | # Теперь в списке всех коммитов также нет ошибочных | ||
+ | git log --all | ||
+ | 204912e 2025-01-21 | Added HTML header (HEAD -> main, tag: v1) [Your Name] | ||
+ | 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | </ | ||
+ | |||
+ | <WRAP round tip 80%> | ||
+ | Сброс в локальных ветках, | ||
+ | Однако, | ||
+ | </ | ||
+ | |||
+ | ===== Внесение изменений в коммиты ===== | ||
+ | Применяется, | ||
+ | <code bash> | ||
+ | git commit -m "Add copyright" | ||
+ | [main 3d91d05] Add copyright | ||
+ | 1 file changed, 1 insertion(+) | ||
+ | git log | ||
+ | 3d91d05 2025-01-22 | Add copyright (HEAD -> main) [Your Name] | ||
+ | 204912e 2025-01-21 | Added HTML header (tag: v1) [Your Name] | ||
+ | 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | |||
+ | git add .\hello.html | ||
+ | git commit --amend -m "Add copyright with email" | ||
+ | [main b0d54f0] Add copyright with email | ||
+ | Date: Wed Jan 22 13:41:15 2025 +0300 | ||
+ | 1 file changed, 1 insertion(+) | ||
+ | # Последний коммит заменён на новый | ||
+ | git log | ||
+ | b0d54f0 2025-01-22 | Add copyright with email (HEAD -> main) [Your Name] | ||
+ | 204912e 2025-01-21 | Added HTML header (tag: v1) [Your Name] | ||
+ | 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | </ | ||
+ | Этого же результата можно достичь путем сброса последнего коммита в ветке и повторного коммита новых изменений. | ||
+ | |||
+ | ===== Создание веток и переключение между ними ===== | ||
+ | <code bash> | ||
+ | # Создать ветку style | ||
+ | git switch -c style | ||
+ | Switched to a new branch ' | ||
+ | |||
+ | # Старый способ (не рекомендуется) | ||
+ | git checkout -b style | ||
+ | |||
+ | git status | ||
+ | On branch style | ||
+ | nothing to commit, working tree clean | ||
+ | |||
+ | # Переключение между ветками (hello.html будет разным после коммитов в ветку style) | ||
+ | git switch main | ||
+ | cat hello.html | ||
+ | git switch style | ||
+ | cat hello.html | ||
+ | </ | ||
+ | |||
+ | ===== Перемещение файлов ===== | ||
+ | Если тупо переименовать или перенести файлы в репозитории, | ||
+ | <code bash> | ||
+ | # После обычного переименования/ | ||
+ | git status | ||
+ | On branch style | ||
+ | Changes not staged for commit: | ||
+ | (use "git add/rm < | ||
+ | (use "git restore < | ||
+ | deleted: | ||
+ | deleted: | ||
+ | |||
+ | Untracked files: | ||
+ | (use "git add < | ||
+ | css/ | ||
+ | index.html | ||
+ | |||
+ | no changes added to commit (use "git add" and/or "git commit -a") | ||
+ | |||
+ | # Перенести файлы корректно | ||
+ | mkdir css | ||
+ | git mv style.css css/ | ||
+ | git mv hello.html index.html | ||
+ | git status | ||
+ | |||
+ | # Теперь статус в порядке | ||
+ | git status | ||
+ | On branch style | ||
+ | Changes to be committed: | ||
+ | (use "git restore --staged < | ||
+ | renamed: | ||
+ | renamed: | ||
+ | | ||
+ | # Чтобы посмотреть изменения файла до переименования, | ||
+ | git log css/ | ||
+ | 4a6c610 2025-01-22 | Renamed hello.html; moved style.css (HEAD -> style) [Your Name] | ||
+ | |||
+ | git log --follow css/ | ||
+ | 4a6c610 2025-01-22 | Renamed hello.html; moved style.css (HEAD -> style) [Your Name] | ||
+ | aa9e5d8 2025-01-22 | Add css [Your Name] | ||
+ | </ | ||
+ | |||
+ | ===== Просмотр отличающихся веток ===== | ||
+ | <code bash> | ||
+ | # --all - показать все ветки (по умолчанию показывается текущая ветка) | ||
+ | # --graph - дерево в виде простых текстовых линий | ||
+ | git log --all --graph | ||
+ | * b022e6a 2025-01-22 | Add README (HEAD -> main) [Your Name] | ||
+ | | * 4a6c610 2025-01-22 | Renamed hello.html; moved style.css (style) [Your Name] | ||
+ | | * 632e4e7 2025-01-22 | Include css into hello.html [Your Name] | ||
+ | | * aa9e5d8 2025-01-22 | Add css [Your Name] | ||
+ | |/ | ||
+ | * b0d54f0 2025-01-22 | Add copyright with email [Your Name] | ||
+ | * 204912e 2025-01-21 | Added HTML header (tag: v1) [Your Name] | ||
+ | * 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | * 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | </ | ||
+ | |||
+ | ===== Слияние веток ===== | ||
+ | Слить ветку main в style | ||
+ | <code bash> | ||
+ | # Перейти в ветку style | ||
+ | git switch style | ||
+ | Switched to branch ' | ||
+ | # Слить ветки | ||
+ | git merge main | ||
+ | Merge made by the ' | ||
+ | | ||
+ | 1 file changed, 1 insertion(+) | ||
+ | | ||
+ | # График коммитов | ||
+ | git log --all --graph | ||
+ | * | ||
+ | |\ | ||
+ | | * b022e6a 2025-01-22 | Add README (main) [Your Name] | ||
+ | * | 4a6c610 2025-01-22 | Renamed hello.html; moved style.css [Your Name] | ||
+ | * | 632e4e7 2025-01-22 | Include css into hello.html [Your Name] | ||
+ | * | aa9e5d8 2025-01-22 | Add css [Your Name] | ||
+ | |/ | ||
+ | * b0d54f0 2025-01-22 | Add copyright with email [Your Name] | ||
+ | * 204912e 2025-01-21 | Added HTML header (tag: v1) [Your Name] | ||
+ | * 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | * 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | </ | ||
+ | Путем периодического слияния ветки main с веткой style происходит перенос изменений из main и поддерживается совместимость изменений style с изменениями в основной ветке. Однако, | ||
+ | |||
+ | ===== Конфликтующие изменения в ветках и разрешение конфликта ===== | ||
+ | Если в обеих ветках была изменена одна и та же часть файла, Git может не справиться с автоматическим слиянием изменений. В этом случае Git сообщит о конфликте и попросит разрешить его вручную. | ||
+ | <WRAP group> | ||
+ | <WRAP half column> | ||
+ | Файл index.html ветки style | ||
+ | <code html> | ||
+ | <!-- Author: Alexander Shvets (alex@githowto.com) --> | ||
+ | < | ||
+ | < | ||
+ | <link type=" | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <WRAP half column> | ||
+ | Файл hello.html ветки main | ||
+ | <code html> | ||
+ | <!-- Author: Alexander Shvets (alex@githowto.com) --> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | После попытки слива веток | ||
+ | <code bash> | ||
+ | git switch style | ||
+ | Switched to branch ' | ||
+ | |||
+ | git merge main | ||
+ | Auto-merging index.html | ||
+ | CONFLICT (content): Merge conflict in index.html | ||
+ | Automatic merge failed; fix conflicts and then commit the result. | ||
+ | </ | ||
+ | Файл index.html выглядит так: | ||
+ | <code html> | ||
+ | <!-- Author: Alexander Shvets (alex@githowto.com) --> | ||
+ | < | ||
+ | < | ||
+ | <<<<<<< | ||
+ | <link type=" | ||
+ | ======= | ||
+ | < | ||
+ | >>>>>>> | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | Часть между '' | ||
+ | |||
+ | <code bash> | ||
+ | # Можно отменить слияние веток | ||
+ | git merge --abort | ||
+ | |||
+ | # А можно отредактировать index.html и закоммитить его | ||
+ | git add index.html | ||
+ | git commit -m " | ||
+ | |||
+ | git status | ||
+ | On branch style | ||
+ | nothing to commit, working tree clean | ||
+ | |||
+ | git log --all --graph | ||
+ | * | ||
+ | |\ | ||
+ | | * 9e1309b 2025-01-22 | Added meta title (main) [Your Name] | ||
+ | * | 98277e2 2025-01-22 | Merge branch ' | ||
+ | |\| | ||
+ | | * b022e6a 2025-01-22 | Add README [Your Name] | ||
+ | * | 4a6c610 2025-01-22 | Renamed hello.html; moved style.css [Your Name] | ||
+ | * | 632e4e7 2025-01-22 | Include css into hello.html [Your Name] | ||
+ | * | aa9e5d8 2025-01-22 | Add css [Your Name] | ||
+ | |/ | ||
+ | * b0d54f0 2025-01-22 | Add copyright with email [Your Name] | ||
+ | * 204912e 2025-01-21 | Added HTML header (tag: v1) [Your Name] | ||
+ | * 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | * 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | </ | ||
+ | У Git нет графических инструментов слияния, | ||
+ | |||
+ | ===== rebase вместо merge ===== | ||
+ | |||
+ | <code bash> | ||
+ | # В ветке style коммит '' | ||
+ | git log --graph | ||
+ | * | ||
+ | |\ | ||
+ | | * 9e1309b 2025-01-22 | Added meta title (main) [Your Name] | ||
+ | * | 98277e2 2025-01-22 | Merge branch ' | ||
+ | |\| | ||
+ | | * b022e6a 2025-01-22 | Add README [Your Name] | ||
+ | * | 4a6c610 2025-01-22 | Renamed hello.html; moved style.css [Your Name] | ||
+ | * | 632e4e7 2025-01-22 | Include css into hello.html [Your Name] | ||
+ | * | aa9e5d8 2025-01-22 | Add css [Your Name] | ||
+ | |/ | ||
+ | * b0d54f0 2025-01-22 | Add copyright with email [Your Name] | ||
+ | * 204912e 2025-01-21 | Added HTML header (tag: v1) [Your Name] | ||
+ | * 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | * 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | |||
+ | # Сброс ветки style к этому коммиту | ||
+ | git reset --hard HEAD~2 # Вариант: | ||
+ | HEAD is now at 4a6c610 Renamed hello.html; moved style.css | ||
+ | |||
+ | # В ветке main есть два коммита, | ||
+ | # Перенести эти изменения в ветку style с помощью команды rebase. | ||
+ | git switch style | ||
+ | |||
+ | git rebase main | ||
+ | Auto-merging hello.html | ||
+ | CONFLICT (content): Merge conflict in hello.html | ||
+ | error: could not apply 632e4e7... Include css into hello.html | ||
+ | hint: Resolve all conflicts manually, mark them as resolved with | ||
+ | hint: "git add/rm < | ||
+ | hint: You can instead skip this commit: run "git rebase --skip" | ||
+ | hint: To abort and get back to the state before "git rebase", | ||
+ | hint: Disable this message with "git config advice.mergeConflict false" | ||
+ | Could not apply 632e4e7... Include css into hello.html | ||
+ | |||
+ | git status | ||
+ | </ | ||
+ | Опять возник конфликт, | ||
+ | |||
+ | После устранения конфликта можно продолжить rebase (коммит уже не нужен!) | ||
+ | <code bash> | ||
+ | git add . | ||
+ | |||
+ | git rebase --continue | ||
+ | [detached HEAD 31f51f7] Include css into hello.html | ||
+ | 1 file changed, 3 insertions(+), | ||
+ | Successfully rebased and updated refs/ | ||
+ | |||
+ | git status | ||
+ | On branch style | ||
+ | nothing to commit, working tree clean | ||
+ | |||
+ | git log --graph --all | ||
+ | * 53c3dbd 2025-01-22 | Renamed hello.html; moved style.css (HEAD -> style) [Your Name] | ||
+ | * 31f51f7 2025-01-22 | Include css into hello.html [Your Name] | ||
+ | * d835c42 2025-01-22 | Add css [Your Name] | ||
+ | * 9e1309b 2025-01-22 | Added meta title (main) [Your Name] | ||
+ | * b022e6a 2025-01-22 | Add README [Your Name] | ||
+ | * b0d54f0 2025-01-22 | Add copyright with email [Your Name] | ||
+ | * 204912e 2025-01-21 | Added HTML header (tag: v1) [Your Name] | ||
+ | * 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | * 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | </ | ||
+ | |||
+ | Конечный результат перебазирования очень похож на результат слияния. Ветка style в настоящее время содержит все свои изменения, | ||
+ | |||
+ | Используйте команду rebase: | ||
+ | * Когда вы получаете изменения из удаленного репозитория и хотите применить их к своей локальной ветке. | ||
+ | * Если вы хотите, | ||
+ | |||
+ | Не используйте команду rebase: | ||
+ | * Если текущая ветка является публичной и общей. Переписывание таких веток будет мешать работе других членов команды. | ||
+ | * Если важна точная история ветки коммитов (поскольку команда rebase переписывает историю коммитов). | ||
+ | |||
+ | Учитывая приведенные выше рекомендации, | ||
+ | |||
+ | ===== Слив в ветку main ===== | ||
+ | <code bash> | ||
+ | git switch main | ||
+ | |||
+ | git merge style | ||
+ | Updating 9e1309b..53c3dbd | ||
+ | Fast-forward | ||
+ | | ||
+ | | ||
+ | 2 files changed, 6 insertions(+), | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | Т. к. последний коммит в main предшествует последнему коммиту ветки style, Git может выполнить ускоренное слияние, | ||
+ | |||
+ | Теперь ветки style и main идентичны. | ||
+ | |||
+ | ===== Несколько репозиториев ===== | ||
+ | Клонировать локальный репозиторий | ||
+ | <code bash> | ||
+ | cd C: | ||
+ | git clone work home | ||
+ | Cloning into ' | ||
+ | done. | ||
+ | |||
+ | ls | ||
+ | Каталог: | ||
+ | Mode | ||
+ | ---- | ||
+ | d----- | ||
+ | d----- | ||
+ | |||
+ | # Если посмотреть историю, | ||
+ | # origin/ | ||
+ | git log --all | ||
+ | 53c3dbd 2025-01-22 | Renamed hello.html; moved style.css (HEAD -> main, origin/ | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | ==== origin - указание первичного репозитория ==== | ||
+ | При клонировании репозитория исходный сохраняется как origin. Традиционно origin используется в качестве имени первичного централизованного репозитория. | ||
+ | <code bash> | ||
+ | git remote | ||
+ | origin | ||
+ | |||
+ | git remote show origin | ||
+ | * remote origin | ||
+ | Fetch URL: C:/ | ||
+ | Push URL: C:/ | ||
+ | HEAD branch: main | ||
+ | Remote branches: | ||
+ | main tracked | ||
+ | style tracked | ||
+ | Local branch configured for 'git pull': | ||
+ | main merges with remote main | ||
+ | Local ref configured for 'git push': | ||
+ | main pushes to main (up to date) | ||
+ | </ | ||
+ | |||
+ | ==== Локальные и удалённые ветки ==== | ||
+ | Если вывести список веток в клонированном репозитории, | ||
+ | <code bash> | ||
+ | git branch | ||
+ | * main | ||
+ | |||
+ | # С параметром -a будут видны все ветки | ||
+ | git branch -a | ||
+ | * main | ||
+ | remotes/ | ||
+ | remotes/ | ||
+ | remotes/ | ||
+ | </ | ||
+ | Ветки в удаленном репозитории не рассматриваются как локальные. Если нужна ветка style, то нужно её создать. | ||
+ | |||
+ | ==== Синхронизация изменений из удалённого репозитория ==== | ||
+ | '' | ||
+ | <code bash> | ||
+ | # Внесение изменений в удалённый репозиторий | ||
+ | cd ../work | ||
+ | git add .\README | ||
+ | git commit -m " | ||
+ | [main 7cc9cfb] Changed README in original repo | ||
+ | 1 file changed, 2 insertions(+), | ||
+ | |||
+ | # Получение изменений в локальном | ||
+ | cd ../home | ||
+ | git fetch | ||
+ | remote: Enumerating objects: 5, done. | ||
+ | remote: Counting objects: 100% (5/5), done. | ||
+ | remote: Compressing objects: 100% (3/3), done. | ||
+ | remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) | ||
+ | Unpacking objects: 100% (3/3), 372 bytes | 28.00 KiB/s, done. | ||
+ | From C:/ | ||
+ | | ||
+ | |||
+ | # Коммит приехал, | ||
+ | # Соответственно, | ||
+ | git log --all | ||
+ | 7cc9cfb 2025-02-01 | Changed README in original repo (origin/ | ||
+ | 53c3dbd 2025-01-22 | Renamed hello.html; moved style.css (HEAD -> main, origin/ | ||
+ | 31f51f7 2025-01-22 | Include css into hello.html [Your Name] | ||
+ | d835c42 2025-01-22 | Add css [Your Name] | ||
+ | 9e1309b 2025-01-22 | Added meta title [Your Name] | ||
+ | b022e6a 2025-01-22 | Add README [Your Name] | ||
+ | b0d54f0 2025-01-22 | Add copyright with email [Your Name] | ||
+ | 204912e 2025-01-21 | Added HTML header (tag: v1) [Your Name] | ||
+ | 88622c4 2025-01-21 | Added H1 tag (tag: v1-beta) [Your Name] | ||
+ | 1a3a27e 2025-01-21 | Initial Commit [unknown] | ||
+ | </ | ||
+ | |||
+ | ==== Слияние полученных изменений удалённого репозитория с локальным ==== | ||
+ | '' | ||
+ | <code bash> | ||
+ | git merge origin/main | ||
+ | Updating 53c3dbd..7cc9cfb | ||
+ | Fast-forward | ||
+ | | ||
+ | 1 file changed, 2 insertions(+), | ||
+ | </ | ||
+ | Теперь файл README изменён и локально. | ||
+ | |||
+ | Есть возможность сразу и получить изменения из удалённого репозитория, | ||
+ | Т. е., '' | ||
+ | |||
+ | ==== Добавление локальной ветки, отслеживающей удалённую ==== | ||
+ | <code bash> | ||
+ | # Добавить ветку style, отслеживающую origin/ | ||
+ | git branch --track style origin/ | ||
+ | branch ' | ||
+ | |||
+ | # Локальная ветка style появилась в списке веток | ||
+ | git branch -a | ||
+ | * main | ||
+ | style | ||
+ | remotes/ | ||
+ | remotes/ | ||
+ | remotes/ | ||
+ | |||
+ | # и в логе | ||
+ | git log --max-count=2 | ||
+ | 7cc9cfb 2025-02-01 | Changed README in original repo (HEAD -> main, origin/ | ||
+ | 53c3dbd 2025-01-22 | Renamed hello.html; moved style.css (origin/ | ||
+ | </ | ||
+ | |||
+ | ===== Чистый репозиторий ===== | ||
+ | Чистый (голый, | ||
+ | <code bash> | ||
+ | cd .. | ||
+ | # Традиционно " | ||
+ | git clone --bare work work.git | ||
+ | Cloning into bare repository ' | ||
+ | done. | ||
+ | PS C: | ||
+ | |||
+ | Каталог: | ||
+ | |||
+ | Mode | ||
+ | ---- | ||
+ | d----- | ||
+ | d----- | ||
+ | d----- | ||
+ | d----- | ||
+ | -a---- | ||
+ | -a---- | ||
+ | -a---- | ||
+ | -a---- | ||
+ | </ | ||
+ | |||
+ | ==== Добавление чистого репозитория как удалённого, | ||
+ | <code bash> | ||
+ | cd work | ||
+ | # Добавить чистый репозиторий work.git как shared | ||
+ | git remote add shared ../work.git | ||
+ | |||
+ | # Чистые репозитории обычно располагаются на удаленном сервере и туда нельзя зайти, чтобы подтянуть изменения. | ||
+ | # Поэтому необходимо как-нибудь передать наши изменения в репозиторий. | ||
+ | |||
+ | # Внести изменения, | ||
+ | git add README | ||
+ | git commit -m "Added shared comment to readme" | ||
+ | [main 576bd94] Added shared comment to readme | ||
+ | 1 file changed, 1 insertion(+), | ||
+ | |||
+ | # Передать изменения в чистый репозиторий | ||
+ | git push shared main | ||
+ | Enumerating objects: 5, done. | ||
+ | Counting objects: 100% (5/5), done. | ||
+ | Delta compression using up to 8 threads | ||
+ | Compressing objects: 100% (3/3), done. | ||
+ | Writing objects: 100% (3/3), 399 bytes | 66.00 KiB/s, done. | ||
+ | Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) | ||
+ | To ..\work.git | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ==== Получение изменений из общего репозитория ==== | ||
+ | <code bash> | ||
+ | # Перейти в репозиторий назначения | ||
+ | cd ../home | ||
+ | # Добавить чистый репозиторий work.git как shared (так же, как ранее в исходном репозитории work) | ||
+ | git remote add shared ../work.git | ||
+ | # Отслеживать ветку main в shared | ||
+ | git branch --track shared main | ||
+ | branch ' | ||
+ | # Получить изменения из shared/main | ||
+ | git pull shared main | ||
+ | remote: Enumerating objects: 5, done. | ||
+ | remote: Counting objects: 100% (5/5), done. | ||
+ | remote: Compressing objects: 100% (3/3), done. | ||
+ | remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) | ||
+ | Unpacking objects: 100% (3/3), 379 bytes | 27.00 KiB/s, done. | ||
+ | From ../work | ||
+ | * branch | ||
+ | * [new branch] | ||
+ | Updating 7cc9cfb..576bd94 | ||
+ | Fast-forward | ||
+ | | ||
+ | 1 file changed, 1 insertion(+), | ||
+ | </ | ||
+ | Теперь файл README изменился и в home. | ||
+ | |||
+ | ===== Git-сервер ===== | ||
+ | Git умеет быть и сервером. | ||
+ | <code bash> | ||
+ | cd .. | ||
+ | ls | ||
+ | |||
+ | Каталог: | ||
+ | |||
+ | Mode | ||
+ | ---- | ||
+ | d----- | ||
+ | d----- | ||
+ | d----- | ||
+ | |||
+ | |||
+ | # Запуск демона git (добавить --enable=receive-pack, | ||
+ | # сервер не производит аутентификацию, | ||
+ | git daemon --verbose --export-all --base-path=. | ||
+ | [20528] Ready to rumble | ||
+ | # Это появляется позже после подключения клиента | ||
+ | [21436] Connection from [::1]:34050 | ||
+ | [21436] unable to set SO_KEEPALIVE on socket: Input/ | ||
+ | [21436] Extended attribute " | ||
+ | [21436] Extended attribute " | ||
+ | [21436] Request upload-pack for '/ | ||
+ | </ | ||
+ | |||
+ | В другом окне терминала (прошлое занято выполняющимся сервисом): | ||
+ | <code bash> | ||
+ | cd C: | ||
+ | # Клонировать work.git с сервера в локальный net_work | ||
+ | git clone git:// | ||
+ | Cloning into ' | ||
+ | remote: Enumerating objects: 33, done. | ||
+ | remote: Counting objects: 100% (33/33), done. | ||
+ | remote: Compressing objects: 100% (25/25), done. | ||
+ | remote: Total 33 (delta 4), reused 0 (delta 0), pack-reused 0 (from 0) | ||
+ | Receiving objects: 100% (33/33), done. | ||
+ | Resolving deltas: 100% (4/4), done. | ||
+ | |||
+ | # Файлы появились | ||
+ | ls net_work | ||
+ | |||
+ | Каталог: | ||
+ | |||
+ | Mode | ||
+ | ---- | ||
+ | d----- | ||
+ | -a---- | ||
+ | -a---- | ||
+ | </ | ||