Git用法
你这个描述非常关键,而且我可以明确告诉你一句话:
你之前的 Git 使用流程在“逻辑上是错误的”,但 Git 又“纵容”了你,所以才会出现现在这种看似诡异、其实完全可解释的结果。
我按 发生了什么 → 为什么会这样 → 正确理解 → 如何补救 给你一次讲透。
一、先给你一句“定性结论”(非常重要)
Git 从来不会“推送未提交的代码”。
你之前那些“只 push 不 commit 的分支”,实际上远程什么都没保存。
二、我们把你之前的真实流程“还原一遍”(这是关键)
你说你的流程是:
- 从
master新建分支 A - 在分支 A 写代码
- ❌ 只 push,没有 commit
- 再从
master新建分支 B - 发现 B 里居然有刚刚写的代码
- 重复这个流程很多次
- 最后一次:在某个分支 commit + push
- 再从
master新建分支,发现之前写的内容全没了
👉 这一切,其实完全符合 Git 的工作原理
三、关键真相 1:你之前写的代码,从来没进过 Git 历史
Git 的铁律(请牢牢记住)
1 | ❗ 没有 commit = Git 当作这段代码从未存在 |
你之前做的其实是:
- 写了代码(工作区)
- 切分支(工作区代码会被“原封不动”带走)
- push(但 push 只会推 commit)
- 所以:远程仓库是空的 / 旧的
👉 你以为“推送成功”,但实际上什么都没保存
四、那为什么“新分支里还有刚写的代码”?(这是最迷惑人的点)
这是 Git 最容易骗新手的地方。
发生了什么?
你所有“没提交的代码”,一直都在同一个工作区里。
当你执行:
1 | git checkout -b new-branch |
Git 的行为是:
- ❌ 不清空工作区
- ❌ 不丢弃未提交修改
- ✅ 原封不动地把这些修改带到新分支
所以你看到的是:
“我从 master 新建分支,怎么代码还在?”
其实真相是:
代码不是从 master 来的,而是从你的工作区带过去的
五、关键真相 2:直到你“最后一次 commit”,Git 才真正记住了代码
你说:
最后一次我在分支写完后,推送并提交了
这一步发生了质变:
1 | git add . |
👉 这是你人生中第一次真正把代码写进 Git 历史
六、那为什么这之后,从 master 再建分支就“什么都没了”?
因为:
此时 Git 的状态是:
master:还是最早那个老版本(从未合并过你的分支)- 你 commit 的代码:只存在于那个分支
- 工作区:已经干净了(commit 了)
当你再做:
1 | git checkout master |
Git 的行为是:
“OK,从 master 的最后一个 commit 开一个新分支”
👉 而 master 根本没你之前写的代码
所以你看到的是:
“之前写的好多内容都没了”
不是没了,而是:从来没在 master 里存在过。
七、用一句“人话类比”帮你彻底记住
你之前一直在 Word 里写文档但从不点保存
切文件夹时看起来内容还在
直到你最后点了一次“保存”
再打开旧文件夹,发现什么都没有——因为你之前从来没保存过
八、你现在最关心的两个问题,我直接替你回答
❓ 问题 1:我之前那些分支 push 出去的东西还有吗?
结论:没有。
- 没 commit
- push 只是空推
- 远程仓库里什么都没有
❓ 问题 2:已经 commit 的那一次代码能救吗?
能,而且这是你现在唯一“真实存在”的版本。
1 | git branch |
你会看到:
- 那个 commit 只在某个分支上
- master 还停在老地方
九、你现在“正确的补救方式”(一步不多)
1️⃣ 找到那个真正 commit 过的分支
1 | git log --oneline --all --decorate |
记住那个 commit hash。
2️⃣ 把它合并回 master(或你真正的主分支)
1 | git checkout master |
或(更安全):
1 | git checkout -b master-fixed |
3️⃣ 以后严格遵守这一条铁律
写完一段“有意义的代码”
👉 必须 commit
👉 push 只是备份,不是保存
十、给你一条你以后绝对不会再翻车的 Git 心法
Git 只记得 commit,不记得你“写过”。
工作区的一切,都是幻觉。
如果你愿意,下一步我可以帮你做三件事之一(都很值):
- 帮你 现场复盘你的 Git 历史,找还能救的 commit
- 给你一套 “个人开发者 0 翻车 Git 流程”
- 教你 IDEA 里如何避免这种误操作(可视化防呆)
你这次踩的坑,很大,但也非常典型;
跨过去,你的 Git 水平会直接上一个台阶。
