Я видел что-то вроде: Your branch is ahead of '<strong>origin</strong>/master' by 2 commits
. Но на этот раз я получаю <strong>upstream</strong>/master
... почему?
Вы установили восходящий поток своей ветви на upstream/master
. Каждая ветвь может иметь один восходящий поток (или нет восходящего потока, если хотите). Команда git status
будет сравнивать достижимые коммиты из ветви и ее восходящего потока, подсчитывать и сообщать вам, находится ли ваша ветвь впереди, позади или расходится, основываясь на этих значениях. вверх по течению) настройка для каждой ветви. Обратите внимание, что слово «восходящий поток» здесь не такое же, как upstream
remote , т. Е. Тот факт, что какая-то ветвь имеет некоторый восходящий поток, не зависит от того, пульт с именем upstream
. (Git очень плохо использовать такие слова, как это смущает.)
Но есть ли какая-то конкретная c причина [быть впереди на два]?
git pull
означает Выполнить две команды Git: сначала выполнить git fetch
. Затем выполните вторую команду Git на мой выбор, git merge
или git rebase
, используя все, что вы получили при запуске первой команды Git.
В этом случае вы запустили git pull upstream master
, так что это запустилось:
git fetch upstream
с последующим (возможно, если вы не изменили свои настройки)
git merge <something>
здесь немного сложно объяснить, 1 , но git merge
может, и в этом случае, вероятно, создал новый коммит.
Чтобы точно знать, что произошло, мы должны знать:
- что было в каждом хранилище до
git fetch
, что говорит нам - , что сделал
git fetch
, что позволяет нам определить - , что сделал
git merge
.
Я обычно рекомендую новичкам Git избегать git pull
и вместо этого (1) узнавать, что каждая из этих команд (git fetch
, git merge
, и git rebase
) делает, затем (2) использует команды индивидуально и отдельно. Это может все еще сбивать с толку и быть немного сложным, но у вас гораздо больше шансов понять, что происходит, если вы сделаете это таким образом.
Обратите внимание, что когда вы делаете это, у вас есть возможность вставить некоторые третья Git команда между двумя. Например, когда вы знаете, как интерпретировать вывод git log
, вы можете сказать: Я запустил fetch, теперь я хотел бы запустить git log --all --decorate --oneline --graph
, чтобы посмотреть, что git fetch
сделал.
(Как только вы узнаете, что каждая команда делает и может все предсказать, , затем безопасно или, по крайней мере, безопасно - i sh, использовать выборку "все в одном" и затем объединить or-rebase "git pull
. Я до сих пор в основном этого не делаю: мне нравится запускать эти дополнительные git log
команды или некоторые из них, основываясь на том, что говорит git fetch
.)
Если вы хотите избавиться от этих коммитов слияния, вы можете сделать это с git reset
или с большинством разновидностей git rebase
. Но, возможно, вам стоит оставить эти коммиты слияния - это может быть лучше. Что использовать и когда, это вопрос ситуации, а в некоторых случаях и личного вкуса - здесь нет единого правильного действия. Git предоставляет множество отдельных инструментов, с помощью которых вы можете создавать свои собственные решения, но по большей части это не само решение.
1 git fetch
оставляет в файле в вашем Git хранилище с именем FETCH_HEAD
некоторую информацию о трассировке. Команда pull извлекает эту информацию и создает из нее команду git merge
. Учитывая аргументы upstream
и master
, эффект почти такой же, как если бы вы запустили git merge upstream/master
, но есть некоторые незначительные различия.