Monday, December 30, 2013

My Git bits and patterns

Based on the excellent guide by Sam Livingston-Gray: http://think-like-a-git.net

1. Scout Pattern for testing a merge.


Switch to a branch to merge into:
$ git checkout feature_A

        I---J---K feature_B
       /
      F---G---H feature_A
     /
A---B---C---D---E master

Create and checkout a new branch:
$ git checkout -b test_merge

          I---J---K feature_B
         /
        /       L test_merge
       /       /
      F---G---H feature_A
     /
A---B---C---D---E master

Merge with the other branch:
$ git merge feature_B

          I---J---K feature_B
         /         \
        /       L---M test_merge
       /       /
      F---G---H feature_A
     /
A---B---C---D---E master

Resolve merge conflicts and test the merge.

If merge works, keep it and merge into the feature_A:
$ git checkout feature_A
$ git merge test_merge

If merge does not work, switch to feature_A (or "master") and delete the test_merge:
$ git checkout feature_A
$ git branch -D test_merge

To abort the merge:
$ git reset --hard
or
$ git reset --hard feature_A


2. Relative references for testing a merge.


This is an extension of the Scout Pattern, with no extra step to create a checkpoint.

Switch to a branch to merge into:
$ git checkout feature_A

        I---J---K feature_B
       /
      F---G---H feature_A
     /
A---B---C---D---E master

Merge with the other branch:
$ git merge feature_B

        I---J---K feature_B
       /         \
      F---G---H---L feature_A
     /
A---B---C---D---E master

Resolve merge conflicts and test the merge.

If merge works, just keep the feature_A, and do nothing.
If merge does not work, hard reset to a prior checkpoint:
$ git reset --hard HEAD^

        I---J---K feature_B
       /
      F---G---H feature_A
     /
A---B---C---D---E master

Note: the relative checkpoint syntax HEAD^, HEAD^^, HEAD~3, etc.

To abort the merge:
$ git reset --hard


3. Undo a commit with missing info, misspelled messages, etc.


Move to prior checkpoint. This leaves the working tree as it was before "reset" (all local changes since HEAD^ are preserved):
$ git reset --soft HEAD^

Edit and commit files:
$ git commit -a -c ORIG_HEAD

All of the above commands are practical and I would use them in most situations. I have yet to see a case to use the following command.


4. Rebase allows to "replay" part of checkin history at a different base.


So, having the following tree of checkins:

                I---J---K topic
               /
      F---G---H checkpoint
     /
A---B---C---D---E master

To "move" all related checkins, the following command will reapply G, H, I, J, K one-by-one, in order, at the new base "master":
$ git rebase master topic

                              I'---J'---K' topic
                             /
                  F'---G'---H' checkpoint
                 /
A---B---C---D---E master

Note: Those changes at the "topic" branch that were previously applied to "master" in some prior merges, will not be replayed by rebase. Checkins that are not part of the "topic's" history will remain unchanged (C, D, and E).

To specify a subrange of checkins to rebase from the "topic" branch, add "--onto <base>" parameter followed by a range ("checkpoint" to "topic"):
$ git rebase --onto master checkpoint topic

        F---G---H checkpoint
       /
      /           I'---J'---K' topic
     /           /
A---B---C---D---E master


Tuesday, December 3, 2013

FAR File Manager, Beyond Compare, Notepad++ etc. in OS X with Wine

Readjusting to a new platform takes time. For me the most painful departure was from FAR (File and Archive Manager), Beyond Compare (by Scooter Software) and some other tools.

Wine for Mac OS X helps mitigate transition. It wraps platform API (Darwin) into a subset of Win32 libraries, has a convenient installer by Mike Kroneberg, called WineBottler.
Wine is a much more efficient way to experience native Windows applications on a Mac without having to run a full Windows OS in a virtual machine. This saves time, resources and battery life. System resources, external Flash drives, web etc. are available to Wine applications.

I will show how to install FAR, Beyond Compare and how to use them.

1. Get WineBottler
Download it from http://winebottler.kronenberg.org. Open DMG file and drag both Wine.app and WineBottler.app to Applications.

2. Run WineBottler with FAR3 installer
Click the third tab, provide location of your Win32 application installer (or binaries if it's self contained). Here I am providing an MSI installer for FAR, the latest can be downloaded from http://www.farmanager.com (select x86 build).
There is not much else to configure. If you will want to use Notepad++ then make sure to select the "npp" from the Winetricks list (as shown).
Instead of using Win32 Notepad++ on a Mac, I'd suggest you take a look at the TextWrangler (http://www.barebones.com/products/textwrangler/). It is a free multi-document editor with contextual editing, familiar Xcode shortcuts (for example, Cmd+Opt+up-or-down to switch counterparts) etc.
Click "Install". This will walk you through installation steps. You will provide location for your FAR (or any other) app, then WineBottler will set up Wine support, you will see a FAR installer window where you select FAR options (I used defaults). After it finishes you'll find a new directory in user's "Library/Application Support/com.Far3OSX...":
This is where all binaries, Win32 emulation, and Windows-like file system structure will be found. If anything breaks during or after - simply delete the entire folder.

3. Copy and configure Beyond Compare
This is optional, but it is the goal of this post. If you already have Beyond Compare on a Windows machine - all you need is copy binaries and import configuration. Otherwise you can follow simple instructions from the last step, selecting Beyond Compare installer. WineBottler will produce another "/Users/user/Library/Application Support/com.Beyond Compare..." self-contained installation. Grab binaries from its "drive_c/Program Files".
Copy Beyond Compare files to FAR's "drive_c/Program Files". The result should look like this:
Before you will run Beyond Compare.app (or however you called it), , it will ask you to provide license. You can copy and paste any text now from your Mac to Wine-hosted application.

4. Run your FAR3OSX.app (or however you called it)
As mentioned in this thread you will need to edit a startwine file inside the FAR3OSX.app to be able to run it as a console. At the end of the file change "$WINEUSRPATH/bin/wine" to "$WINEUSRPATH/bin/wineconsole".
Run the app. To set default width and height of a console, right-click inside the window and select "Set Default". 


Now you can explore the local drives and manipulate files as you would in Windows. Note that Z: drive refers to the root of your Mac drive, so be cautious. C: drive is an alias to a directory "/Users/user/Library/Application Support/com.Far3OSX_.../drive_c".
Also note that Wine maps "Alt" key to a Command key on Mac keyboard. So instead of hitting "Alt+F1" or "Alt+F2" to change drives, use "Command+F1/F2".
FAR has lots of useful features, some of which are:

  • Built-in text/HEX viewer and editor (with color-coded keywords and familiar copy-paste).
  • Instant history for commands, folders, files. These are also used for line completion.
  • Built-in archiver with a shortcut.
  • Batch folder size calculation.
  • Powerful menu system. More on this next.

5. FAR3 User Menu
Press F2 to invoke the user-configurable menu. In this example I've configured it to list Beyond Compare and a Notepad++.
To edit a single entry hit F4, to open a menu file in an editor hit Command-F4. My menu file looks as follows. Note that I am using full paths to application executables. All the special symbols signify placeholders for the input from the two panels. To learn more about them - press F1 while in user menu.

1:  Beyond Compare 2 panels
    "C:\Program Files\Beyond Compare 2\bc2.exe" "!\" "!#!\"
2:  Beyond Compare 2 selected files
    "C:\Program Files\Beyond Compare 2\bc2.exe" !&
3:  Beyond Compare 2 files in 2 panels
    "C:\Program Files\Beyond Compare 2\bc2.exe" "!^!\!.!" "!#!\!.!"
--:  Notepad++
4:  Notepad++ [files] || [dir]
    "C:\npp\notepad++.exe" !&


The power of FAR now can be seen whenever you need to compare and sync folders or files. Just navigate left panel to one folder and the other panel to a different folder, press F2 and select to "Beyond Compare 2 panels".
Here I am syncing a folder on SanDisk Sansa MP3 player with a folder on a Flash drive.


On the first run Beyond Compare will ask you to register it, or to provide license. FAR and Notepad++ are free.

That's it. Of course there are similar tools available on Mac, but if you've purchased your Windows apps and would rather continue using them - I believe Wine is the best friend.