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 工作流程如下所示:

  1. 在工作目录中修改某些文件。
  2. 对这些修改了的文件作快照,并保存到暂存区域。
  3. 提交更新,将保存在暂存区域的文件快照转储到 git 目录中。

对于任何一个文件,在 Git 内都只有三种状态:
已提交(committed)已提交表示该文件已经被安全地保存在本地数据库中了;
已修改(modified)已修改表示修改了某个文件,但还没有提交保存;
已暂存(staged)已暂存表示把已修改的文件放在下次提交时要保存的清单中。

git add 命令是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:
可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。
举例说明:
创建一个文件file1后,使用git add可以跟踪该文件。之后,如果修改file1,使用git add表示将修改提交到暂存区,暂存区中保留的是file1修改后的快照。上述情况file1没有快照,所以是跟踪文件

git commit提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管
理。每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。

d0cae651d6370ec465aaa2fcd351efa3.png

动作 命令 文件位置 文件状态
新建文件 工作目录 未被追踪
推送至暂存区 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>
posted @   立勋  阅读(6)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示