Если я делаю push из локального репозитория в удаленный, то на удаленном файл полностью изменяется на локальный? Или они сначала сравниваются и заливаются только изменения?
-
Что попало в гит, то останется в гите :) – o2gy Aug 02 '15 at 20:51
-
@o2gy: ну, всегда можно filter-branch сделать или ещё что похлеще ) – Nick Volynkin Aug 02 '15 at 22:04
2 Answers
удалённый репозиторий — скорее всего — bare-репозиторий («голый»), т.е. возле него нет рабочего каталога (working directory), и, соответственно, никаких файлов, которые вы наблюдаете в своём рабочем каталоге.
чтобы было понятней: в удалённом репозитории хранится практически то же, что и у вас в каталоге .git возле содержимого вашего рабочего каталога.
а это, собственно, и есть git-репозиторий.
исходя из вышеизложенного, надеюсь, становится понятно, что вопрос в текущей формулировке просто лишён смысла.
- 68,117
Git оперирует не файлами, а коммитами.
Коммит — это «снимок» текущего состояния рабочей области. Он содержит полные версии файлов, а не изменения (также называемые дельтами или патчами).
Подробнее о коммитах: Каким образом git сохраняет изменившуюся строку при коммите?
Или они сначала сравниваются и заливаются только изменения?
Отчасти вы правы: они действительно сначала сравниваются. Для сравнения файлов используется алгоритм Secure Hash Algorithm. Когда вы заливаете (push) очередные коммиты на удаленный сервер, Git сравнивает значение sha1 для каждого объекта. Если в его истории уже есть объект для этого значения, то повторно закачиваться он не будет. Если нет — то будет закачана полная версия этого файла, а точнее, содержащий его объект типа blob.
на удаленном файл
Как уже отметил alexander barakin, ваш удаленный сервер скорее всего типа bare, то есть не содержит файлов в рабочей области (а только внутренние файлы Git-репозитория).
- 34,094
-
Спасибо за ответ! А если, скажем, мы с другом делаем один проект, работает над одним файлом. Затем я делаю push, заливаю файл. Он ведь уже не сможет сделать push без предварительного pull? И если он сделает pull, то его файл (вместе с его наработками) заменится моим? – Aleksei Kozharin Aug 02 '15 at 23:32
-
2Верно, сделать push без pull он не сможет. А когда он сделает pull, то возможны варианты: либо git сможет самостоятельно решить конфликты при выполнении git pull (например, вы с товарищем правили разные части файла) - тогда у товарища останутся и его изменения, и будут свежие ваши. Либо git не сможет решить конфликты (вы правили одну и ту же часть файла), тогда товарищ увидит что-то вроде error: Your local changes to 'path/to/file' would be overwritten by merge. Aborting.. В этом случае,если он не хочет потерять свои изменения,то будет вынужден сделать commit или stash и решить конфликт – o2gy Aug 03 '15 at 08:53
-
-
1@АлексейКожарин: При попытке сделать pull у друга произойдет конфликт слияния на каждом файле, который изменили вы оба. Если только один отредактировал свой файл, а у другого – изначальная версия, то автоматически будет выбрана новая, измененная. Подробнее о разрешении конфликтов слияния (там про локальные ветки, но разницы никакой нет): http://ru.stackoverflow.com/a/437458/181472 – Nick Volynkin Aug 03 '15 at 09:10
-
спасибо! что-то я напутал - решил, что автор вопроса всегда получает уведомления о комментариях... Еще, как бы запомнить, что здесь
enterозначает "отправить комментарий", а не перевод строки ) – o2gy Aug 03 '15 at 09:28 -
Спасибо за ответы! Получается, мы с другом можем спокойно работать даже над одним и тем же файлом, если делаем изменения в разных частях кода, так? – Aleksei Kozharin Aug 03 '15 at 11:29
-
@АлексейКожарин: можете, но конфликт будете разрешать потом вручную. Читайте ответ по ссылке о том, как это делать вручную. Если можете, то лучше редактируйте разные, несвязанные файлы. – Nick Volynkin Aug 03 '15 at 11:44
-
@АлексейКожарин: кстати, если ответ вас удовлетворяет, пожалуйста, примите его (галочка рядом с ответом) – Nick Volynkin Aug 03 '15 at 11:45