百科

git详细教程

时间:2010-12-5 17:23:32  作者:娱乐   来源:综合  查看:  评论:0
内容摘要:Git 最核心的事实:它保存的是文件快照,不是差异。你每次 commit,Git 都会给当前所有文件拍一张“照片”,存进一个叫 object database 的地方。没改的文件不重复存,只存指针。这

Git 最核心的详细教事实:它保存的是文件快照,不是详细教差异。你每次 commit,详细教Git 都会给当前所有文件拍一张“照片”,详细教存进一个叫 object database 的详细教地方。没改的详细教文件不重复存,只存指针。详细教这个设计让分支切换快到离谱——本质就是详细教换个指针指向。

很多人第一次用 Git 是详细教被 git init 和 git add 搞懵的。暂存区这个概念确实反直觉。详细教我当初也纳闷:为什么不能直接提交?详细教后来理解了——暂存区让你精确控制“这次提交包含哪些改动”。比如你改了三个文件,详细教但只想提交其中两个的详细教逻辑,第三个还在调试。详细教没有暂存区,详细教你只能全提交或者全不提交。

工作区、暂存区、本地仓库,这三个区域的关系用一句话说清:git add 把工作区改动放进暂存区,git commit 把暂存区内容存进本地仓库。别死记,打开终端敲几遍就懂了。

分支不是文件夹,是指针

新建分支 git branch feature 只做了一件事:在 .git/refs/heads/ 下创建一个叫 feature 的文件,里面写当前 commit 的 SHA-1 值。就这么简单。切换分支 git checkout feature 就是把 HEAD 指向这个新指针,然后刷新工作区文件。

合并分支时,如果两个分支没有分叉,Git 直接移动指针,这叫 fast-forward。有分叉才需要真正的合并,生成一个新的 commit 节点。冲突就发生在这个环节——同一个文件的同一区域被两个分支改了不同内容,Git 没法替你决定留哪个。

解决冲突没有捷径。打开冲突文件,找到 <<<<<<< HEAD 和 >>>>>>> branch-name 之间的内容,手动改成你要的最终版本,删掉标记行,然后 git add 再 git commit。我见过有人直接删掉对方分支的代码,结果第二天被同事追着骂。

reset 和 revert 的区别,用错会丢代码

git reset --hard HEAD~1 会直接删掉最近一次提交,工作区也回退。这个命令很危险,因为被删的 commit 如果没在其他分支引用,基本找不回来。git revert HEAD 则是创建一个新提交,内容正好抵消上一次提交的改动。历史记录保留,适合已经推送到远程仓库的情况。

记住一条:本地没推送的提交,可以用 reset 整理;已经推送的,用 revert。强行 reset 再 push -f 会覆盖远程历史,团队协作中这是大忌。

远程操作没你想的那么复杂

git remote add origin <url> 只是给远程仓库起个别名。git push -u origin main 里的 -u 是设置上游分支,之后直接 git push 就行。git fetch 拉取远程更新但不合并,git pull 等于 fetch 加 merge。我习惯先 fetch 看看远程改了什么,再决定 pull 还是先 rebase。

有个坑:git pull 默认用 merge,会产生一个多余的合并提交。改成 git pull --rebase 能让历史更干净。配置一次就行:git config --global pull.rebase true。

最后说个实用技巧。git reflog 记录 HEAD 的所有移动,包括 reset 掉的提交。误操作后先别慌,敲 git reflog 找到目标 SHA-1,git reset --hard <sha> 就能救回来。这个命令救过我至少三次。

Git 的命令行参数确实多,但日常用的不超过十五个。剩下的需要时查文档就行。别被那些“Git 高级技巧”吓住,先把 add、commit、push、pull、branch、checkout、merge 这七个练熟,已经能应付九成场景。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap