GitUp:把分支历史、变基与冲突解决变成可视化操作的 Git 图形客户端
【免费下载链接】GitUpThe Git interface you've been missing all your life has finally arrived.项目地址: https://gitcode.com/gh_mirrors/gi/GitUp
Git 的命令语法并不难记,难的是它把大量状态藏在.git目录里:分支指针、索引、HEAD 与 reflog 之间的关系,光看终端输出很难建立完整心智模型。GitUp 是运行在 macOS 上的 Git 图形客户端,它把仓库历史渲染成可交互的提交图,配合近乎无限的撤销、一键快照回退和可视化冲突解决,让分支历史、变基与合并这些容易出错的环节有了看得见的操作路径。
使用后的变化:从"敲命令"到"看图操作"
命令行 Git 的门槛不在单词,而在状态。git add是暂存,git reset HEAD是取消暂存,两条命令方向相反却长得像,新手很难凭文字反馈判断仓库此刻处于什么状态;而git log --graph的输出是静态的,看完之后要动手修改历史,又得重新拼参数。
GitUp 的交互模型是"操纵仓库图,而不是操纵提交"(README 的原始表述),整个界面围绕一张活的提交图展开:
- 历史以图形呈现,分支、标签的位置直接可见,替代文本版
git log --graph的输出; - 绝大多数操作可以撤销/重做,包括 rebase 与 merge 这类"重操作";
- 每个操作前可以打快照,需要回退时一键还原仓库状态;
- 搜索覆盖整个仓库,包括 diff 内容本身。
下面按一个完整的日常工作流,看看这些能力分别落在哪个环节。
打开仓库:提交历史图如何取代git log输出
主视图是一张实时更新(live)的仓库图。源码位于 GitUpKit/Views/GIMapViewController.h,界面上提供若干开关:标签(tag)名称、分支名称、远程分支端点、过期分支端点的显隐都可以单独切换,看图时可以按需降噪。
图视图同时承担远程操作入口:拉取远程分支与标签、推送本地分支、拉取/推送当前分支都直接挂在这张图的动作菜单里(对应GIMapViewController的fetchAllRemoteBranches、pushCurrentBranch等动作)。也就是说,不用离开历史视图就能完成一轮同步,而不是"图看一处、操作跳回终端"。
选中某个提交后,可以对其执行改写:调整顺序、合并、修正内容(README 提到的 edit / reorder / fixup / merge commits)。这些操作在图上是"移动节点",而不是重新敲一串参数。
试错成本:撤销、重做与快照回退
这是 GitUp 相对命令行最明显的行为差异:试错不再依赖git reflog+git reset手工恢复。
- 撤销/重做:核心仓库对象 GCLiveRepository 内置了
NSUndoManager,通过performOperationWithReason:argument:skipCheckoutOnUndo:error:usingBlock:为每步操作注册撤销记录,README 称其为"几乎全部操作的无限撤销/重做(含 rebase 与 merge)"。 - 快照:GCSnapshot 记录仓库引用状态,
takeSnapshot:与restoreSnapshot:withOptions:reflogMessage:...负责打点与回滚,相当于给仓库加了 Time Machine 式的检查点,一键回到之前某个状态。 - reflog 浏览器:GIUnifiedReflogViewController 把分散在各引用上的 reflog 汇总成统一列表,选中某条记录即可基于它恢复状态——这件事 Git 原生没有图形入口。
三者组合的效果是:rebase 写坏了、合并选错基点,多数情况下都有退路,而不再是"操作前先截图终端输出保命"。
分支操作:拖拽式变基、合并与冲突处理 🌿
分支层面的动作集中在 GIMapViewController+Operations.h,对照命令行大致是:
rebaseLocalBranch:fromCommit:ontoCommit:/smartRebaseLocalBranch:ontoCommit::把本地分支变基到目标提交,即"拖分支到新基点";mergeCommitOrBranch:intoLocalBranch:与fastForwardLocalBranch:toCommitOrBranch::合并与快进;cherryPickCommit:againstLocalBranch:、revertCommit:againstLocalBranch::摘取或回滚单个提交;swapCommitWithParent:/squashCommitWithParent:/fixupCommitWithParent::等价于git rebase -i里 reorder / squash / fixup 的动作,但在图上是直接对节点操作;- 分支与标签的创建、重命名、删除、设定上游,也都在同一个菜单体系里。
冲突出现时(合并或变基撞上同一处修改),由 GIConflictResolverViewController 接管:它持有 ourCommit 与 theirCommit 两端提交,在界面上并排对比、逐处裁决,而不是在文本编辑器里手工删冲突标记。合并冲突的底层状态管理见 GCLiveRepository+Conflicts。
提交工具箱:拆分、改写、全仓库搜索与主题设置
除图视图外,GitUpKit/Views 下还有几个高频工具:
- 提交拆分:GICommitSplitterViewController 把一个混合了多类改动的提交拆成若干提交——原生 Git 里要做这件事需要 checkout、反复
git add -p,这里提供了专门的流程; - 提交改写:GICommitRewriterViewController 修改历史提交的信息与作者;
- 即时搜索:GCLiveRepository.h 的 Search 分类提供
prepareSearchInBackground:与findCommitsMatching:,后台索引后跨全仓库匹配,命中范围包括提交、分支、标签以及 diff 内容,结果直接定位到图上的节点; - 主题:PreferencesWindowController 支持跟随系统、浅色、深色三种模式,浅色与深色两套背景纹理都内置在 GitUpKit/Views/Views.xcassets 中:
快速上手与适用边界
获取与构建。GitUp 是 macOS 应用:可以直接从 GitHub Releases 下载,或运行brew install gitup-app(非官方维护)。源码构建需要 Xcode 打开 GitUp/GitUp.xcodeproj,注意用git clone --recursive拉取(libgit2 等以子模块引入);没有开发者签名账号时,去掉 Application target 的 Code Signing Identity 即可绕过签名报错,也可参考 README 中Xcode-Configurations/DEVELOPMENT_TEAM.xcconfig的方案。仓库镜像地址:git clone --recursive https://link.gitcode.com/i/5aec6f13735d57d9f3af0eda6198ec31。
它适合谁。如果你日常需要频繁看分支结构、整理提交历史、解决合并冲突,且主力设备是 Mac,GitUp 把这几类操作的反馈周期从"敲命令—看输出—猜状态"缩短到"在图上直接操作"。
它不替代什么。脚本化流程、CI 流水线、无图形界面的服务器环境里,命令行 Git 依旧是标准选择;GitUp 的定位是桌面端交互客户端,而非自动化层。另外它目前仅提供 macOS 版本,这一点对非 Apple 用户是硬限制。
仓库中 GitUpKit 是独立于应用主体的开源框架(Core 负责仓库操作,Interface/Components/Views 提供可复用界面),README 还收录了 GitDown、GitDiff、GitY、iGit 四个基于它搭建的示例,想扩展或二次开发可以从 Examples/ 目录入手。
【免费下载链接】GitUpThe Git interface you've been missing all your life has finally arrived.项目地址: https://gitcode.com/gh_mirrors/gi/GitUp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考