Ah - I think I know whats happened - I didn’t do a proper reset of my fork - 
the real command is:

Tims-MacBook-Pro:pharo-exercism macta$ git fetch exercism
Tims-MacBook-Pro:pharo-exercism macta$ git reset --hard exercism/master
HEAD is now at 28a7a95 Update readme for pharo smalltalk repo name #2 (#134)
Tims-MacBook-Pro:pharo-exercism macta$ git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
To github.com:macta/pharo-exercism.git
 + 16293c4...28a7a95 master -> master (forced update)

And then you need to make sure you fetch in Pharo again (obvious, but easy to 
forget)

Now I think I’m in good shape.

Tim

> On 19 Feb 2019, at 15:45, Tim Mackinnon <tim@testit.works> wrote:
> 
> Once again - super helpful - I’ll definitely bookmark this one. Half the 
> problem is that every time I think I understand what is going on and 
> confidently do a bunch of stuff I then discover that its not what I thought. 
> I then jump over to IntelliJ to visualise what the current state is and then 
> try understand how I got to that place - which hasn’t been from doing 
> anything knowingly funky (that comes afterwards when I’ve tried to 
> rationalise/rectify what I think I’m seeing).
> 
> If you don’t mind, I will try and repeat what you’ve said and keep a journal 
> of what I’m doing so we can hopefully make sense of what has happened 3 times 
> now.
> 
> So back to original setup - in GitHub you fork the main repo (pharo for you, 
> but for me it was exercism/pharo due to the name issue - but actually this 
> has proved a useful learning exercise).
> 
> So having forked from exercism/pharo to macta/pharo-exercism , in Pharo I go 
> to clone my repo. (I’ve actually just removed my previous project and said to 
> delete from file system as well)
> 
> So here’s the first thing - if I clone my fork - Pharo helpfully creates 2 
> remotes for me (exercism & origin) if I clone just the origin I then have to 
> add the remote myself - and the prompt for that that is user and url (so a 
> bit less friendly than having the extra GitHub option of user and project).
> 
> So for now - I’ll stick with what I’ve done before (but do you think doing it 
> the more awkward way is better? And can we make it less awkward if it is).
> 
> Now just to be sure - I’ll make sure my fork and origin are in sync (and this 
> is where now I notice why it might have been going wrong, because my current 
> local master is based on that of my fork - which I notice currently on GitHub 
> says its “10 commits ahead of exercism:master”) - and this might be why I’m 
> seeing all those extra commits in my PR (?). Scratching my head on this I’ve 
> realised that when I first started out - I accidentally committed to master 
> on my fork before realising that I had forgotten to create a branch - which I 
> then did (but I guess I left my fork master in a bad state).
> 
> So I have now done:
> git reset --hard exercism/master
> 
> Now my GitHub fork page looks like its correct.
> 
> So I’ve done some categorisation changes in a branch and done a commit and 
> pushed those changes to my fork - but when I go to generate a PR on GitHub in 
> my upstream - its showing 10 commits… grrrr
> 
> So it looks like this (and yes its a mess because I’ve been struggling with 
> this for day and getting the same sort of problem)
> 
> <PastedGraphic-1.png>
> 
> The only thing I can think is that after doing that reset - I can’t recall if 
> I did a pull in pharo - so possibly my image was still synced to the repo 
> prior to me making it equal to upstream?
> 
> But I’ve now just switched to master in my image - created a new branch, and 
> made a simple comment change and pushed that branch back to my fork and its 
> still showing 11 commits (when there should be just 1).
> 
> So I don’t understand whats going on?
> 
> My upstream is exercism/pharo-smalltalk and my fork is macta/pharo-exercism - 
> the comment change I just made was id: 
> 84e581c38d351baddf98a172a01b5bf475ec2e25.
> 
> Is it possible my image is just in a funny state and that simply removing the 
> project at the beginning wasn’t enough?
> 
> Tim
> 
> 
>> On 19 Feb 2019, at 13:08, Guillermo Polito <guillermopol...@gmail.com 
>> <mailto:guillermopol...@gmail.com>> wrote:
>> 
>> 
>> 
>> On Tue, Feb 19, 2019 at 2:08 AM Tim Mackinnon <tim@testit.works 
>> <mailto:tim@testit.works>> wrote:
>> Hi Guille - thanks for taking the time to write this up… in the middle there 
>> I finally spotted the crucial bit “clone the original, push to your fork”. I 
>> think thats what I’ve been doing wrong - and it leads to all kinds of 
>> confusion (at least I’m hoping this is what it is).
>> 
>> 
>> You've been doing nothing wrong :).
>> Both are valid things in Git, and to talk about rights and wrongs are fuzzy 
>> at the least there.
>>  
>> As I have cloned from my Fork (and in my defence - its because we were given 
>> a repository that collides with the pharo one - exercism/pharo - and P7 
>> doesn’t let us clone from that) - so I’ve had to clone from my fork.
>> 
>> Yeh, that's a bug. It should not be difficult to fix.
>> The thing is, iceberg distinguishes repositories/projects by name.
>> And names are obtained from the repository/project directory name.
>> Then, the plugin made to simplify contributions to pharo, detects the 
>> repositories called "pharo" as pharo themselves and do some extra 
>> configuration. What happens in your case is that your repository suffers 
>> from that extra configuration, which is not the right thing to do in your 
>> case...
>> 
>> One Idea that was poking around in my head is to be able to "rename" a 
>> project independently of its location in disk.
>> We already have a metadata file at the root of the repository. We could add 
>> in that metadata file properties like:
>>  - the project's name (for example you could call it "pharo-exercism" in 
>> there, while keeping the tree structure)
>>  - an extra special property "isPharoRepository : true" that may be defined 
>> only for pharo
>>  - a canonical-repository url which could be used to compare against pharo's 
>> canonical url
>> 
>> Implementing the detection of pharo's repository using any of those 
>> strategies could solve your problem...
>> What do you think?
>>  
>> It all seemed to work until I started submitting my PR’s and then they seem 
>> to include commits going much further back than I think they should need 
>> Even wen I thought I was being careful and syncing to master - it still 
>> seems to go back to some of my earliest work.
>> 
>> This looks like a mis-manipulation of branches, and It smells to me that it 
>> is not related to the issue above...
>> Next time it happens, I'd like, if you can, that you share with me the exact:
>>  - branch
>>  - commitish
>> 
>> that you're trying to make a PR from, to see if we can see the real cause, 
>> and at least build some docs on it ^^.
>> 
>> 
>> Now that we have managed to get the repo renamed - I will try working like 
>> you have suggested and make sure that it is working like you describe - as 
>> it shouldn’t be as complicated as this to make clean isolated changes and 
>> then submit them as a PR. (otherwise Pharo would fall apart).
>> 
>> One question I do have however - is what is the best procedure if you 
>> realised when making changes that 
>> A) you forgot to make changes in a branch (so are working on master)
>> 
>> It depends if your changes have been pushed or not.
>> 1) First thing is to fix your local branch with the expression I told in a 
>> previous email
>> 
>> repo branch commit: repo branch commit parent.
>> 
>> 2) If you have already pushed, that means that you have to rewrite the 
>> history on the remote side, and that would require a push force (from the 
>> command line so far, unless you would like to implement that in iceberg :P).
>>  
>> B) you are working in a branch but decide some of your changes should go in 
>> another branch itself based on master (how to stash?)
>> 
>> There is no stash mechanism in iceberg (so far).
>> What I do is:
>>  - I checkout the base branch (master in this case) in expert mode => do not 
>> touch my image code, then the image itself will work as a stash
>>  - I now checkout a new branch (that will "fork" from the last commit in my 
>> master branch)
>>  - I commit only the things I want to commit.
>> 
>> (see that this is not much different from what you would have done from the 
>> terminal except that the checkout strategy will make the stashing 
>> unnecessary:
>>  - git stash
>>  - git checkout master
>>  - git checkout -b myBranch
>>  - git stash pop
>>  - git commit
>> )
>> 
>> Then you can either 
>>  - discard all your extra changes (I'd suggest to have committed them 
>> earlier :)) to be in a clean master+yournewchanges
>>  - or you can go back to your first branch
>>  
>> 
>> These are 2 common scenarios I’ve found when trying to be a good citizen for 
>> my little project. Do I have to go to the terminal to do this stuff -  or 
>> can I cleanly do these kinds of operations in Pharo (which I think you 
>> should be able to do, as its so easy to get into either of those states).
>> 
>> 
>> I think you can do everything so far except the push force.
>> 
>> Still I'm not happy with what we have (and I'd like to have 48h days) :)
>> 
>> To help in your first scenario:
>> - It should not be difficult to get the reset on the UI 
>> (https://github.com/pharo-vcs/iceberg/issues/1174 
>> <https://github.com/pharo-vcs/iceberg/issues/1174>) ;)
>> - The same with the push force
>> 
>> For the second scenario, what bothers me the most is the special checkout 
>> that may confuse people.
>> Also, while you're doing it, you may have not committed your code anywhere 
>> => and that's dangerous, because you may lose it.
>> 
>> So, imagine this: you are in branch A and you have these changes that you 
>> wan to put in branch B.
>> Instead of doing strange stashing/checkout blah, you create a new branch 
>> temp/AtoB and commit there.
>> And then you move to B and apply a smart cherry pick operation of your 
>> changes.
>> Martin was visiting the team last week and he had a super nice prototype: 
>> you select what you want to cherry pick from a branch and it automatically 
>> selects all (static) dependencies in the same branch, and proposes you doing 
>> a commit/merge of that.
>> I don't know how far are we from this, but it would be super nice to do easy 
>> backporting between branches (think pharo8 -> pharo7).
>> 
>> Guille
>> 
>> Thanks in advance.
>> 
>> Tim
>> 
>>> On 18 Feb 2019, at 08:56, Guillermo Polito <guillermopol...@gmail.com 
>>> <mailto:guillermopol...@gmail.com>> wrote:
>>> 
>>> Hi!
>>> 
>>> On Fri, Feb 15, 2019 at 7:06 PM Tim Mackinnon <tim@testit.works 
>>> <mailto: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
>>> 
>> 
>> 
>> 
>> -- 
>>    
>> Guille Polito
>> Research Engineer
>> 
>> Centre de Recherche en Informatique, Signal et Automatique de Lille
>> CRIStAL - UMR 9189
>> French National Center for Scientific Research - http://www.cnrs.fr 
>> <http://www.cnrs.fr/>
>> 
>> Web: http://guillep.github.io <http://guillep.github.io/>
>> Phone: +33 06 52 70 66 13
> 

Reply via email to