Проще говоря, если вы собираетесь сесть на самолет без подключения к Интернету ... перед отъездом вы можете просто сделать git fetch origin <master>
. Он будет загружать все изменения на ваш компьютер, но держать его отдельно от вашей локальной разработки / рабочей области.
В самолете вы можете внести изменения в свое локальное рабочее пространство, а затем объединить его с тем, что вы получили, и разрешить все возможные конфликты объединения без подключения к Интернету. И если кто-то не внес новые противоречивые изменения в удаленный репозиторий, то, как только вы прибудете в пункт назначения, вы сделаете это git push origin <branch>
и отправитесь за кофе.
Из этого удивительного учебника Atlassian :
git fetch
загружает коммиты, файлы и ссылки из удаленного репозитория в ваш локальный репозиторий.
Извлечение - это то, что вы делаете, когда хотите увидеть, над чем работают все остальные . Это похоже на обновление SVN в том, что оно позволяет вам видеть, как продвигается центральная история, но не заставляет вас фактически объединять изменения в вашем хранилище. Git изолирует извлеченный контент как от существующего локального контента , это абсолютно
не влияет на вашу локальную работу по разработке . Извлеченное содержимое должно быть явно извлечено с помощью git checkout
команды. Это делает выборку безопасного способа просмотра коммитов перед их интеграцией в локальный репозиторий.
При загрузке контента из удаленного репозитория доступны git pull
и git fetch
команды для выполнения задачи. Вы можете рассмотреть
git fetch
«безопасную» версию двух команд. Он будет загружать удаленный контент, но не будет обновлять рабочее состояние вашего локального репозитория, оставляя вашу текущую работу нетронутой. git pull
это более агрессивная альтернатива, она будет загружать удаленный контент для активной локальной ветки и немедленно выполняться, git merge
чтобы создать коммит слияния для нового удаленного контента. Если у вас есть ожидающие изменения в процессе, это вызовет конфликты и запустит процесс разрешения конфликтов слияния.
С git pull
:
- Вы не получаете никакой изоляции.
- Это влияет на ваше местное развитие.
- Это не должно быть явно проверено. Потому что это неявно делает
git merge
.
- Это в основном НЕ безопасно. Это агрессивно
- В отличие от ,
git fetch
где она влияет только на .git/refs/remotes
, мерзавец тянуть будет влиять как ваш .git/refs/remotes
и .git/refs/heads/
Хм ... так что, если я не обновляю рабочую копию git fetch
, то где я делаю изменения? Где Git выбирает новые коммиты?
Отличный вопрос Он помещает его куда-то изолированно от вашей рабочей копии. Но опять же где? Давайте выясним.
В каталоге вашего проекта (то есть, где вы делаете свои git
команды) выполните:
ls
, Это покажет файлы и каталоги. Ничего крутого, я знаю.
Теперь делай ls -a
. Это покажет точечные файлы , то есть файлы , начинающиеся с .
вы затем сможете увидеть каталог с именем: .git
.
- Есть
cd .git
. Это, очевидно, изменит ваш каталог.
- Теперь самое интересное; делать
ls
. Вы увидите список каталогов. Мы ищем refs
. Есть cd refs
.
- Интересно посмотреть, что находится внутри всех каталогов, но давайте сосредоточимся на двух из них.
heads
и remotes
. Используйте, cd
чтобы проверить внутри них тоже.
- Все,
git fetch
что вы делаете, будет обновлять элементы в /.git/refs/remotes
каталоге. Это не будет ничего обновлять в /.git/refs/heads
каталоге.
- Любой
git pull
сначала сделает git fetch
, обновит элементы в /.git/refs/remotes
каталоге, затем объединится с вашим локальным, а затем изменит заголовок внутри /.git/refs/heads
каталога.
Очень хороший ответ на этот вопрос также можно найти в разделе Где размещается «git fetch»? ,
Кроме того, ищите «Слеш нотацию» из поста соглашения о наименовании веток Git . Это поможет вам лучше понять, как Git размещает вещи в разных каталогах.
Чтобы увидеть реальную разницу
Просто делать:
git fetch origin master
git checkout master
Если удаленный мастер был обновлен, вы получите следующее сообщение:
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
Если вы этого не сделали fetch
и сделали, git checkout master
то ваш местный мерзавец не знал бы, что добавлено 2 коммита. И было бы просто сказать:
Already on 'master'
Your branch is up to date with 'origin/master'.
Но это устаревшее и неправильное. Это потому, что git даст вам обратную связь исключительно на основе того, что он знает. Он не обращает внимания на новые коммиты, которые еще не снесены ...
Есть ли способ увидеть новые изменения, сделанные в удаленном режиме при локальной ветке?
Некоторые IDE (например, XCode) очень умны и используют результат a git fetch
и могут комментировать строки кода, которые были изменены в удаленной ветви вашей текущей рабочей ветви. Если эта строка была изменена как локальными изменениями, так и удаленной ветвью, то эта строка помечается красным. Это не конфликт слияния. Это потенциальный конфликт слияния. Это headps, который вы можете использовать для разрешения будущего конфликта слияния, прежде чем делать это git pull
из удаленной ветви.
Интересный совет:
Если вы загрузили удаленную ветку, например, сделали:
git fetch origin feature/123
Тогда это будет идти в ваш каталог удаленных. Это все еще не доступно для вашего локального каталога. Тем не менее, это упрощает вашу проверку в этой удаленной ветви с помощью DWIM (делайте то, что я имею в виду):
git checkout feature/123
вам больше не нужно делать:
git checkout -b feature/123 origin/feature/123
Подробнее об этом читайте здесь