一、开发使用场景
-
备份:防止电脑突然宕机此类情况发生,导致代码原地消失,在Git上进行备份处理
-
代码还原:在代码开发过程,根据需求修修改改,导致代码面目全非,这时候怀念“她”那时“一袭白裙”站在你面前的样子。使用Git回到曾经!
-
协同开发:在工作中,一个强大的功能需要多位优秀的程序员共同开发,Git 的分支功能允许团队成员同时在不同的分支上进行独立的开发工作,互不干扰。例如,前端团队可以在
feature - front - end
分支上开发新的用户界面,后端团队在feature - back - end
分支上实现新的业务逻辑,两个团队可以并行推进工作,大大提高了开发效率。 -
追溯问题代码的编写人和编写时间:根据代码版本号更好的追溯到代码编写程序员,方便查清问题代码编写人。
二、版本控制器的方式
2.1 集中式版本控制器(Centralized Version Control System,CVCS)
概念:以一个中央服务器为核心,服务器中存储项目的所有版本信息和代码历史。团队成员需要从中央服务器获取最新的代码副本到本地进行开发,开发完成后将修改的代码提交回中央服务器。所有的版本控制操作(交互、更新、哈看历史记录)都依赖于与中央服务器的交互。
优点:易于管理,所有的版本信息都集中在中央服务器。能保证项目代码一致性。历史记录清晰。
缺点:依赖网络。单点故障风险。并发冲突复杂,当多个成员同时对同一文件进行修改并且提交时,容易产生冲突。
常见工具:Subversion(SVN),Perforce。
2.2 分布式版本控制工具(Distributed Version Control System,DVCS)
概念:没有中央服务器来存储所有的版本信息,每个开发者的本地计算机都是一个完整的版本库,包含着项目的完整历史记录和所有的版本信息。开发者直接可以直接进行数据交互,不需要通过中央服务器。每个节点都可以作为独立的版本控制中心,具备完整的版本控制功能。
优点:无需依赖网络,在网络情况也可以进行开发,在有网络的时候再进行推送和拉取。数据安全与冗余,数据可以在任何一个节点恢复。高效的分支管理。
缺点:学习曲线较陡。存在数据一致性挑战,分布式版本控制工具提供了合并和解决冲突的机制,但多个开发者对同一文件的同一部分进行修改时,可能会产生复杂的合并冲突,需要手动解决。
常见工具:Git,Mercurial(python常用),Bazaar。
2.3 SVN 与 Git
-
Git是分布式的,SVN不是。(最核心的区别)
-
Git把内容按元数据方式存储,而SVN是按文件:Git使用对象存储机制,SVN以文件和目录的形式存储数据。所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs等的文件夹里。
-
Git分支和SVN分支不同:在Git中分支是轻量级指针操作。在SVN中是目录拷贝,可能耗时和占空间。
-
Git没有一个全局的版本号,而SVN有。
-
Git的内容完整性要优于SVN。
三、Git的常用命令
Workspace —— 工作区
Index / Stage —— 暂存区
Repository —— 仓库区(或本地仓库)
Remote —— 远程仓库
3.1 Git工作流程
3.2 获取本地仓库
要使用Git对代码进行版本控制,首先要获取本地仓库
-
在本地创建一个空目录,作为我们的本地Git仓库
-
在该目录下进入Git Bash窗口
-
执行命令 git init,初始化当前目录为一个git仓库
-
如果创建成功,在文件夹下可以看到隐藏的 .git 目录
3.3 基础操作命令
-
git config:通过git config配置用户名和邮箱地址,便于代码提交远程仓库,格式如下:
git config --global user.name 'userName' git config --global user.email 'userEmail'
-
git add:将文件从工作区(workspace)添加到暂存区(index)
//添加所有文件 git add . //添加某一类指定文件 git add *.java //添加指定文件 git add test.txt
-
git commit:将暂存区(index)的内容添加到仓库(repository)中,可以在后面加上-m,在命令行中提交注释。
//正常就行commit git commit -m "firstCommit" //如果想要跳过commit前的add操作,可以直接使用-a选项 git commit -am "firstAddAndCommit"
-
git status:查看相关文件的状态,git status -s查看简写状态。
//当您对Git的各种状态比较熟悉,就可以尝试使用git status -s来查看简写状态 git status -s //M - 被修改 //A - 被添加 //D - 被删除 //R - 重命名 //?? - 未被跟踪
-
git log:查看提交记录。常用命令形式:git log [option]。
//显示所有的分支 git log --all //将提交的信息显示为一行 git log --pretty=oneline //使得输出的commit更简短 git log --abbrev-commit //以图的形式显示 git log --graph //查看已经删除的记录 git relog
-
git branch:查看当前分支。
git branch # 列出本地分支(当前分支前有*) git branch -r # 列出远程分支 git branch -a # 列出所有分支(本地+远程)
-
git reset:撤销暂存区文件
git reset <文件名> # 将指定文件从暂存区移除(保留工作区修改) git reset # 撤销所有暂存区文件(保留工作区)
-
git push:推送代码到远程仓库
git push # 推送本地当前分支到对应远程分支 git push origin <本地分支名> # 推送指定本地分支到远程(首次推送需指定) git push -u origin <分支名> # 绑定本地与远程分支,后续可直接git push git push -f origin <分支名> # 强制推送(常用于修正历史提交后)
-
git reset --hard commitID:版本回退,commitID可以通过 git log 或 git relog 查看。
git reset --hard #彻底重置整个仓库(包括暂存区和工作区) git reset --hard <提交ID> # 回退到指定提交(ID可通过git log获取) git reset --hard HEAD~1 # 回退到上一个提交(~1表示前1个,~2前2个,以此类推)
-
git relog:查看操作记录,用于找回误删提交
git reflog # 显示本地仓库的所有操作记录(包括reset、commit等)
-
git stash:暂存当前工作区修改
git stash # 将工作区和暂存区的修改暂存起来(回到干净状态) git stash list # 显示所有暂存记录(格式:stash@{0}: 描述)
-
git checkout:放弃当前工作区的修改
git checkout -- <文件名> # 放弃指定文件的工作区修改(恢复到暂存区/HEAD状态) git checkout -- . # 放弃当前目录所有工作区修改,但是只会回复已经tracked的,新增的不会被删除 git clean -fd #删除所有未跟踪的目录与文件
-
git diff:比较差异
git diff # 比较工作区与暂存区的差异 git diff --staged # 比较暂存区与本地仓库(HEAD)的差异 git diff <分支1> <分支2> # 比较两个分支的差异
-
添加文件到忽略列表:
在文件夹下部分文件不需要Git管理,我们不需要其总是出现在未跟踪文件列表,可以在工作目录中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件模式。
#用于输出git提交日志 alias git-log='git log --pretty=oneline --all --graph --abbrev-commit' #用于输出当前目录所有文件及基本信息 alias ll='ls -al'
-
为常用指令设置别名(选择性学习)
有些常用指令参数非常多,每次使用需要输入很多参数,我们可以使用给别名
-
打开用户目录,创建 .bashrc 文件,部分系统可能遇到不允许用户创建点开头的文件,可以执行 touch ~/.bashrc
-
在 .bashrc 中输入如下内容,或其他命令进行自定义
-
3.4 分支(Brabch)
Git分支管理能够让多个开发人员并行工作,开发新功能、修复bug或进行实验,且不会影像主代码库。一个分支代表一条独立的开发线。使用分支意味可以从开发主线上分离出来,然后不影响主线的同时继续工作。
Git分支实际上是指向提交对象的可变指针。有人把Git的分支模型称为必杀技特性,正是以为如此,才将Git从版本控制系统家族中区分出。
3.4.1 主线与功能分支的关系
在Git中新建一个项目后,默认一个分支,即为主分支。主分支一般代表项目的稳定版本,主分支包含没有Bug的代码,并且保持随时可以发布状态。对于小型项目来说,一个主分支即可。
暂时无法在飞书文档外展示此内容
结合以上命令,此处绘制图像搭配理解
-
只有一个主分支时,每次提交都会有一个commit点
-
创建名为 "a" 的新分支,并且切换到a分支
-
在a分支上创建两个提交
-
切换到master分支并且进行快速合并(Fast-forward),快速合并直接将master指向了a指向所提交的C5
-
非快速合并,在master创建合并提交节点
3.4.2操作分支常用命令
-
git branch:查看本地分支
-
git branch <new_branch_name>:创建本地分支
-
git checkout <branch_name>:切换分支
-
git merge <branch_name>:快速合并分支到另一个分支
-
git branch -d <branch_name>:删除分支时需要做各种检查
-
git branch -D <branch_name>:不做任何检查,强制删除
四、 Git远程仓库
4.1 常用的托管服务
在Git中存在两种类型的仓库,即为本地仓库和远程仓库。关于远程仓库我们可以通过互联网上提供的一些代码托管服务实现,例如:GitHub、码云(gitee)、GitLab等。
4.2 创建远程仓库
-
登录 Gitee 账号
-
浏览器访问 Gitee 官网 → 点击右上角「登录」→ 输入账号密码(或扫码登录)。
-
-
新建仓库
-
点击右上角「+」→ 选择「新建仓库」→ 填写以下信息:
-
仓库名称:建议英文命名(如
project-demo
) -
可见性:
-
🔓 公开:所有人可见(适合开源项目)
-
🔒 私有:仅团队成员可见(需提前在 Gitee 添加协作成员)
-
-
初始化选项建议不做改变
-
获取仓库地址
-
-
-
常见问题
-
Q:SSH连接失败怎么办?A:检查
~/.ssh/id_rsa.pub
是否添加到Gitee [SSH公钥]
-
4.3 操作远程仓库
4.3.1 添加远程仓库
先初始化本地仓库,然后创建已创建的远程库进行对接
命令:git remote add <远端名称><仓库路径>。远端名称:通常是origin,取决于远端服务器设置。仓库路径:从远端服务器获取此URL。
例:git remote add origingit@gitee.com:czbk_zhang_meng/git_test.git
4.3.2 查看远程仓库
命令:git remote
4.3.3 推送到远程仓库
命令:git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名] ]
例:git push origin master
-
-f:表示强制覆盖
-
--set-upstream:推送到远端的同时建立起和远端分支的关联分支
4.3.4 本地分支与远程分支的关联关系
命令:git branch -vv
4.3.5 从远程仓库克隆
命令:git clone <仓库路径> [本地目录]
本地目录可以省略,会自动生成一个目录
4.3.6 从远程仓库抓取和拉取
命令:git fetch [remote name] [branch name]
抓取是将仓库中的更新都抓取到本地,不会进行合并,如果没有指定远端名称和分支名,则抓取所有分支
命令:git pull [remote name] [branch name]
拉取是将仓库中的修改拉到本地并且进行自动合并,等同于fetch+merge,如果未指定,与上同理