DEV Community

Cover image for How I use git on multiple devices
Doug Bridgens
Doug Bridgens

Posted on

How I use git on multiple devices

In the last few years I've been using Working Copy on iPhone/iPad to refine README, code comments, and func/var naming, as part of feature development.

Doing this on devices without the ability to change code has been a big quality driver for me. The draw back is a few unconventional commits at the end of a feature branch.

The commit history can easily get messy, with checkpoint or the evil twins typo and update. Passing temporary changes on my feature branch, up into GitHub, so I can view changes on multiple devices gets a little ugly.

I posted a question about how others have solved this, about what process others use. @ridays2001 gave a good solution πŸ‘

TL;DR

Create a throw away WIP branch from the feature branch, and pull the changes back to your feature branch with a merge --squash.

$ git checkout -b kitchen_orders
  # do main code changes

# setup your wip branch and make accessible
$ git checkout -b wip_kitchen_orders
$ git push --set-upstream origin wip_kitchen_orders
  # do minor updates and changes on this branch

# pull wip changes back onto feature branch
$ git checkout kitchen_orders
$ git merge --squash wip_kitchen_orders

# commit the wip changes as one
$ git commit -a -m 'improves godoc comments'

# clean up wip branch
$ git push origin --delete wip_kitchen_orders
$ git branch -D wip_kitchen_orders
Enter fullscreen mode Exit fullscreen mode

These can all be aliased within the shell.

How it works

Here's a summary write-up showing what you need to know, for multi-device changes with a clean git history.

I'm building out my fictional restaurant app, and want to add store and retrieve kitchen orders.

A feature branch for this change:

$ checkout -b kitchen_orders
Switched to a new branch 'kitchen_orders'
Enter fullscreen mode Exit fullscreen mode

I do a bunch of changes as normal, and end up with:

$ git log --oneline
a45fa9e (HEAD -> kitchen_orders, origin/kitchen_orders) adds kitchen order datastore
2f77e62 adds swp to gitignore
4491447 adds fsvault external package
80df0ca adds config pkg to kitchen
Enter fullscreen mode Exit fullscreen mode

Before I create a PR to merge back to develop, I want to read through the changes and make sure I will understand it in three months time. In a team environment this helps make PR reviews easier too.

So I create a WIP branch from my feature branch, and push that to Github.

$ git checkout -b wip_kitchen_orders          
Switched to a new branch 'wip_kitchen_orders'

$ git push --set-upstream origin wip_kitchen_orders
branch 'wip_kitchen_orders' set up to track 'origin/wip_kitchen_orders'.
Enter fullscreen mode Exit fullscreen mode

This WIP branch is for messy commits, and is used to push and pull changes between devices (iPhone, iPad). It lets me do my own code review in a cafe with a pastry, in a civilised way 😁

For me, this code review process is almost more important than the actual code. It's really a review of how understandable I'm leaving things for my future self.

Depending on the feature/change I may make many updates to improve the readability over a few days, with whatever device I have to hand.

Typically this is what I end up with. A bunch of meaningless commit messages, but essential refinements underneath.

$ git log --oneline
a04d7a6 (HEAD -> wip_kitchen_orders) typo
dadc12a stupid typo
8c0dd3c updates function godoc comments
a45fa9e (origin/wip_kitchen_orders, origin/kitchen_orders, kitchen_orders) adds kitchen order datastore
2f77e62 adds swp to gitignore
4491447 adds fsvault external package
80df0ca adds config pkg to kitchen
Enter fullscreen mode Exit fullscreen mode

Now for the magic. I can pull these WIP changes back into my feature branch without a merge commit.

I switch back to my feature branch, and check it's clean.

$ git checkout kitchen_orders
Switched to branch 'kitchen_orders'
Your branch is up to date with 'origin/kitchen_orders'.

$ git status
On branch kitchen_orders
Your branch is up to date with 'origin/kitchen_orders'.

nothing to commit, working tree clean
Enter fullscreen mode Exit fullscreen mode

Then I can merge my WIP branch with squash to pull over the changes without any commit.

$ git merge --squash wip_kitchen_orders
Updating a45fa9e..a04d7a6
Fast-forward
Squash commit -- not updating HEAD
 kitchen/internal/datastore/order.go | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

$ git status
On branch kitchen_orders
Your branch is up to date with 'origin/kitchen_orders'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   kitchen/internal/datastore/order.go
Enter fullscreen mode Exit fullscreen mode

This leaves me able to apply these WIP changes as a single commit on my feature branch, as if the WIP branch never existed.

So I end up with a long term git log graph like this:


$ alias gl='git log --graph --pretty="%C(green) %d %C(red)Date: %ad %C(yellow) %s" --date=human'

$ gl
*     (HEAD -> develop, origin/develop, origin/HEAD) Date: 27 seconds ago  Merge pull request #5 from thisdougb/kitchen_orders
|\  
| *   (origin/kitchen_orders, kitchen_orders) Date: 82 seconds ago  improves datastore godoc comments
| *   Date: 33 minutes ago  adds kitchen order datastore
| *   Date: 52 minutes ago  adds swp to gitignore
| *   Date: 54 minutes ago  adds fsvault external package
| *   Date: 80 minutes ago  adds config pkg to kitchen
|/  
*     Date: Wed May 1 13:57  Merge pull request #4 from thisdougb/thisdougb-patch-1
|\  
| *   Date: Wed May 1 13:57  Update README.md
|/  
*     Date: Wed May 1 13:55  Merge pull request #3 from thisdougb/part1b
Enter fullscreen mode Exit fullscreen mode

And remember to clean up:

$ git push origin --delete wip_kitchen_orders
To github.com:thisdougb/go-eat.git
 - [deleted]         wip_kitchen_orders
$ git branch -D wip_kitchen_orders
Deleted branch wip_kitchen_orders (was a04d7a6).
$ 
Enter fullscreen mode Exit fullscreen mode

The nice thing about this method is that it's really simple. I can create a WIP branch when I need to, within Working Copy or from another device.

Top comments (1)

Collapse
 
ridays2001 profile image
Riday

Nice post! Thanks for the mention.