Инструменты пользователя

Инструменты сайта


learning:git

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
learning:git [22.01.2025 20:17] – [Конфликтующие изменения в ветках и разрешение конфликта] viacheslavlearning:git [02.02.2025 07:32] (текущий) – [Получение изменений из общего репозитория] viacheslav
Строка 484: Строка 484:
 </html> </html>
 </code> </code>
-Часть между ''%%<<<<<<<%%'' и ''%%>>>>>>>%%'' является конфликтом. Верхняя часть соответствует ветке style, которая является текущей веткой (или HEAD) репозитория. Нижняя часть соответствует изменениям из ветки main.+Часть между ''%%<<<<<<<%%'' и ''%%>>>>>>>%%'' является конфликтом. Верхняя часть соответствует ветке style, которая является текущей веткой (или HEAD) репозитория. Нижняя часть соответствует изменениям из ветки main. Видно, что часть с ''%%<p>Let's learn Git together.</p>%%'' git сделал сам.
  
 <code bash> <code bash>
Строка 516: Строка 516:
 У Git нет графических инструментов слияния, но [[https://stackoverflow.com/questions/137102/whats-the-best-visual-merge-tool-for-git|можно настроить сторонние]]. У Git нет графических инструментов слияния, но [[https://stackoverflow.com/questions/137102/whats-the-best-visual-merge-tool-for-git|можно настроить сторонние]].
  
-====== rebase вместо merge ======+===== rebase вместо merge ===== 
 + 
 +<code bash> 
 +# В ветке style коммит ''Renamed hello.html; moved style.css'' последний перед слиянием с main. 
 +git log --graph 
 +*   e71d981 2025-01-22 | Resolved merge conflict (HEAD -> style) [Your Name] 
 +|\   
 +| * 9e1309b 2025-01-22 | Added meta title (main) [Your Name] 
 +* | 98277e2 2025-01-22 | Merge branch 'main' into style [Your Name] 
 +|\|  
 +| * 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 # Вариант: git reset --hard 4a6c610 
 +HEAD is now at 4a6c610 Renamed hello.html; moved style.css 
 + 
 +# В ветке main есть два коммита, которых нет в ветке style: новый файл README и конфликтующее изменение в файле index.html. 
 +# Перенести эти изменения в ветку 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 <conflicted_files>", then run "git rebase --continue"
 +hint: You can instead skip this commit: run "git rebase --skip"
 +hint: To abort and get back to the state before "git rebase", run "git rebase --abort"
 +hint: Disable this message with "git config advice.mergeConflict false" 
 +Could not apply 632e4e7... Include css into hello.html 
 + 
 +git status 
 +</code> 
 +Опять возник конфликт, но в ''hello.html'', а не в файле ''index.html'', как в прошлый раз. Это связано с тем, что ''rebase'' находился в процессе применения изменений style поверх ветки main. Файл ''hello.html'' в main еще не был переименован, поэтому он все еще имеет старое имя. При слиянии возник бы «обратный» конфликт. При слиянии изменения ветки main были бы применены поверх ветки style. В ветке style файл переименован, поэтому конфликт возник бы в файле ''index.html''
 + 
 +После устранения конфликта можно продолжить rebase (коммит уже не нужен!) 
 +<code bash> 
 +git add . 
 + 
 +git rebase --continue 
 +[detached HEAD 31f51f7] Include css into hello.html 
 + 1 file changed, 3 insertions(+), 1 deletion(-) 
 +Successfully rebased and updated refs/heads/style. 
 + 
 +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] 
 +</code> 
 + 
 +Конечный результат перебазирования очень похож на результат слияния. Ветка style в настоящее время содержит все свои изменения, а также все изменения ветки main. Однако, дерево коммитов значительно отличается. Дерево коммитов ветки style было переписано таким образом, что ветка main является частью истории коммитов. Это делает цепь коммитов линейной и гораздо более читабельной. 
 + 
 +Используйте команду rebase: 
 +  * Когда вы получаете изменения из удаленного репозитория и хотите применить их к своей локальной ветке. 
 +  * Если вы хотите, чтобы история коммитов была линейной и легко читаемой. 
 + 
 +Не используйте команду rebase: 
 +  * Если текущая ветка является публичной и общей. Переписывание таких веток будет мешать работе других членов команды. 
 +  * Если важна точная история ветки коммитов (поскольку команда rebase переписывает историю коммитов). 
 + 
 +Учитывая приведенные выше рекомендации, команду rebase можно использовать для краткосрочных, локальных веток и команду merge для веток в публичном репозитории. 
 + 
 +===== Слив в ветку main ===== 
 +<code bash> 
 +git switch main 
 + 
 +git merge style 
 +Updating 9e1309b..53c3dbd 
 +Fast-forward 
 + css/style.css            | 3 +++ 
 + hello.html => index.html | 4 +++- 
 + 2 files changed, 6 insertions(+), 1 deletion(-) 
 + create mode 100644 css/style.css 
 + rename hello.html => index.html (70%) 
 +</code> 
 +Т. к. последний коммит в main предшествует последнему коммиту ветки style, Git может выполнить ускоренное слияние, просто переместив указатель ветки вперед, на тот же коммит, что и ветка style. При ускоренном слиянии конфликты не возникают. Кроме того, при ускоренном слиянии не создается фиксация слияния. 
 + 
 +Теперь ветки style и main идентичны. 
 + 
 +===== Несколько репозиториев ===== 
 +Клонировать локальный репозиторий 
 +<code bash> 
 +cd C:\temp\githowto\repositories 
 +git clone work home 
 +Cloning into 'home'... 
 +done. 
 + 
 +ls 
 +    Каталог: C:\temp\githowto\repositories 
 +Mode                 LastWriteTime         Length Name 
 +----                 -------------         ------ ---- 
 +d-----        01.02.2025      9:11                home 
 +d-----        26.01.2025     11:59                work 
 + 
 +# Если посмотреть историю, то у обоих репозиториев одинаковые коммиты, но у клонированного добавились ветки 
 +# origin/style, origin/main, origin/HEAD 
 +git log --all 
 +53c3dbd 2025-01-22 | Renamed hello.html; moved style.css (HEAD -> main, origin/style, origin/main, origin/HEAD) [Your Name] 
 +... 
 +</code> 
 + 
 +==== origin - указание первичного репозитория ==== 
 +При клонировании репозитория исходный сохраняется как origin. Традиционно origin используется в качестве имени первичного централизованного репозитория. 
 +<code bash> 
 +git remote 
 +origin 
 + 
 +git remote show origin 
 +* remote origin 
 +  Fetch URL: C:/temp/githowto/repositories/work 
 +  Push  URL: C:/temp/githowto/repositories/work 
 +  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> 
 + 
 +==== Локальные и удалённые ветки ==== 
 +Если вывести список веток в клонированном репозитории, то будет видна только main. 
 +<code bash> 
 +git branch 
 +* main 
 + 
 +# С параметром -a будут видны все ветки 
 +git branch -a 
 +* main 
 +  remotes/origin/HEAD -> origin/main 
 +  remotes/origin/main 
 +  remotes/origin/style 
 +</code> 
 +Ветки в удаленном репозитории не рассматриваются как локальные. Если нужна ветка style, то нужно её создать. 
 + 
 +==== Синхронизация изменений из удалённого репозитория ==== 
 +''git fetch'' - получение новых коммитов из удаленного репозитория без изменения локальных веток. 
 +<code bash> 
 +# Внесение изменений в удалённый репозиторий 
 +cd ../work 
 +git add .\README 
 +git commit -m "Changed README in original repo" 
 +[main 7cc9cfb] Changed README in original repo 
 + 1 file changed, 2 insertions(+), 1 deletion(-) 
 + 
 +# Получение изменений в локальном 
 +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:/temp/githowto/repositories/work 
 +   53c3dbd..7cc9cfb  main       -> origin/main 
 + 
 +# Коммит приехал, но не интегрировался в локальную ветку main (HEAD не на последнем коммите) 
 +# Соответственно, файл локальный файл README не изменился. 
 +git log --all 
 +7cc9cfb 2025-02-01 | Changed README in original repo (origin/main, origin/HEAD) [Your Name] 
 +53c3dbd 2025-01-22 | Renamed hello.html; moved style.css (HEAD -> main, origin/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 [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> 
 + 
 +==== Слияние полученных изменений удалённого репозитория с локальным ==== 
 +''git merge'' сливает полученные ранее изменения в локальный репозиторий. 
 +<code bash> 
 +git merge origin/main 
 +Updating 53c3dbd..7cc9cfb 
 +Fast-forward 
 + README | 3 ++- 
 + 1 file changed, 2 insertions(+), 1 deletion(-) 
 +</code> 
 +Теперь файл README изменён и локально. 
 + 
 +Есть возможность сразу и получить изменения из удалённого репозитория, и сразу слить их в локальный - это ''git pull''.\\ 
 +Т. е., ''git pull'' = ''git fetch'' + ''git merge origin/main''
 + 
 +==== Добавление локальной ветки, отслеживающей удалённую ==== 
 +<code bash> 
 +# Добавить ветку style, отслеживающую origin/style 
 +git branch --track style origin/style 
 +branch 'style' set up to track 'origin/style'
 + 
 +# Локальная ветка style появилась в списке веток 
 +git branch -a 
 +* main 
 +  style 
 +  remotes/origin/HEAD -> origin/main 
 +  remotes/origin/main 
 +  remotes/origin/style 
 + 
 +# и в логе 
 +git log --max-count=2 
 +7cc9cfb 2025-02-01 | Changed README in original repo (HEAD -> main, origin/main, origin/HEAD) [Your Name] 
 +53c3dbd 2025-01-22 | Renamed hello.html; moved style.css (origin/style, style) [Your Name] 
 +</code> 
 + 
 +===== Чистый репозиторий ===== 
 +Чистый (голый, bare) репозиторий не имеет рабочего каталога. Он содержит только директорию .git, в которой Git хранит все свои внутренние данные. Обычно используется в качестве удалённого репозитория. Так как bare репозиторий используется только для обмена, то нет причин создавать рабочую копию на диске, проще говоря, такой репозиторий содержит только каталог .git вашего проекта и ничего больше. 
 +<code bash> 
 +cd .. 
 +# Традиционно "чистый" репозиторий создаётся с .git в конце имени 
 +git clone --bare work work.git 
 +Cloning into bare repository 'work.git'... 
 +done. 
 +PS C:\temp\githowto\repositories> ls work.git 
 + 
 +    Каталог: C:\temp\githowto\repositories\work.git 
 + 
 +Mode                 LastWriteTime         Length Name 
 +----                 -------------         ------ ---- 
 +d-----        02.02.2025      9:39                hooks 
 +d-----        02.02.2025      9:39                info 
 +d-----        02.02.2025      9:39                objects 
 +d-----        02.02.2025      9:39                refs 
 +-a----        02.02.2025      9:39            164 config 
 +-a----        02.02.2025      9:39             73 description 
 +-a----        02.02.2025      9:39             21 HEAD 
 +-a----        02.02.2025      9:39            274 packed-refs 
 +</code> 
 + 
 +==== Добавление чистого репозитория как удалённого, отправка изменений ==== 
 +<code bash> 
 +cd work 
 +# Добавить чистый репозиторий work.git как shared 
 +git remote add shared ../work.git 
 + 
 +# Чистые репозитории обычно располагаются на удаленном сервере и туда нельзя зайти, чтобы подтянуть изменения. 
 +# Поэтому необходимо как-нибудь передать наши изменения в репозиторий. 
 + 
 +# Внести изменения, например, в README в репе work и закоммитить 
 +git add README 
 +git commit -m "Added shared comment to readme" 
 +[main 576bd94] Added shared comment to readme 
 + 1 file changed, 1 insertion(+), 1 deletion(-) 
 + 
 +# Передать изменения в чистый репозиторий 
 +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 
 +   7cc9cfb..576bd94  main -> main 
 +</code> 
 + 
 +==== Получение изменений из общего репозитория ==== 
 +<code bash> 
 +# Перейти в репозиторий назначения 
 +cd ../home 
 +# Добавить чистый репозиторий work.git как shared (так же, как ранее в исходном репозитории work) 
 +git remote add shared ../work.git 
 +# Отслеживать ветку main в shared 
 +git branch --track shared main 
 +branch 'shared' set up to track 'main'
 +# Получить изменения из 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            main       -> FETCH_HEAD 
 + * [new branch]      main       -> shared/main 
 +Updating 7cc9cfb..576bd94 
 +Fast-forward 
 + README | 2 +- 
 + 1 file changed, 1 insertion(+), 1 deletion(-) 
 +</code> 
 +Теперь файл README изменился и в home. 
 + 
 +===== Git-сервер ===== 
 +Git умеет быть и сервером. 
 +<code bash> 
 +cd .. 
 +ls 
 + 
 +    Каталог: C:\temp\githowto\repositories 
 + 
 +Mode                 LastWriteTime         Length Name 
 +----                 -------------         ------ ---- 
 +d-----        02.02.2025     10:11                home 
 +d-----        26.01.2025     11:59                work 
 +d-----        02.02.2025     10:06                work.git 
 + 
 + 
 +# Запуск демона git (добавить --enable=receive-pack, чтобы разрешить push. Внимание:  
 +# сервер не производит аутентификацию, поэтому любой сможет отправлять изменения в ваш репозиторий!) 
 +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/output error 
 +[21436] Extended attribute "host": localhost 
 +[21436] Extended attribute "protocol": version=2 
 +[21436] Request upload-pack for '/work.git' 
 +</code> 
 + 
 +В другом окне терминала (прошлое занято выполняющимся сервисом): 
 +<code bash> 
 +cd C:\temp\githowto\repositories 
 +# Клонировать work.git с сервера в локальный net_work 
 +git clone git://localhost/work.git net_work 
 +Cloning into 'net_work'... 
 +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 
 + 
 +    Каталог: C:\temp\githowto\repositories\net_work 
 + 
 +Mode                 LastWriteTime         Length Name 
 +----                 -------------         ------ ---- 
 +d-----        02.02.2025     10:22                css 
 +-a----        02.02.2025     10:22            295 index.html 
 +-a----        02.02.2025     10:22            100 README 
 +</code>
  
learning/git.1737577031.txt.gz · Последнее изменение: 22.01.2025 20:17 — viacheslav

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki