{"id":19643777,"url":"https://github.com/logicalclocks/git-nullmerge","last_synced_at":"2025-10-29T04:33:45.950Z","repository":{"id":233566143,"uuid":"688665422","full_name":"logicalclocks/git-nullmerge","owner":"logicalclocks","description":"Git command to find and merge identical trees","archived":false,"fork":false,"pushed_at":"2023-09-07T20:51:32.000Z","size":3,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-01-09T20:09:26.717Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/logicalclocks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-07T20:50:40.000Z","updated_at":"2024-02-29T17:46:52.000Z","dependencies_parsed_at":null,"dependency_job_id":"e2a960e7-f060-4a9a-bb39-a381280bdd5e","html_url":"https://github.com/logicalclocks/git-nullmerge","commit_stats":null,"previous_names":["logicalclocks/git-nullmerge"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logicalclocks%2Fgit-nullmerge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logicalclocks%2Fgit-nullmerge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logicalclocks%2Fgit-nullmerge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logicalclocks%2Fgit-nullmerge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/logicalclocks","download_url":"https://codeload.github.com/logicalclocks/git-nullmerge/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240950325,"owners_count":19883535,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-11T14:23:59.027Z","updated_at":"2025-10-29T04:33:45.853Z","avatar_url":"https://github.com/logicalclocks.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NAME\n\ngit-nullmerge - Find and merge a commit with a tree that matches an ancestor exactly.\n\n# SYNOPSIS\n\n`git nullmerge [OPTIONS] \u003ccommit\u003e`\n\n# DESCRIPTION\n\nWhen a branch has undergone extensive history rewriting, attempting to merge it\ncan result in many false and unnecessary merge conflicts. If such history\nrewriting has preserved the entire tree at some points along the history, a\nso-called null merge can be justified. `git-nullmerge` can automatically find\nthe correct point in history and create a null merge. The message will include a\njustification with an overview of the relavant part of the commit graph.\n\nTechnically, `git nullmerge` will:\n* Find the latest commit `THEIR` such that\n  * `THEIR` is in `\u003ccommit\u003e`\n  * `THEIR` is not in `OUR` (where `OUR` is `HEAD` at start of execution)\n  * There exists a commit `IDENTICAL` such that\n    * `IDENTICAL` is in `OUR`\n    * `IDENTICAL` is not in `THEIR`\n    * `IDENTICAL` and `THEIR` point to identical trees.\n* Make a merge commit with `OUR` and `THEIR` as parents and with a tree identical to `OUR`.\n* Optionally update `HEAD` to point to the newly created merge commit.\n\n# INSTALLATION\n\nPlace `git-nullmerge` somewhere in your `$PATH`.\n\n# EXAMPLE\n\nSuppose a remote repository has altered all commit messages, and also diverged.\nIt will then appear like an unrelated history, and `git merge` will refuse to\nmerge it.\n\n```\n  * (remote) E\n  * C'\n  * B'\n  * A'\n*   (HEAD) D\n*   C\n*   B\n*   A\n```\n\nUsing `git nullmerge remote`, the actual fork point will be identified and\nmerged:\n\n\n```\n  * (remote) E\n* | (HEAD) Null merge\n|\\|\n| * C'\n| * B'\n| * A'\n*   D\n*   C\n*   B\n*   A\n```\n\nAfter this, `git merge` can do a correct merge.\n\n```\n*   (HEAD) Merge\n|\\\n| * (remote) E\n* | Null merge\n|\\|\n* | D\n| * C'\n| * B'\n| * A'\n*   C\n*   B\n*   A\n```\n\n# SEE ALSO\n\n`git replace`: Replace objects in the git graph at the interpretation level.\n\n[`git-reparent`](https://github.com/MarkLodato/git-reparent): Create a commit with the same tree but different parents.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flogicalclocks%2Fgit-nullmerge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flogicalclocks%2Fgit-nullmerge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flogicalclocks%2Fgit-nullmerge/lists"}