Re: Master and origin/master diverged
From: Hilco Wijbenga <hidden>
Date: 2016-06-15 22:54:10
On 22 June 2012 16:47, Neal Kreitzinger [off-list ref] wrote:
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-onlyIs 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 isquoted
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?
(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.