Hi!

On Fri, Feb 15, 2019 at 7:06 PM Tim Mackinnon <tim@testit.works> wrote:

> Hi guys - I’ve spent a few hours scratching my head trying to understand
> why some of my Pull Requests to a project I had forked kept showing my
> previous commits when I thought I was all caught up.
>
> It suddenly dawned on me, that when I had forked, and then done some work
> and then submitted a PR, and then applied it upstream that my fork is now
> no longer in sync with its upstream counterpart.
>
> Having not done this in ages, it took me a while to then realise I have to
> do some git stuff to get it back in sync e.g. (and I think I’ve got this
> right)
>
> git fetch upstream (or whatever name you gave it)
> Git checkout master
> Git merge upstream/master
>

When you did your clone, did you clone the original repository or your
fork's?
One way to simplify this workflow is:
 - you clone always the original repository
 - you create a branch and work there
 - then you'll push your branch to your fork + fork

That way your branch will be always up to date with the original
repository, and no need to sync (actually the sync is done automatically
when you push to your fork).

Of course this assumes you're doing a new clone every time you work :).


>
> So I guess my question is - wouldn’t it be helpful if this was a command
> in Iceberg?


It would, there are several places where we could simplify the workflow for
common cases, I agree.


> It seems quite common to fork a project (I think this is still recommended
> for pharo itself isn’t it?)


I'd say its mandatory :). Otherwise you will not be able to push directly
to it because of permission problems (actually all main dev branches are
now blocked so **nobody**, not even admins, push to them directly).


> - and then at some point you need to catchup with that origin again? Or am
> I missing something?


Well, it really depends on the workflow you use. Above I've explained a
workflow that works when you clone every time.
Git is so complex and so low level that you can do lots of different things
with it.

First thing is to understand what "catch up with origin" means. In my head
it only means:
 - checkout your "to-catchup" branch
 - merge the remote "to-catchup" branch and merge it

All the rest is workflow dependent. Even (!!) I would argue that merging is
not, strictly speaking, a correct way to catch up: If you have made changes
into "to-catchup", then merging will not make both branches the same, but
your "to-catchup" branch may have extra commits that you did not want to
introduce...

And here I'm not saying you should not merge, actually I do it most of the
times because I know that 90% of the times it will be ok, and I do rollback
when I realize I was in the other 10%...


> I guess lots of stuff can go wrong - but if it does - you’d still get the
> same problems on the command line.


Yes, and no. The "lots of stuff can go wrong" can be translated in most of
the cases to "I had a merge conflict". But this is not git, this is
git+pharo.

The thing is that with Git, your code is dead in files. With Iceberg, your
code is in the files but it also may be alive in your image too. So
updating code for what you have existing instances, or announcement
subscriptions or other could (and probably will) mess up with the running
code...
So to the typical merge conflict, you may add breaking your running system.

It just seems that for normal situations - it would be handy to run this
> straight in Pharo.
>
> Thoughts from the git experts?
>

For these cases, you can do exactly as the command line from Iceberg's UI

 - change your branch to your "to-catchup" master
 - fetch
 - now you can go to the merge option, and choose to merge your remote
branch into your checked-out branch.
 - and push

Of course, this simple workflow works most of the times, but you may find
edge cases.
For those edge cases (typically updating iceberg itself, or trying to
update pharo itself), in the checkout preview you will have the combo with
the checkout strategy: choose the expert mode "do not load the code". This
option will change the branch on git's world, but it will not load the code
in your image.

That is useful if you have living instances for example.
This option will though make a diff between the checked out version and
your image code and show you differences. (think this as a git reset --soft)

To me the fact that we are manipulating live code loaded in the image and
not dead files makes a huge difference, and this makes that extrapolating
git commands to iceberg is not so straight forward :). Also, understanding
that git is stateful/context dependant, and applying an operation means
changing your current state (modify your current branch, change your
current branch) is useful to see the consequences.

In any case, any more concrete suggestions for enhancing this workflow are
welcome. I think that neither Esteban, Pablo, me nor other contributors are
skilled UI designers, and thinking about the best way to present a usecase
to a user is super super hard :).

Guille, from his vacations

Reply via email to