Thread (10 messages) flat view 10 messages, 3 authors, 2016-06-15

Re: Master and origin/master diverged

From: Neal Kreitzinger <hidden>
Date: 2016-06-15 22:54:11

On 6/25/2012 9:49 PM, Hilco Wijbenga wrote:
On 22 June 2012 16:47, Neal Kreitzinger [off-list ref] wrote:
quoted
On 6/22/2012 3:18 PM, Hilco Wijbenga wrote:
quoted
On 22 June 2012 12:01, Neal Kreitzinger [off-list ref] wrote:
quoted
On 6/22/2012 12:53 PM, Hilco Wijbenga wrote:
quoted
One of my developers managed to push something that somehow "diverged"
origin/master from everyone else's local master.

A --> B --> C --> D (everybody's local master)
|
\--> B' --> C' --> D' --> E (origin/master)

(i.e., A is the commit where things diverged; everyone's local master
points to D but the new commit (E) that was pushed to origin/master
uses different SHA1s for B, C, and D)...


Now running git pull creates a merge commit joining D and E.

...Does anyone have any idea as to what might have happened? Perhaps if
I

understand how this happened I might be able to prevent it from
happening again.
Some ways you can prevent it from happening again:
quoted
(2) have your devs do git pull --ff-only
Is this something that can be set in git config? I looked but didn't
see anything obvious.
OTTOMH, you could change the git fetch config for master and take away the
leading '+' sign which would not allow non-fastforward fetches of master.
  That in turn would prevent merging such a non-ff remote tracking branch of
master into your branch master.


Actually, I guess what I really want is
quoted
something for git push, right?
Some ways to do it:
(1) I think you could have rebase and commit hooks locally that prevent
someone from rewriting history on master.  That in turn would prevent
someone from pushing a rewritten history.
Yes, I have been thinking about that.

How does one create "portable" hooks? I have to deal with GNU/Linux,
OS X, and MS Windows. We all have Java installed so I first thought of
using JGit but I am not clear on how well JGit supports using it in a
hooks. Should I make Ruby a required part of the dev environment and
use Ruby hooks?
I don't know about java, ruby, or JGit (yet).  I make hook updates easy 
with this alias:

get-hooks = !rm -f .git/hooks/pre-commit && git init 
--template=/opt/mydir/git-templates/dev/templates

I update the master copy of the pre-commit hook (in this case) in the 
template and then have the users run git get-hooks.  All my users are on 
the linux server.  Maybe this idea is helpful to you in some way.
quoted
(2) When merging topic branches to master use git merge --ff-only.  Then
when you push it to remote master you know it's a fastforward and not a
history rewrite.
Given how hard it is to teach devs to only push fast-forward merges, I
am not sure how well this would work.
You could create an alias 'git merger' and have them run that and it 
will do the --ff-only option.  Maybe post-merge hook and/or pre-commit 
hook.  I don't think --ff-only was part of your requirements so you can 
probably ignore this since I got off track by suggesting it.  I think 
your problem is history rewrites and not merge commits.  I think (1) 
--ff-only denies merge commits altogether, and (2) denyNonFastForwards 
allows merge commits but denies history rewrites so they (1 and 2) are 
not really the same though they both use the term 'fastforward' they 
have different definitions of what that means.  Someone please correct 
me if I'm wrong because this does seem a bit confusing now that I'm 
saying it out loud.

v/r,
neal
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help