2014-12-31 6 views
3

Я могу запустить эти команды и получить ожидаемый результатGit статус вверх и вниз по течению

$ git branch --track test 
$ git checkout test 
$ touch hello.txt 
$ git add hello.txt 
$ git commit -m hello.txt 
$ git status 
On branch test 
Your branch is ahead of 'master' by 1 commit. 

Однако здесь, где мой вопрос

$ git checkout master 
$ git status 
On branch master 
Your branch is up-to-date with 'origin/master'. 

Я хочу знать, если я впереди origin/master, но Я также хочу знать, есть ли я позади test. Ищу команду, чтобы дать мне что-то вроде этого:

On branch master 
Your branch is up-to-date with 'origin/master'. 
Your branch is behind 'test' by 1 commit, and can be fast-forwarded. 

ответ

3

Там нет такого понятия, встроенного, и отслеживание хранится только в другом направлении: «X отслеживает Y», а не «Y отслеживается ... ", что является более сложным, так как часть" ... "может расширяться до более чем одного элемента. (Кроме того, я считаю, что более типичным для Y является ветка удаленного отслеживания в первую очередь, и в этом случае вы никогда не сможете быть на Y, хотя команда, которая пытается найти «какие треки Y», безусловно, может принять аргументы, так что вы могли бы сказать: «расскажи мне о какой-либо из моих ветвей, которые отслеживают origin/master).

Тем не менее, это, конечно, можно строить такая вещь. алгоритм выглядит следующим образом, в Python-эск псевдо-кода :

table = {} 
for branch in local_branches: 
    try: 
     remote, tracked = get_what_branch_tracks(branch) 
    except ValueError: 
     continue # local branch "branch" not tracking anything 
    try: 
     br2 = analyze(branch, remote, tracked) 
    except ValueError: 
     warn('upstream for %s is gone' % branch) 
     continue 
    # at this point br2 is, e.g., origin/master or a local branch that "branch" tracks 
    table.setdefault(br2, []).append(branch) 

# now table[] is a table of branches that are tracked, with 
# each table[key] being the branches that track branch "key" 

Так что теперь для любого интересного филиала (ов), которые находятся в table, вы просто подсчитывают изменения найти, в состоянии в различных парах ветви, точно так же, git status делает, что в оболочке просто:

# to compute "git status" for branch X that tracks Y: 
nahead=$(git rev-list --count Y..X) # we're ahead $nahead commits 
nbehind=$(git rev-list --count X..Y) # and behind $nbehind 

Если вы позади, но не вперед, вы можете быстро вперед.

Детали для get_what_branch_tracks просто сделать некоторые git config --get s, из branch.branch.remote и branch.branch.merge, в то время как данные analyze сложнее: если remote является . то, что находится в tracked просто, но если это настоящий удаленный, все, что находится в tracked, должно проходить через соответствующие строки fetch, чтобы найти соответствующую ветвь удаленного слежения.

Смежные вопросы