Git: ваша ветка опережает 'upstream / master' на 2 коммита - PullRequest
0 голосов
/ 13 марта 2020

Я видел что-то вроде: Your branch is ahead of 'origin/master' by 2 commits. Но на этот раз я получаю upstream/master вместо origin/master. Не могу понять почему?

abc@xyz MINGW64 /d/new (master)
$ git status
On branch master
Your branch is ahead of 'upstream/master' by 2 commits.
  (use "git push" to publish your local commits)

До этого я обновлял свой мастер (дважды) через git pull upstream master, что неожиданно создало новый коммит для обновления. Я думаю, что эти два коммита обновления - это два коммита, которые локальный мастер "опережает вверх по течению / мастер". Но есть ли какая-то конкретная c причина / решение для этого?

Теперь, если я объединю своего мастера с какой-либо веткой, эти 2 коммита также станут частью ветви и, конечно же, произойдут в моем PR, когда Я пу sh это.

Я работаю над Windows 7.

1 Ответ

0 голосов
/ 13 марта 2020

Я видел что-то вроде: 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, но есть некоторые незначительные различия.

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