App-Sqitch
view release on metacpan or search on metacpan
lib/sqitchtutorial-snowflake.pod view on Meta::CPAN
> git reset --hard HEAD
HEAD is now at 31d026c Merge branch 'lists'
That throws out our botched merge. Now let's go back to our branch and rebase
it on C<main>:
> git checkout hashtags
Switched to branch 'hashtags'
> git rebase main
First, rewinding head to replay your work on top of it...
Applying: Add hashtags table.
Using index info to reconstruct a base tree...
M sqitch.plan
Falling back to patching base and 3-way merge...
Auto-merging sqitch.plan
CONFLICT (content): Merge conflict in sqitch.plan
error: Failed to merge in the changes.
Patch failed at 0001 Add hashtags table.
Use 'git am --show-current-patch' to see the failed patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Oy, that's kind of a pain. It seems like no matter what we do, we'll need to
resolve conflicts in that file. Except in Git. Fortunately for us, we can tell
Git to resolve conflicts in F<sqitch.plan> differently. Because we only ever
append lines to the file, we can have it use the "union" merge driver, which,
according to
L<its docs|https://git-scm.com/docs/gitattributes#_built-in_merge_drivers>:
=over
Run 3-way file level merge for text files, but take lines from both versions,
instead of leaving conflict markers. This tends to leave the added lines in
the resulting file in random order and the user should verify the result. Do
not use this if you do not understand the implications.
=back
This has the effect of appending lines from all the merging files, which is
exactly what we need. So let's give it a try. First, back out the botched
rebase:
> git rebase --abort
HEAD is now at 06a0bf4 Add hashtags table.
Now add the union merge driver to F<.gitattributes> for F<sqitch.plan>
and rebase again:
> echo sqitch.plan merge=union > .gitattributes
> git rebase main
First, rewinding head to replay your work on top of it...
Applying: Add hashtags table.
Using index info to reconstruct a base tree...
M sqitch.plan
Falling back to patching base and 3-way merge...
Auto-merging sqitch.plan
Ah, that looks a bit better. Let's have a look at the plan:
> cat sqitch.plan
%syntax-version=1.0.0
%project=flipr
%uri=https://github.com/sqitchers/sqitch-snowflake-intro/
appschema 2018-07-27T14:27:24Z Marge N. OâVera <marge@example.com> # Add schema for all flipr objects.
users [appschema] 2018-07-27T15:03:56Z Marge N. OâVera <marge@example.com> # Creates table to track our users.
flips [appschema users] 2018-07-27T15:23:41Z Marge N. OâVera <marge@example.com> # Adds table for storing flips.
userflips [appschema users flips] 2018-07-27T15:23:50Z Marge N. OâVera <marge@example.com> # Creates the userflips view.
@v1.0.0-dev1 2018-07-27T15:40:25Z Marge N. OâVera <marge@example.com> # Tag v1.0.0-dev1.
lists [appschema flips] 2018-07-27T16:00:00Z Marge N. OâVera <marge@example.com> # Adds table for storing lists.
hashtags [flips] 2018-07-27T15:51:16Z Marge N. OâVera <marge@example.com> # Adds table for storing hashtags.
Note that it has appended the changes from the merged "lists" branch, and then
merged the changes from our "hashtags" branch. Test it to make sure it works
as expected:
> sqitch rebase -y
Reverting all changes from flipr_test
- hashtags ................ ok
- userflips @v1.0.0-dev1 .. ok
- flips ................... ok
- users ................... ok
- appschema ............... ok
Deploying changes to flipr_test
+ appschema ............... ok
+ users ................... ok
+ flips ................... ok
+ userflips @v1.0.0-dev1 .. ok
+ lists ................... ok
+ hashtags ................ ok
Note the use of L<C<rebase>|sqitch-rebase>, which combines a
L<C<revert>|sqitch-revert> and a L<C<deploy>|sqitch-deploy> into a single
command. Handy, right? It correctly reverted our changes, and then deployed
them all again in the proper order. So let's commit F<.gitattributes>; seems
worthwhile to keep that change:
> git add .
> git commit -m 'Add `.gitattributes` with union merge for `sqitch.plan`.'
[hashtags 86596a9] Add `.gitattributes` with union merge for `sqitch.plan`.
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 .gitattributes
=head2 Merges Mastered
And now, finally, we can merge into C<main>:
> git checkout main
Switched to branch 'main'
> git merge --no-ff hashtags -m "Merge branch 'hashtags'"
Merge made by the 'recursive' strategy.
.gitattributes | 1 +
deploy/hashtags.sql | 9 ++++++++++
revert/hashtags.sql | 4 ++++
sqitch.plan | 1 +
verify/hashtags.sql | 4 ++++
5 files changed, 19 insertions(+)
( run in 0.576 second using v1.01-cache-2.11-cpan-39bf76dae61 )