TurtleGit for Mac

View Markdown source ↗

Squash messages and author dates

Select Squash for a commit to combine it into the preceding retained commit. The first retained entry cannot be Squash. Rebase and Cherry Pick pause at the end of each squash group and show an editable multiline Commit Message tab. Review the combined message and choose Continue to approve it. Blank messages are rejected. Literal comment-prefixed lines and Unicode in the approved message are preserved. The pause uses Git's replay metadata; reopening restores the combined message and operation mode. Changes typed before closing are not saved until Continue attempts approval.

The combined commit retains the first commit's author. In Settings → Advanced, SquashDate chooses the author date, matching upstream:

Value Author date
0 (default) First commit in the group
1 Last commit replayed into the group
2 Current time when the message is approved

The setting is captured when the plan is loaded and retained for recovery. Committer dates continue to follow Git's normal behavior. An earlier Edit action's amended message becomes part of the squash message. Each separate group requires its own approval. Abort restores the original branch and HEAD; ordinary conflict resolution and staging still take place through Working Tree.

Implementation and remaining work

Git invokes TurtleGit's own executable as a headless message editor. It records a pending request and exits unsuccessfully to leave the replay paused. The native window treats that request as an editing state rather than an error alert. Git's combination headings are removed from the default message; approved text is committed with verbatim cleanup. Approval amends Git's current partial combined commit with the selected author date, then resumes the persistent todo. Git hooks and signing configuration are not disabled. A failed commit leaves the request and attempted draft available for recovery.

The metadata lives in the worktree's own rebase-merge directory, including for linked worktrees. Requests are tied to their replay step so Skip cannot expose a stale message as a later commit's editor. Split now opens full Commit selection dialogs at Edit or squash pauses. Complete conflict tabs, empty combined-commit choices, author overrides and full displayed keyboard/layout/ accessibility acceptance remain unfinished. Signed sandbox execution and App Store acceptance are not established.

Verification

27 focused Rebase tests pass, including all three date policies, first-author/tree preservation, blank-message rejection, reopening, conflict-to-squash Abort, linked-worktree isolation, two group approvals with an earlier Edit message, failed-hook draft recovery and stale-request protection after Skip. The whole-native receiver passes with Git 2.37.1, 2.39.5, system 2.50.1 and packaged 2.55.0. It hosts the actual multiline editor, checks the captured Advanced preference, suppresses the expected editor-failure alert and approves exact Unicode/comment text through Continue. Events and operations are injected; displayed dialogs and gestures are not verified. Unsigned Debug/App Store builds, bundle audits, exact NOTICE comparisons and site generation pass. Recorded scope and hashes: qa/rebase-squash-2026-10-06.json.

Pinned upstream references: src/TortoiseProc/RebaseDlg.cpp (Squash_Edit, m_SquashFirstMetaData and m_iSquashdate), and doc/source/en/TortoiseGit/tgit_dug/dug_settings_advanced.xml (SquashDate).