Я думаю, что ваша основная проблема здесь может заключаться в том, как вы смотрите «branchness фиксаций» (для того чтобы составить фразу). Или, может быть, просто вы ограничиваете свою концепцию «вверх по течению».
Позвольте мне проиллюстрировать это:
...--o--o--o--o <-- master, origin/master
Это рисунок, по крайней мере четырех фиксаций на ветви master
с master
синхронно с origin/master
.
...--o--o--o--o <-- origin/master
\
o <-- master
Это же хранилище, после добавления один коммит master
, что не на origin/master
, так что отрасль master
является «вперед 1», так как git status
бы выразился.
Теперь давайте master
туда, где он был, но держать это новое обязательство, добавив его на newbr
, которые мы сделали с git checkout -b newbr
вместо того, чтобы просто добавить его на master
:
...--o--o--o--o <-- master, origin/master
\
o <-- newbr
Вы хотите Git, чтобы быть в состоянии чтобы сообщить вам, что newbr
является «1 впереди» что-то. Проблема заключается в определении «чего-то».
Вот основной трюк: все те коммиты, которые находятся на master
, а также на origin/master
, которые также на newbr
. Записи могут быть на многих ветвях одновременно, включая несколько локальных и удаленных отслеживающих ветвей.
Путь git status
вычисляет «вперед» и «за» номер заключается в использовании git rev-list --count
, и использовать «вверх» настройку для исключающих фиксаций, которые как на текущей ветви и вверх по течению. Таким образом, на нашей второй иллюстрации, когда master
был «впереди 1», оба master
и origin/master
имели по крайней мере первоначальные четыре фиксации, но master
имели еще одно значение, отличное от origin/master
.
(Что git status
делает это git rev-list --count origin/master..master
, то есть, считать все, что осталось после выбора всех фиксаций на master
минус все совершающие на origin/master
. Конечно, вместо буквального master
, он использует текущую ветвь, а вместо буквального origin/master
он использует вверх по течению вашего текущего филиала.)
что это означает, что, чтобы получить git status
сообщать о таких вещах, как это, мы должны выбрать, по крайней мере временно-некоторые отрасли, возможно, даже местной ветви, а не отдаленный -отслеживая ветвь, чтобы установить как «вверх по течению» для newbr
.
В этом конкретном чертеже, как master
, так и origin/master
являются подходящими значениями для восходящего потока в git branch --set-upstream-to
. Ваш репозиторий будет несколько отличаться, но будет имя для фиксации, которое вы хотели бы, чтобы ваш Git начал исключать. (Даже если этого нет, вы можете просто создать новую ветку для точки исключения, но там почти всегда есть один.)
Используйте git log --graph --oneline --decorate --all
, чтобы получить Git, чтобы нарисовать текстовую версию этих графиков (по вертикали, вместо горизонтали) с метками, показывающими, какие имена ветвей и тегов указывают на то, что они совершают. Это обычно делает визуально очевидным, какие названия (ветви) подходят для имени восходящего потока.
Помните, что локальные ветви прекрасно работают как восходящий поток, если вы помните, что нужно повторно установить восходящий поток после того, как у вас есть соответствующая ветвь удаленного отслеживания.
(Кстати, если вам не нравится использовать локальную ветку в качестве восходящего потока для вашей новой ветки, вы можете создать ветку на вашем пульте, указывая на фиксацию вашей ветви «начинается с». Например, в пример иллюстрации выше, вы можете origin/newbr
, чтобы указать на то передай, как master
и origin/master
Таким образом, вы можете использовать:.
git push origin master:newbr
создать newbr
на удаленном origin
, указывая на то передай локальные master
указывает на один раз. вы сделали это, origin/newbr
сейчас существует, поэтому сейчас лет u может установить его как восходящий поток для newbr
.
Если есть более конкретные фиксации, идентифицировать только его хэш-ID, вы можете даже использовать это:
git push origin a123456:refs/heads/newbr
При определении фиксации его сырым SHA-1 хэш, вы должны сформулировать полные эталонные имена например, потому что Git больше не может использовать ваше местное имя, чтобы выяснить, была ли ваша ветка или тег.)
Если у вас есть только несколько коммитов (скажем, менее 10 или около того), я бы просто использовал 'git log' и подсчитайте количество коммитов, которые вы хотите включить. Если у вас есть десятки коммитов (плохой этикет Git), тогда, вероятно, есть способ найти самую последнюю фиксацию, которую вы делали _not_ make, и вы могли рассчитывать оттуда, предполагая, что вы совершили все коммиты, произошедшие после этого момента. –
Связанные: http://stackoverflow.com/questions/31982954/how-can-i-check-whether-two-branches-are-even/31985138#31985138 – Jubobs
git cherry -v origin/master | wc -l (но я не уверен, что это самый простой способ) –