#git #github
Я подключил 2 репозитория.
git remote add origin https://github.com/мой_аккаунт/репозиторий_1.git -> здесь много
файлов
git remote add index https://github.com/мой_аккаунт/репозиторий_2.git -> тут пусто
После этого я сделал изменения и решил закомитить их на первый репозиторий:
git add index.php
git commit -m "Comit"
git push origin master
Все ок.
Потом я хочу эти же изминения закомитить на второй репозиторий:
git push index master
и в пустой репозиторий залились все файлы, а не только index.php. Почему?
Ответы
Ответ 1
Как верно пишет Mira, в Git можно индексировать (а следовательно, и сохранять в коммит) отдельные файлы и даже строки (для бинарных не получится). Но после этого Git оперирует только коммитами целиком. Вы не можете заливать на удаленный репозиторий часть коммита — только целый. Каждый коммит содержит не один файл — он содержит «снимок» всей рабочей области проекта. То есть когда вы сделали коммит с index.php, то в нем на самом деле содержится: Новый index.php Всё, что было в предыдущем (родительском) коммите. Родительский, соответственно, содержит изменения, которые сохранены в нём плюс всё из его предка. И так далее до самого первого коммита в истории проекта. Вот поэтому в репозиторий и заливаются каждый раз все файлы. Подробнее тут: Каким образом git сохраняет изменившуюся строку при коммите? Если вам нужно заливать только один файл, то можно подумать о реализации, но сначала нужна четкая постановка задачи, которую вы так пытаетесь решить.Ответ 2
В гите возможно коммитить не только отдельные файлы, но даже только определенные строки. Для этого зайдите в графический интерфейс (git gui&) и там в окошке слева - сверху текущие изменения, слева - снизу - изменения подготовленные для коммита. И вы можете по одному файлы убирать-добавлять, нажимая на иконку файла. Так же для строк: выделяете в основном окне строки, и в меню выпадающем по нажатию правой кнопки мыши выбираете "stage lines" (подготовить к коммиту) либо "unstage lines" (убрать из коммита) После чего нажимаете commit и в него попадут только выбранные файлы либо строки. Команда push применяет все обновленные коммиты полностью на удаленный репозиторий, тут уж без вариантов. То есть если относительно первого репозитория у вас изменился один коммит - обновится только он, если относительно второго - есть изменения для нескольких коммитов - они обновятся все. Команда push фактически не "заливает файлы" а обновляет удаленный репозиторий до состояния локального, досылая недостающие объекты.Ответ 3
Потому что ветка одна и та же. А ветка состоит из "верхушки" и всех её предков (дерева коммитов). push и pull загружают дерево целиком, пока у коммитов рекурсивно не перестанут находиться предки. То есть, будет точно воспроизведено состояние репозитория на "верхушке" ветки. Если вы хотите отделить часть файлов, храните их в отдельной ветке (я вам уже вчера рассказывал, как) и делайте мёрджи только из этой ветки, а не в неё при необходимости внести в эти файлы изменения. Тогда коммиты, меняющие эти файлы, никогда не сошлются на другие файлы проекта и не будут лежать в ветке. В ветке b команда git merge a заставит ветку b ссылаться на ветку a, но не наоборот. Ветка a ничего об этом мердже не узнает, она сама по себе. Рассматривайте "утилиты" и "основу" как разные проекты.
Комментариев нет:
Отправить комментарий