Git merge and push

111,915

Root cause: To cut the explanation short, it appears to me that your local/production is not tracking origin/production. You can check this with git branch -avv.

About git push: Note that git push without arguments will update all the remote branches that have updated in your local tracking branches (from the git-push(1) manual page):

git push ...  [<repository> [<refspec>...]]

The special refspec : (or +: to allow non-fast-forward updates) directs git to
push "matching" branches: for every branch that exists on the local side, the
remote side is updated if a branch of the same name already exists on the remote
side. This is the default operation mode if no explicit refspec is found (that is
neither on the command line nor in any Push line of the corresponding remotes
file---see below).

Because the result of simple git push is sometimes little unexpected if forgotten what changes done in local branches, I personally like to explicitly specify which branches I want to push. In your case it seems this is what you want to do:

git push origin local/production:production

If you want local/production to track origin/production, you can make the local/production tracking branch for origin/production using option -u:

git push -u origin local/production:production

(only required once). Then you can pull from origin to local/production.

Executive Summary: you need to understand the concept of tracking branch and the peculiar semantics of git push.

P.S. I am wondering about your choice of your branch name local/production here. Why not just production? I am suspecting you already have production tracking origin/production and maybe use local/production for you local development. In this case a reasonable work flow is like this:

  1. git pull origin production:production to pull the changes to your production
  2. If there are new commits in production, that is local/production is behind then either rebase your local/production on production (or merge production on local/production)
  3. the moment you want to push your changes, merge or cherry-pick your commits to production and push the changes with git push origin production:production.
Share:
111,915

Related videos on Youtube

Martin B.
Author by

Martin B.

about.me/becerra

Updated on July 17, 2022

Comments

  • Martin B.
    Martin B. almost 2 years

    I am starting with Git, so I feel that this question could be the newbiest question of day because this task is so simple, but it's causing a terrible headache..

    I have 2 local branches:

    • master
    • local/production

    And 2 remotes:

    • master
    • production

    I need to pass local changes to production. So, my workflow was:

    git checkout local/production
    git merge master
    git commit
    git push
    

    git merge: Seems Work fine, it detected all differences.

    git commit:

    On branch local/production

    Your branch is ahead of 'origin/production' by 2 commits.

    nothing to commit (working directory clean)

    And git push:

    Everything up-to-date

    So that's all, I couldn't push my changes to remote repository.

  • Martin B.
    Martin B. over 11 years
    You are right @FooF. My problem was that I didn't have linked (or tracked?) branch local/production. So, git push (without arguments) didn't detect this branch. Another solution was adding this to git config: git config remote.origin.push local/prodcution:refs/heads/production. Anywise I agree about explicitly specify which branches you want to push.