{"record":{"id":"4ed1f2290b31aabb","repo":"jesseduffield/lazygit","slug":"new-version-newversion-has-non-backwards-co","errorCode":null,"errorMessage":"New version ({{.newVersion}}) has non-backwards compatible changes compared to the current version ({{.currentVersion}})","messagePattern":"New version \\((.+?)\\}\\) has non-backwards compatible changes compared to the current version \\((.+?)\\}\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"pkg/updates/updates.go","lineNumber":121,"sourceCode":"\tnewVersion, err := u.getLatestVersionNumber()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tu.Log.Info(\"Current version is \" + currentVersion)\n\tu.Log.Info(\"New version is \" + newVersion)\n\n\tif newVersion == currentVersion {\n\t\treturn \"\", errors.New(u.Tr.OnLatestVersionErr)\n\t}\n\n\tif u.majorVersionDiffers(currentVersion, newVersion) {\n\t\terrMessage := utils.ResolvePlaceholderString(\n\t\t\tu.Tr.MajorVersionErr, map[string]string{\n\t\t\t\t\"newVersion\":     newVersion,\n\t\t\t\t\"currentVersion\": currentVersion,\n\t\t\t},\n\t\t)\n\t\treturn \"\", errors.New(errMessage)\n\t}\n\n\trawUrl := u.getBinaryUrl(newVersion)\n\n\tu.Log.Info(\"Checking for resource at url \" + rawUrl)\n\tif !u.verifyResourceFound(rawUrl) {\n\t\terrMessage := utils.ResolvePlaceholderString(\n\t\t\tu.Tr.CouldNotFindBinaryErr, map[string]string{\n\t\t\t\t\"url\": rawUrl,\n\t\t\t},\n\t\t)\n\n\t\treturn \"\", errors.New(errMessage)\n\t}\n\tu.Log.Info(\"Verified resource is available, ready to update\")\n\n\treturn newVersion, nil\n}","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/jesseduffield/lazygit/blob/c477a2959b229fbf3284be0d4d2904ab61ec3c94/pkg/updates/updates.go#L103-L139","documentation":"The updater refuses to auto-update across a major version boundary (majorVersionDiffers): if the release's major component differs from the running version's, it returns the translated MajorVersionErr. This is a safety guard because major releases may carry breaking, non-backwards-compatible changes.","triggerScenarios":"Running e.g. 0.x and asking for an update when the newest release is 1.x (or any major-number delta); the updater fetched a version string whose first component differs from yours.","commonSituations":"Long-lived installation after a big release; the GitHub release channel jumps majors; version parsing surprises with custom builds.","solutions":["Update manually following the release notes and installation docs for the new major version (breaking changes may require config migration).","Read the new major's changelog first — keybindings or config schema may have changed.","If you must stay on the old major, ignore this error; the binary is not modified."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// You can pre-check the major-version guard yourself:\nif u.majorVersionDiffers(currentVersion, newVersion) {\n    // don't call the updater; surface a manual-update notice instead\n}","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), u.Tr.MajorVersionErr) {\n    // notify user to update manually; not an auto-updater failure\n}","preventionTips":["When a new major ships, plan a manual upgrade with config/keybinding migration.","Don't script auto-update across major boundaries; the guard is intentional.","Pin deployments to a known major if breaking changes are costly for you."],"tags":["updates","versioning","breaking-changes"],"backgroundTag":null,"analyzedSha":"c477a2959b229fbf3284be0d4d2904ab61ec3c94","analyzedAt":"2026-08-15T08:34:32.451Z","schemaVersion":2},"datasetVersion":"2026-08-16T03:17:38.424Z"}