2016-06-06 1 views
1

Я слишком долго работал над локальной ветвью, не проталкивая вверх по течению и не теряя количество попыток, которые у меня есть локально.Показать количество разрытых коммитов на локальном (не отслеживаемом) филиале

Я готов раздвигать фиксации, но мне нужно число моих фиксаций точного для того, чтобы раздавить их с git rebase -i HEAD~4 (4 это просто примером).

Как найти этот номер?

Я пробовал git rev-list --count my-local-branch, но он показывает безумно высокое число, которое не то, что я хочу (у меня примерно 6 коммитов).

Также git log --graph --all --decorate --oneline не дал то, что я хотел.

Я думаю, что проблема заключается в том, что my-local-branch не является отслеживаемой удаленной веткой.

Так что я попытался установить это вручную с помощью git branch -u upstream/my-local-branch, но это возвращает error: the requested upstream branch 'upstream/my-local-branch' does not exist.

Чтобы исправить это, я мог бы, конечно, просто нажать мою ветку вверх по течению, но это победит мое первоначальное намерение раздавить мои коммиты.

Так что я чувствую себя застрявшим. Любой, кто может посоветовать?

+0

Если у вас есть только несколько коммитов (скажем, менее 10 или около того), я бы просто использовал 'git log' и подсчитайте количество коммитов, которые вы хотите включить. Если у вас есть десятки коммитов (плохой этикет Git), тогда, вероятно, есть способ найти самую последнюю фиксацию, которую вы делали _not_ make, и вы могли рассчитывать оттуда, предполагая, что вы совершили все коммиты, произошедшие после этого момента. –

+0

Связанные: http://stackoverflow.com/questions/31982954/how-can-i-check-whether-two-branches-are-even/31985138#31985138 – Jubobs

+0

git cherry -v origin/master | wc -l (но я не уверен, что это самый простой способ) –

ответ

4

Я думаю, что ваша основная проблема здесь может заключаться в том, как вы смотрите «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 больше не может использовать ваше местное имя, чтобы выяснить, была ли ваша ветка или тег.)

1

git status скажет вам, сколько издержек за отслежённой удаленной веткой, что вы есть.

Вы были прав, чтобы установить отслеживание на пульте дистанционного управления с помощью git branch -u upstream/my-local-branch, но вам нужно указать имя удаленной ветви, если оно другое, и оно должно существовать.

git checkout master 
git branch -u upstream/remote-branch-name 
Branch master set up to track remote branch remote-branch-name from upstream. 

Теперь вы должны получить счет с git status

git status 
On branch master 
Your branch is ahead of 'upstream/remote-branch-name' by 1 commit. 
    (use "git push" to publish your local commits) 
nothing to commit, working directory clean