Подтвердить что ты не робот

Понимание git fetch, затем слияние

Исходя из svn-фона, у меня возник вопрос:

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

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

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

git fetch
git log ..origin/master

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

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

4b9b3361

Ответ 1

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/heads/A" ) в удаленном источнике (репозиторий, который вы клонировали) будет сохранена как "origin/A" ("refs/remotes/origin/А ').

git log..origin/master

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

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

$ git log [email protected]{u}

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

git merge origin/master

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

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

$ git pull

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

Ответ 2

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

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

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