[Bf-committers] Git issues and workarounds

Julien RIVAUD (_FrnchFrgg_) frnchfrgg at free.fr
Tue Nov 26 23:14:49 CET 2013


Le 26/11/2013 22:25, GSR a écrit :
> Was 50fbebe0 done with "git commit -a"? That explains 780459e4. ;) It 
> was just cosmetic, but other errors can be compile breaking (half 
> edited files with true syntax errors, eg), and in any case, using 
> something like git, there is no reason for such noise. There is a need 
> to "change gears" and use the tools with more precision. There are 
> status, diff, log, --amend, "squash"... to check and solve issues 
> before pushing. 
I totally agree with that; it is time to learn how to take advantage of 
the "commit != publish" specificity of distributed VCSs to author high 
quality commits. When we converted the SVN history from git we fixed a 
lot of commit series where all but the first were to (incrementally) 
correct mistakes found in the first commit. The hope was that with git 
such mistakes should happen a lot less, not because people get it right 
the first time, but because they can look at their commit *after doing 
them* but before it is too late to fix them.

We need to make blender devs learn not to commit + push in the same 
breath. You can have your work wait even a day or two in your repository 
before pushing, as long as they are committed you won't mix all your 
changes in a single commit.

The COMMIT OFTEN adage hasn't ever been more true, but it doesn't equate 
to "push often".

git commit --amend is your friend, and even more is git rebase 
--interactive origin/master

For instance: you write a small change, then commit it (commit A). Then 
you make another unrelated change that you also commit (commit B, 
because you have a healthy commit habit). And now you find a mistake in 
your first change !
No problem: write the fix, and commit it (commit C). Your history is now:

X --- A --- B --- C <- master is here (where X is last commit on 
origin/master)

When you do git rebase --interactive origin/master, git will open an 
editor, allowing you to reorder your commits, and even to ask that C's 
changes are integrated into A, so that your history now looks:

X --- A' --- B' <- master

where A' has changes of A and C, and B' is just B (but its SHA1 changed 
due to the way git works)

That enables pushing high quality commits. You can even use that to 
write a feature with history that matches your train of thought and your 
mistakes and progressive understanding... When it's time to integrate 
into blender, you rewrite the series so that it appears that your 
changes are all smart with a vision, with seemingly small 
non-controversial changes but whose cumulative effect amount to a total 
rewrite. In short, you can pretend you are a smart guy that never 
wandered and found from the beginning the best way to gradually 
introduce a disruptive change so that it is smooth instead.

That is good; if people reading blender history think of you that you 
are geniuses who never fail, you'll have less regressions, easier 
bisecting because all commits compile, etc...

ALSO, git has a specificity that you don't find in other VCSs (or not as 
good anyway): the staging area (a.k.a. the index); you can have a lot of 
changes in your working directory, but only commit parts of them.

"git add -p" is almost as good a friend as "git rebase -i"

It will present you with patch hunks of all changes in your work dir, 
and you can select those that are relevant to your next commit. A good 
way to write and commit a small fix while you were writing a feature.


_FrnchFrgg_


P.S: Sorry for the huge mail


More information about the Bf-committers mailing list