Git03-git分支
2.工作流程&基本概念
Git提供的工具有:
git:Git的核心工具。
git-daemon:Git的守护进程。
git-email:Git发送电子邮件的工具。
git-cvs:导入CVS版本库的Git工具。
git-svn:导入Subversion版本库的Git工具。
git-bzr:用于使用bzr版本库的Git工具。
git-p4:用于处理Perforce仓库的Git工具。
git-hg:用于处理mercurial版本库的Git工具。
git-gui:Git的GUI工具。
gitk:Git修订树可视化器。
gitweb:简单的Web界面,用于跟踪git版本库中的更改。
git-instaweb:一个简单的脚本,用于设置gitweb和用于浏览本地版本库的Web服务器。
Git 和其他版本控制系统的主要差别在于, Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件
内容的具体差异。这类系统( CVS, Subversion, Perforce, Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了
哪些行的什么内容。Git 并不保存这些前后变化的差异数据。实际上, Git 更像是把变化的文件作快照后
在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网
在保存到 Git 之前,所有数据都要进行内容的校验和( checksum)计算,并将此结果作为数据的唯一标识和索引。所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。
基本的 Git 工作流程如下所示:
- 在工作目录中修改某些文件。
- 对这些修改了的文件作快照,并保存到暂存区域。
- 提交更新,将保存在暂存区域的文件快照转储到 git 目录中。
对于任何一个文件,在 Git 内都只有三种状态:
已提交(committed)已提交表示该文件已经被安全地保存在本地数据库中了;
已修改(modified)已修改表示修改了某个文件,但还没有提交保存;
已暂存(staged)已暂存表示把已修改的文件放在下次提交时要保存的清单中。
git add 命令是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:
可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。
举例说明:
创建一个文件file1后,使用git add可以跟踪该文件。之后,如果修改file1,使用git add表示将修改提交到暂存区,暂存区中保留的是file1修改后的快照。上述情况file1没有快照,所以是跟踪文件
git commit提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管
理。每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。
动作 | 命令 | 文件位置 | 文件状态 |
---|---|---|---|
新建文件 | 工作目录 | 未被追踪 | |
推送至暂存区 | git add | 暂存区 | 暂存 |
提交版本 | git commit | 本地仓库 | 未被修改 |
修改文件 | 工作目录 | 未被追踪 |
工作区:就是你在电脑里能看到的目录
暂存区:.git/index文件中,暂存区有时也叫作索引(index)
版本库:隐藏目录.git,这个不算工作区,而是Git的版本库
Git 是如何知道你当前在哪个分支上工作的呢?
git保存着一个名为 HEAD 的特别指针,在 Git 中,它是一个指向你正在工作中的本地分支的指针
分支管理
git branch
git branch 列出分支
git branch <分支名> 新建分支
git branch -v 查看各个分支最后一次 commit 信息
git branch --merged 查看哪些分支已被并入当前分支
git branch --no-merged 查看尚未合并分支
git branch -d <分支名> 删除本地分支,注意是本地,删除远程的分支有其他命令,删除没提交的分支会提醒
git branch -D <分支名> 强制删除本地分支
git checkout
git checkout <分支名> 切换到分支
git checkout -b <分支名> 新建并切换到分支
跟踪分支
git checkout --track origin/serverfix 创建本地分支serverfix,自动与远程仓库origin中的serverfix分支同步
相当于以下两个步骤的结合:
git fetch origin
git checkout -b serverfix origin/serverfix
要为本地分支设定不同于远程分支的名字,只需在前个版本的命令里换个名字:
git checkout -b sf origin/serverfix
删除远程分支
git push [远程仓库名] :[远程分支名]
相当于,git push [远程名] [本地分支]:[远程分支] ,省略 [本地分支],那就等提取空白然后把它变成[远程分支]
git merge
git merge <分支名> 合并<分支名>到当前分支
git push
git push <远程仓库名> <分支名> 这条命名省略了本地分支名
git push <远程仓库名> <本地分支名>:<远程分支名> 提取<本地分支名>到<远程仓库名>的<远程分支名>
衍合
通俗解释(重要!!):rebase,变基,可以直接理解为改变基底。feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交先暂存下来,然后删掉原来这些提交,再找到master的最新提交位置,把存下来的提交再接上去(接上去是逐个和新基底处理冲突的过程),如此feature分支的基底就相当于变成了M而不是原来的B了。(注意,如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录)
# 这两条命令等价于git rebase master feature。把 server 分支衍合到 master
git checkout feature
git rebase master
永远不要衍合那些已经推送到公共仓库的更新。
git show
解决冲突
任何包含未解决冲突的文件都会以未合并( unmerged)状态列出。
Git 会在有冲突的文件里加入标准的冲突解决标记,可以通过它们来手工定位并解决这些冲突。
可以看到此文件包含类似下面这样的部分:
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
可以看到 ======= 隔开的上半部分,是 HEAD(即 master 分支,在运行 merge 命令时检出的分支)中的内容,
下半部分是在 iss53 分支中的内容。解决冲突的办法无非是二者选其一或者由你亲自整合到一起。
比如你可以通过把这段内容替换为下面这样来解决:
<div id="footer">
please contact us at email.support@github.com
</div>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)