понимание git fetch, а затем объединить - PullRequest
59 голосов
/ 06 августа 2010

Исходя из фона SVN, у меня был этот вопрос:

git-эквивалент статуса svn -u

(что такое git-эквивалент svn status -u)

И я понимаю, вы делаете:

git fetch
git log ..origin/master

Но, я предполагаю, что часть origin/master зависит от ветви? Это не обязательно будет мастер, если я отслеживал удаленную ветку?

Я тоже не совсем понимаю git merge origin/master. Я предполагаю, что это просто означает, что git fetch захватил изменения с пульта и поместил их в систему базы данных git как origin / master, а я просто мастер? Что если я получу изменения, проверим, что было сделано, в ужасе от изменений и не хочу сливаться? Как мне в основном отказаться от них?

Ответы [ 2 ]

117 голосов
/ 07 августа 2010

git fetch

git fetch захватывает изменения из удаленного репозитория и помещает их в базу данных объектов вашего репозитория. Он также выбирает ветви из удаленного хранилища и сохраняет их как ветви удаленного отслеживания .

Когда вы выбираете, git сообщает вам, где он хранит каждую ветку в удаленном репозитории, которую он выбирает. Например, вы должны увидеть что-то вроде

   7987baa..2086e7b  master -> origin/master

при получении. Это означает, что «origin / master» хранит, где «master» находится в хранилище «origin».

Если вы изучите файл .git/config, вы увидите следующий фрагмент:

[remote "origin"]
        url = git://git.example.com/repo.git
        fetch = +refs/heads/*:refs/remotes/origin/*

Это (среди прочего) означает, что любая ветвь 'A' ('refs / head / A') в удаленном источнике (хранилище, из которого вы клонировали) будет сохранена как 'origin / A' ('refs / remotes / origin / А ').

git log .. происхождение / мастер

Как вы видите, origin / master - это master в origin. Если вы используете ветку 'master' (по умолчанию), то git log ..origin/master, что эквивалентно git log HEAD..origin/master, которое, когда на ветке 'master' эквивалентно git log master..origin/master, перечислит все коммиты, которые находятся на ветке 'master' в удаленный репозиторий и не находится в локальной ветке 'master', где вы выполняете свою работу.

Более общей версией в современном git (при условии, что существует информация о восходящем / отслеживающем) было бы просто использовать

$ git log ..@{u}

(Здесь @{u} является синонимом @{upstream}, см. gitrevisions manpage).

git merge origin / master

git merge используется для соединения двух строк истории. Если одна из сторон не выполняла никакой работы с момента последней точки ветвления (начиная с базы слияния), ситуация может быть либо fast-forward (ветвь, в которой вы находитесь, просто обновляется до кончика ветви, которой вы являетесь слияние), или актуальный (нет ничего нового для слияния, и ветка, в которой вы находитесь, остается неизменной).

git fetch, за которым следует git merge origin/master, когда в ветке 'master' эквивалентно выдаче

$ git pull

Если вы не хотите объединяться, вам не нужно. Обратите внимание, что вы можете использовать, например, git reset --hard HEAD@{1} чтобы вернуться назад и отбросить результат git pull, если вам это не нравится.

5 голосов
/ 06 августа 2010

git fetch загружает все изменения, необходимые для представления данной удаленной ветви. Обычно это origin/master или аналогичный.

git merge объединяет две ветви вместе, создавая новые коммиты или ускоренную перемотку (или комбинацию). Он не меняет сделанные вами коммиты, и вы всегда можете вернуться к своей старой ветке (используя git reset или git checkout).

Обратите внимание, что git pull - это git fetch, за которым следует git merge (или git rebase, если указано --rebase).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...