App-Sqitch
view release on metacpan or search on metacpan
lib/sqitchtutorial-clickhouse.pod view on Meta::CPAN
Rebase the F<hashtags> branch from main before merging. This "rewinds" the
branch changes, pulls from C<main>, and then replays the changes back on top
of the pulled changes.
=item *
Create a patch and apply I<that> to main. This is the sort of thing you
might have to do if you're sending changes to another user, especially if the
VCS is not Git.
=back
So let's restore things to how they were at main:
> git merge --abort
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
Auto-merging sqitch.plan
CONFLICT (content): Merge conflict in sqitch.plan
error: could not apply 1359929... Add hashtags table.
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
hint: Disable this message with "git config set advice.mergeConflict false"
Could not apply 1359929... # Add hashtags table.
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
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
Successfully rebased and updated refs/heads/hashtags.
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-clickhouse-intro/
users 2025-09-19T18:29:21Z Marge N. OâVera <marge@example.com> # Creates table to track our users.
flips [users] 2025-09-19T18:35:31Z Marge N. OâVera <marge@example.com> # Adds table for storing flips.
userflips [users flips] 2025-09-19T18:38:26Z Marge N. OâVera <marge@example.com> # Creates the userflips view.
@v1.0.0-dev1 2025-09-19T18:39:48Z Marge N. OâVera <marge@example.com> # Tag v1.0.0-dev1.
lists [flips] 2025-09-19T18:41:17Z An Oth R. Developer <another@example.com> # Adds table for storing lists.
hashtags [flips] 2025-09-19T18:47:02Z 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
Deploying changes to flipr_test
+ 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 862ea7a] Add `.gitattributes` with union merge for `sqitch.plan`.
1 file changed, 1 insertion(+)
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 'ort' strategy.
.gitattributes | 1 +
deploy/hashtags.sql | 9 +++++++++
revert/hashtags.sql | 3 +++
sqitch.plan | 1 +
verify/hashtags.sql | 3 +++
5 files changed, 17 insertions(+)
create mode 100644 .gitattributes
( run in 1.204 second using v1.01-cache-2.11-cpan-39bf76dae61 )