trinity-devel@lists.pearsoncomputing.net

Message: previous - next
Month: March 2012

Re: [trinity-devel] New tdewebdev GIT source Fails to build - crashes at 100% (tqt_enter_modal/tqt_leave_modal)

From: Nix <nix@...>
Date: Fri, 09 Mar 2012 20:40:38 +0000
On 9 Mar 2012, Darrell Anderson spake thusly:

>> Pushing never does a merge of any kind. You can only push on top of a
>> remote branch containing content you haven't pulled if you do a push
>> -f, and that *deletes* the content you haven't pulled (hence the need
>> for a -f 'force' argument).
>
> What then is the correct way to push patches? Is this correct?
>
> cd [module]
> git pull
> merge patches to module
> git commit -a
> git push

That's unpleasant to use: if that merge fails, you have no choice but to
resolve the conflicts yourself, and you can't tell what sort of mess the
system might make doing the working-tree merge. That's the CVS approach,
where all pulls are fraught with fear because you don't know what might
get dropped on top of your work, but you *do* know you'll have to clean
up the mess before you do anything else.

Generally,

git branch working-branch
write code
commit -a
write code
commit -a
git checkout master
git pull
git merge working-branch
git push
git branch -d working-branch # if you're done with this change

is the recommended git workflow for nontrivial changes. This leads to a
tree looking like

A -- B -- C -- D -- E -- [merge]
\                        /
 --- a -- b -- c -------- (this was 'working-branch')

(where a, b, and c are commits you wrote, and B, C, D, and E are commits
written upstream).

This lets you work on multiple changes in parallel, insulated from
changes to upstream until *you* decide you want to adapt to them.

But, if you don't want to use a working branch, you can just say

write code
commit -a
write code
commit -a
git checkout master
git pull
# resolve conflicts
git push

which has the effect of producing the same shape of tree without needing
any sort of branch.

You can even say

git branch working-branch
write code
commit -a
write code
commit -a
git checkout master
git pull
git checkout working-branch
# more write/commit, more pulls from master
# hmm, it's been a while, I've pulled from master several times, I want
# to make this branch depend on whatever is master *now*
git rebase master
# now 'working-branch' is based on the tip of 'master' again, just as
# if you branched from master one second ago and then did all your work
# with the aid of a time machine. Test it, and then...
git checkout master
git merge working-branch
git push

and now you'll find that there is no merge commit at all: everything is
linear again, with the caveat that if there are any conflicts in *any*
of your intervening while 'git rebase' is running, you have to fix them
up one by one, with 'git rebase --continue' in between. (It warns you
if you have to do this, and you can give up with 'git rebase --abort'
and undo the whole thing.)

(In recent versions of git, 'git pull --rebase' will give you this
workflow whenever you pull, if you don't want to use a branch.)

-- 
NULL && (void)