learning:git
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
learning:git [22.01.2025 20:19] – [rebase вместо merge] viacheslav | learning:git [02.02.2025 07:32] (текущий) – [Получение изменений из общего репозитория] viacheslav | ||
---|---|---|---|
Строка 517: | Строка 517: | ||
===== rebase вместо merge ===== | ===== 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---- | ||
+ | </ | ||
learning/git.1737577152.txt.gz · Последнее изменение: 22.01.2025 20:19 — viacheslav