17

How can I use GitPython to determine whether:

  • My local branch is ahead of the remote (I can safely push)
  • My local branch is behind the remote (I can safely pull)
  • My local branch has diverged from the remote?

To check if the local and remote are the same, I'm doing this:

def local_and_remote_are_at_same_commit(repo, remote):
    local_commit = repo.commit()
    remote_commit = remote.fetch()[0].commit
    return local_commit.hexsha == remote_commit.hexsha
1

2 Answers 2

19

See https://stackoverflow.com/a/15862203/197789

E.g.

commits_behind = repo.iter_commits('master..origin/master')

and

commits_ahead = repo.iter_commits('origin/master..master')

Then you can use something like the following to go from iterator to a count:

count = sum(1 for c in commits_ahead)

(You may want to fetch from the remotes before running iter_commits, eg: repo.remotes.origin.fetch())

This was last checked with GitPython 1.0.2.

Sign up to request clarification or add additional context in comments.

1 Comment

With a branch that was 3 commits behind and 1 commit ahead, this gave me a sum of 4 for len(list(commits_behind)) and len(list(commits_ahead))
2

The following worked better for me, which I got from this stackoverflow answer

commits_diff = repo.git.rev_list('--left-right', '--count', f'{branch}...{branch}@{{u}}')
num_ahead, num_behind = commits_diff.split('\t')
print(f'num_commits_ahead: {num_ahead}')
print(f'num_commits_behind: {num_behind}')

2 Comments

Thank you for the answer, what's @{{u}}???
I believe it's for "upstream", the double { is to escape the python string formatter {

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.