fork git介绍
Fork(Git可视化客户端)完整介绍 Markdown文档
⚠️ 分清两个完全不同概念:
- Fork(网页功能):GitHub/Gitee上面复制别人仓库的操作(无软件)
- Fork(软件):一款Windows/Mac平台的Git图形化GUI客户端工具,就是下面介绍的软件
一、什么是 Fork 软件
Fork 是一款原生、高性能、简洁好用的 Git 可视化桌面客户端,官方标语:a fast and friendly git client for Mac and Windows(一款快速友好的Git客户端)。
简单来讲:
不用再敲 git add / git commit / git push 等一堆命令,通过鼠标点击界面,就可以完成几乎所有 Git 的操作。
💡前提:电脑必须先安装好Git本体,Fork只是可视化外壳,本身不带Git内核。
基础信息
| 项目 | 详情 |
|---|---|
| 支持系统 | Windows、macOS,无Linux版本 |
| 软件性质 | 闭源商业软件 |
| 费用规则 | 个人免费使用;企业商用需要购买授权;一次性买断,无订阅费 |
| 官网 | https://git‑fork.com |
Fork软件核心优势
- 速度极快 原生程序,大型仓库、上万条提交记录也不会卡顿,是它最大亮点,对比Sourcetree、TortoiseGit流畅很多。
- 界面干净清爽 布局简单:仓库列表‑提交历史‑代码差异区,没有多余广告、冗余功能。
- 新手友好 所有Git操作可视化,分支图谱一眼看懂,降低命令行学习门槛。
- 高级Git功能强大 交互式变基、冲突解决、cherry‑pick、图片对比,很多GUI工具不好用的功能,Fork体验优秀。
主要功能清单
✅ 基础日常功能(小白最常用)
- 新建仓库
git init - 克隆远程仓库
git clone - 文件修改预览、逐行暂存代码(可以只提交文件中一部分改动)
- Commit(提交)、Amend(修改上一次提交)
- Fetch / Pull(拉取)、Push(推送)
- 分支创建、切换、合并、删除
- Tag标签管理
- Stash储藏临时改动
界面布局说明
- 左侧边栏:仓库管理器、分支列表、标签、储藏、子模块
- 中上区域:所有提交历史图谱(彩色线条直观展示各个分支走向)
- 下方Changes区:当前修改的文件列表
- 右侧Diff对比区:文件修改前后的代码对比(红色删除、绿色新增)
新手最简单上手流程
- 电脑提前安装好Git(必须)
- 官网下载安装 Fork软件
- 打开Fork → File‑>Open:打开你本地已经存在的项目文件夹;或者Clone克隆远程仓库
- 修改你的项目代码
- 在Fork下方勾选改动文件 → 填写提交信息 →
Commit - 点击Push推送到云端仓库
小白避坑提示
- Fork ≠ Git,必须单独安装Git,否则软件无法运行。
- Fork只是操作工具,底层执行的还是Git命令,学好基础Git概念(工作区、暂存区、分支)再用GUI工具,不容易懵。
- 免费仅限个人开发,公司商用需要购买授权。
合并分支选项
Default: Fast-forward if possible(默认:如果可能则快进)这是 Git 的默认行为。
- 机制:如果当前分支(main)在分叉后没有任何新的提交,Git 会直接将 main 的指针移动到 origin/master 的最新提交上。
- 结果:不会产生一个新的”合并提交”节点。历史记录是一条直线,非常干净。
- 适用场景:个人项目或希望保持线性历史的简单开发流程。
No Fast-Forward(禁止快进 / --no-ff)
- 机制:即使满足”快进”的条件,Git 也会强制创建一个新的”合并提交”节点,将两个分支的历史连接起来。
- 结果:历史记录中会出现分叉和汇合的图形。你可以清楚地看到哪些提交是属于这个功能分支的。
- 适用场景:团队协作、正规项目开发。它能保留完整的功能开发上下文,方便日后回滚整个功能或追溯代码来源。
Squash(压缩合并 / --squash)
- 机制:将 origin/master 分支上的所有提交压缩成一个新的提交,然后应用到 main 分支上。
- 结果:origin/master 里原本琐碎的提交记录(如 “fix typo”, “update”, “wip”)都会消失,main 分支上只会多出一个整洁的提交。
- 适用场景:功能分支开发过程中提交很混乱,但合并到主分支时希望保持主分支历史极其简洁的情况。
Don't Commit(不自动提交 / --no-commit)
- 机制:Git 会执行合并操作并将变更写入工作区,但不会自动帮你生成提交记录。
- 结果:你需要手动检查合并后的代码,确认无误后,自己执行 git commit。
- 适用场景:当你需要在这个基础上再做一些微调,或者想在提交前仔细审查合并结果时使用。
提交
Amend 的意思是“修改/追加到上一次提交”。在 Git 中,它的对应命令是 git commit --amend。
勾选后,你当前暂存的改动不会生成一个新的提交记录,而是直接合并进上一次的提交记录中(并且你可以顺便修改上一次提交的说明文字)。所以按钮会变成“Amend Last Commit(修改上一次提交)”。
关于出现的警告 “Amending commit that has already been pushed !” (正在修改已经推送过的提交!),这是一个非常关键的危险提示:
⚠️ 为什么会有这个警告?
因为修改上一次提交会直接改写 Git 历史(会生成一个新的哈希值替换掉旧的)。如果这个提交已经推送到了远程仓库(比如 GitHub/GitLab),并且团队其他人已经拉取了这个旧提交,那么你修改后,别人的本地代码和远程仓库就会彻底冲突,导致他们无法正常合并,需要手动处理复杂的冲突。
🛠️ 怎么选?(操作建议)
- 如果你还没有推送到远程(或者这是你自己一个人的私有分支): 可以放心勾选。比如你刚提交完,发现漏加了一个文件,或者提交信息打错了一个字,勾选它直接修正,是最方便的做法。
- 如果你已经推送到了远程,并且是多人协作的公共分支(比如 main/master): 绝对不要勾选! 正确的做法是取消勾选,像平时一样作为一次新的提交(Commit)提交上去。
- 如果你必须修改已经推送的提交(且只有你一个人在用): 勾选修改完成后,你需要执行强制推送(Force Push) 才能更新远程仓库。但在团队协作中,强制推送是被严格禁止的,因为会覆盖别人的代码。
💡 针对你当前的情况(修改文档):
如果你不确定之前的提交是否已经被别人拉取过,最安全的做法是不勾选 Amend,直接点击 Commit 1 File 新增一个提交。这样最稳妥,不会影响到任何人。只有当你确定这仅仅是自己的本地操作时,再去用 Amend。
变基
Rebase 'main' on 'origin/master'
将当前分支(main)变基到远程分支(origin/master)之上(不推荐) 本质上就是把你的本地 main 分支“接”到远程 origin/master 分支的最新提交之后,但它的实现方式不是简单的“拼接”,而是通过“重写历史”来达成线性效果。
具体来说:
- Git 会先找到 main 和 origin/master 的共同祖先;
- 然后把你本地 main 上独有的提交“暂存”起来;
- 接着把 origin/master 的最新状态作为新基底;
- 最后把你暂存的提交“一个一个重放”到这个新基底上,形成一条全新的、线性的提交链。
⚠️ 关键点:虽然内容一样,但“身份”变了
虽然代码内容没变,但因为它们是“重新应用”到新基底上的,所以这些提交的 哈希值(Commit ID)会完全改变。
- Merge 是“打结”:保留原来的提交 ID,只是多了一个合并节点把两条线连起来。
- Rebase 是“重写”:原来的提交被销毁了,生成了新的提交 ID 接在后面。
main 分支不仅依然存在,而且会变得“更新、更干净”。
- 执行 Rebase 'main' on 'origin/master' 后,你的 main 分支不会消失,而是会发生以下变化:
- 位置前移:它的指针会移动到 origin/master 的最新提交之后。
- 历史重写:它原本独有的提交会被“复制”一份接在后面,旧的提交记录会被丢弃(虽然内容一样,但哈希值变了)。
- 线性化:分叉的曲线会变成一条直线。
你可以把它想象成“剪枝嫁接”:把 main 从老树干上剪下来,嫁接到 origin/master 这根新树干的最顶端。树还在,只是长得更高、更直了。
⚠️ 重要提醒
因为 Rebase 会改变提交的哈希值,如果这个 main 分支已经推送到远程且其他人正在基于它开发,执行 Rebase 会导致他们的本地历史与远程冲突。只对私有分支或尚未推送的本地分支使用 Rebase。
reset 操作
🟢 Soft(软重置):保留所有修改,且自动暂存
- 效果:将分支指针(HEAD)移动到指定提交,但不改变工作区和暂存区。你之前所有的修改都会被保留在“已暂存”状态,可以直接再次提交。
- 适用场景:你想撤销最近几次提交,但希望保留代码修改,方便重新组织或合并提交信息。比如,你提交了3次,发现提交信息写错了,想合并成一个更清晰的提交。
🟡 Mixed(混合重置):保留所有修改,但取消暂存
- 效果:将分支指针移动到指定提交,清空暂存区,但保留工作区的文件修改。你的代码改动还在,但需要重新 git add 才能提交。
- 适用场景:你想撤销提交,但不确定哪些修改要保留,或者想重新选择要提交的文件。这是最安全的回滚方式,因为代码不会丢失。
🔴 Hard(硬重置):丢弃所有本地修改
- 效果:将分支指针、暂存区、工作区全部回滚到指定提交的状态。你之后所有的修改都会被彻底删除,无法恢复(除非有备份)。
- 适用场景:你确定之后的修改都是错误的,或者想完全回到某个干净的历史节点。风险极高,慎用!
一句话总结
- Soft:撤销提交,代码还在,已暂存 → 适合“重做提交”。
- Mixed:撤销提交,代码还在,未暂存 → 适合“重新选择提交内容”。
- Hard:撤销提交,代码全丢 → 适合“彻底放弃修改”。
⚠️ 重要提醒:
reset 会改写历史,如果这些提交已经推送到远程仓库,执行后需要强制推送(git push --force),这会影响其他协作者。只对本地未推送的提交使用 reset。
git reset 或git rebase需要强制推送
是因为你本地的提交历史已经被重写(比如通过 git reset 或 git rebase),与远程仓库的历史不再兼容。Git 默认会拒绝这种“非快进”的推送,以防止意外覆盖他人工作。只有使用 --force(或 -f)才能强行覆盖远程历史。
为什么会出现“不兼容”? 当你执行 git reset --hard 或 git rebase 时,Git 会丢弃旧的提交记录,并生成新的提交哈希值。这意味着:
- 本地分支的“历史链”被截断或重排;
- 远程仓库仍保留着旧的提交链;
- 两者在 Git 看来是“分叉”的,无法直接合并。
此时,普通的 git push 会被拒绝,因为 Git 认为你试图“覆盖”远程已有的提交,这可能意味着数据丢失。
强制推送的本质 强制推送就是告诉 Git:“我清楚自己在做什么,我要用本地的新历史完全替换远程的历史。”它会:
- 删除远程分支上所有不在你本地历史中的提交;
- 将远程分支指针指向你本地的最新提交;
- 导致其他协作者的本地仓库与远程严重冲突。
⚠️ 重要提醒 强制推送是高风险操作,尤其在团队协作中。如果其他人已经基于你重置前的提交做了开发,他们的代码可能会丢失或产生难以解决的冲突。只在以下情况使用:
- 你的分支是私有的,没有其他人依赖;
- 你已经和团队沟通并获得同意;
- 你确定要彻底放弃远程上的某些提交。
更安全的替代方案
如果你只是想撤销错误提交而不想影响他人,可以考虑:
git revert <commit-hash>:创建一个新提交来“反向”修改,保留历史完整;git push --force-with-lease:比 --force 更安全,它会检查远程是否被你之外的其他人更新过,避免误覆盖。
Git 眼里的真相是什么?
Git 不看文件长得像不像,它只看提交哈希值的父子关系。
- Master 线:9c07aea (根节点,没有爸爸)(就只有一个提交)
- Main 线:825c3c8 (它的爸爸是 096646c,一直往上追溯,永远找不到 9c07aea) 这就是为什么你在截图里看到它们是分叉的,而且如果你直接删除 Master,Git 会警告你“这个提交将永久丢失”,因为它不属于 Main 的任何一条祖先链。
Rebase(变基)是目前“最好”的选择
从你的 Git 历史图来看,这是一个非常典型的分叉(Diverged)状态:
- Main 分支(上方):你有大约 15 个新的提交(主要是文档和重构)。
- origin/master(下方):远程主分支停留在很久以前的一个初始提交上。

Rebase(变基)后Rebase 'main' on 'origin/master'
- 强制推送 Main (如果还没做) 因为你对本地 main 做了 rebase,它的提交哈希值(Commit ID)全变了。如果你直接 git push,Git 会拒绝,因为它觉得你的本地历史和远程不一致。你需要告诉远程:“用我本地的新历史覆盖掉远程的旧历史”。
- 第二步:删除远程的 Master 一旦确认 main 已经包含了所有历史(就像截图里那样,从底向上连贯),那个孤零零的 origin/master 就没有存在的必要了。 bash
- 第三步:删除本地的 Master (可选) 如果你的本地还有一个叫 master 的分支(截图里没显示,但可能有),也可以删掉以保持清爽。 bash
- 第四步:清理远程引用
删除远程分支后,你本地的 Git 记录里可能还会残留一个 origin/master 的影子。运行这个命令来清理:
