Я установил несколько веток удаленного отслеживания в git, но мне кажется, что я никогда не смогу объединить их в локальную ветку после того, как обновлю их с помощью «git fetch».
Например, предположим, что у меня есть удаленная ветка с именем «an-other-branch». Я установил это локально как ветку отслеживания, используя
git branch --track an-other-branch origin/an-other-branch
Все идет нормально. Но если эта ветка обновляется (обычно я перемещаю машину и фиксирую ее с этой машины), и я хочу обновить ее на исходной машине, у меня возникают проблемы с выборкой / слиянием:
git fetch origin an-other-branch
git merge origin/an-other-branch
Каждый раз, когда я это делаю, я получаю сообщение «Уже обновлено», и ничего не сливается.
Однако
git pull origin an-other-branch
всегда обновляет его так, как вы ожидаете.
Кроме того, запуск git diff
git diff origin/an-other-branch
показывает, что есть различия, поэтому я думаю, что у меня неправильный синтаксис.
Что я делаю не так?
РЕДАКТИРОВАТЬ [2010-04-09]: я проверял пару раз, и я определенно не на другой ветке. Должен ли мой git fetch, за которым следует git merge (как показано выше), делать то же самое, что и git pull? Я получу рабочий процесс, показывающий результаты статуса git и т. Д.
git fetch origin an-other-branch
сохраняет полученную подсказкуFETCH_HEAD
, но не сохраняетorigin/an-other-branch
(то есть обычную «ветку удаленного отслеживания»). Таким образом, можно было бы сделать этоgit fetch origin an-other-branch && git merge FETCH_HEAD
, но делать это так, как говорит @Gareth, лучше (или просто использовать git pull ).git merge origin/an-other-branch
объединяться соorigin/an-other-branch
всеми локальными ветками, которые настроены для его отслеживания? как я могу объединиться только в одну локальную ветку?git pull
(без аргументов) - какую ветвь объединяет? Объединяет ли он ветвь удаленного отслеживания, соответствующую текущей ветке?Выбор только одной ветки:
fetch
/merge
vs.pull
Люди часто советуют отделить «получение» от «слияния». Вместо этого говорят:
сделай это:
Что они не упоминают, так это то, что такая команда выборки фактически извлекает все ветки из удаленного репо, что не является тем, что делает эта команда извлечения. Если у вас есть тысячи веток в удаленном репо, но вы не хотите видеть их все, вы можете запустить эту неясную команду:
Конечно, это до смешного сложно запомнить, поэтому, если вы действительно хотите избежать получения всех веток, лучше изменить ваш,
.git/config
как описано в ProGit.А?
Лучшее объяснение всего этого можно найти в главе 9-5 ProGit, Git Internals - The Refspec ( или через github ). Это невероятно сложно найти через Google.
Во-первых, нам нужно прояснить некоторую терминологию. При удаленном отслеживании ветвей, как правило, нужно знать 3 разных ветки:
refs/heads/branchB
внутри другого репоrefs/remotes/remoteR/branchB
в вашем репоrefs/heads/branchB
внутри вашего репоВетви удаленного отслеживания (in
refs/remotes
) доступны только для чтения. Вы не изменяете их напрямую. Вы изменяете свою собственную ветку, а затем нажимаете на соответствующую ветку в удаленном репо. Результат не отразится на вашемrefs/remotes
до тех пор, пока не будет выполнено соответствующее извлечение или выборка. Мне было трудно понять это различие из man-страниц git, в основном потому, что local branch (refs/heads/branchB
), как говорят, «отслеживает» ветку удаленного отслеживания при.git/config
определенииbranch.branchB.remote = remoteR
.Думайте о «refs» как о указателях C ++. Физически это файлы, содержащие SHA-дайджесты, но в основном это просто указатели на дерево коммитов.
git fetch
добавит много узлов в ваше дерево фиксации, но то, как git решает, какие указатели перемещать, немного сложно.Как упоминалось в другом ответе , ни
ни
будет двигаться
refs/remotes/branches/branchB
, а последний, конечно, не может двигатьсяrefs/heads/branchB
. Однако оба двигаютсяFETCH_HEAD
. (Вы можетеcat
внутри любого из этих файлов.git/
увидеть, когда они изменятся.) Иgit merge
будет ссылаться наFETCH_HEAD
, при настройкеMERGE_ORIG
и т. Д.источник
Вы уверены, что
an-other-branch
при слиянии находитесь на локальном компьютере ?Другое объяснение :
Но в вашем случае, если
git pull
работает, это просто означает, что вы не на правильной ветке.источник
Git pull на самом деле является комбинированным инструментом: он запускает git fetch (получение изменений) и git merge (объединение их с вашей текущей копией)
Вы уверены, что находитесь в правильной ветке?
источник
это команды:
если вы сделаете это во второй строке:
он попытается объединить локальный мастер в вашу текущую ветку.
Вопрос, насколько я понял, был ли вы уже загружены локально и хотите теперь объединить свою ветку с последней из той же ветки.
источник