理解分布式版本控制系统
本地操作的本质
我们目前讨论的所有概念------工作区、暂存区、版本库等------都发生在本地计算机上。Git作为分布式版本控制系统,意味着:
-
每台参与开发的计算机都拥有完整的版本库
-
无需网络连接即可进行本地版本管理
-
每个开发者都可以独立工作,然后交换修改
分布式协作原理
假设你和同事都在修改文件A:
-
你在本地修改文件A并提交
-
同事在他的本地修改文件A并提交
-
双方只需将各自的修改推送给对方,即可看到对方的修改

分布式系统的优势
-
高安全性:每个计算机都有完整版本库,一台机器故障不影响其他
-
离线工作:无需网络即可进行版本管理
-
灵活协作:支持多种协作方式
中央服务器的角色
实际开发中,通常会设置一个中央服务器(如GitHub、Gitee):
-
主要作用是方便开发者交换修改
-
即使没有服务器,开发者之间仍可直接交换修改
-
服务器可防止本地故障导致数据丢失
远程仓库概念
Git作为分布式系统,同一个仓库可分布在多台机器上
基本分布原理
-
最初只有一台机器拥有原始版本库
-
其他机器可"克隆"这个版本库
-
每台机器的版本库都是完整的,没有主次之分
实际应用模式
-
一台服务器作为中央仓库,24小时运行
-
每个开发者从服务器克隆仓库到本地
-
开发者将本地提交推送到服务器,也从服务器拉取他人提交
远程仓库服务
-
GitHub:全球最大的Git仓库托管服务
-
Gitee:国内流行的Git仓库托管服务(码云)
-
自建Git服务器:适合企业内部使用
新建远程仓库
下面以 Gitee 为例,演示如何创建远程仓库。
创建步骤
1、访问Gitee并新建仓库

2、填写仓库信息

必填项说明:
-
仓库名称:建议使用有意义的英文名(如:my-project)
-
路径:自动生成,通常与仓库名一致
-
仓库介绍:简要描述项目功能(可选但推荐填写)
-
仓库公开性:选择"公开"(所有人可见)或"私有"(仅成员可见)
注意 :仓库名一定要有意义,但这里是测试就随意命名了
3、仓库初始化配置
初始化选项
-
设置语言:选择项目主要使用的编程语言,帮助平台进行代码统计
-
.gitignore文件:选择项目类型,自动生成忽略规则模板
-
开源许可证:选择适合项目的开源协议(如MIT、GPL等)
模板文件设置
-
ReadMe模板:自动生成项目说明文档框架
-
Issue模板:设置问题反馈的标准格式
-
Pull Request模板:设置分支合并请求的标准格式
选择分支模型
-
单分支模型:适合简单项目
-
Git Flow模型:经典的分支管理策略
-
其他模型:根据项目特点选择
5、创建成功

6、设置仓库可见性


新创建的仓库有且只有一个默认的master分支

克隆远程仓库
将远程仓库克隆到本地使用git clone命令。
获取仓库链接


注意:
git clone命令要在非仓库目录下执行
克隆协议对比
HTTPS协议
Shell
$ git clone https://gitee.com/null_mian/test.git
Cloning into 'test'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (7/7), done.
$ ls test/
README.en.md README.md
特点
无需额外配置,可直接克隆
每次操作可能需要输入账号密码
适合临时访问
SSH协议
Shell
# 由于我们没有添加本地库的公钥到远端库中,服务器拒绝了我们的clone链接
$ git clone git@gitee.com:null_mian/test.git
Cloning into 'test'...
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
特点
需要配置SSH密钥
一次配置,长期免密使用
安全性更高
SSH密钥配置
1、检查现有密钥
Shell
# 检查~/.ssh目录
$ ls ~/.ssh/
# 如果已有id_rsa和id_rsa.pub文件,可跳过生成步骤
2、生成SSH密钥
Shell
# 注意要输入自己的邮箱,然后一路回车,使用默认值即可
$ ssh-keygen -t rsa -C "1234567890@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/HY/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/HY/.ssh/id_rsa.
Your public key has been saved in /home/HY/.ssh/id_rsa.pub.
···
注意:这里的邮箱是你本地Git配置的的邮箱
3、查看公钥
Shell
$ ls
id_rsa id_rsa.pub known_hosts
$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMiJrB9GOMPVwYAn0V54faLqz7T/aHjFhOFPvSHhE5acyJLFzLlFgMrdvhbWHrleUupaexZMl0/QFr1B13sted0XkK23NgcwbFlD6DH+cuw9HppwhwjPAjn+U0MgQrEAbmalqz3uVmCVNz1pSDYUDw6Z99e3+wQ1TuulZ/pOI1F9HeWHdKdjPGMqQVVDJSRIWv/iv63TGCVJ9M+WR6tep0CTGPigX3fBLxE7TUUj0GKQGDg4D+BQJ0S6SxTZb9DZmRD5UmVoRq2/kGwlPcmcuibHYP6Ck5V0+cPqJGTbGrBt4iOUeTcwrpYJeEWn+J2odTPCG+il/tj8r8IdEXCDpd 1234567890@qq.com
补充:
id_rsa是私钥,不能泄露出去,id_ras.pub是公钥,可以放心地告诉任何人
4、添加公钥到 Gitee

补充:点击确认后,需要对你进行认证,输入你的账号密码即可
5、使用SSH克隆
Shell
$ git clone git@gitee.com:null_mian/test.git
Cloning into 'test'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (7/7), done.
$ ls test/
README.en.md README.md
补充:多人协作的话,将他们的密钥也添加进来即可
查看远程仓库信息
克隆后,Git 会自动将本地仓库与远程仓库关联
Shell
# 查看远程仓库名称
$ git remote
origin
# 查看详细信息
$ git remote -v
origin git@gitee.com:null_mian/test.git (fetch)
origin git@gitee.com:null_mian/test.git (push)
说明:
origin是远程仓库的默认名称
fetch表示拉取权限
push表示推送权限如果没有推送权限,则看不到push地址
向远程仓库推送
当本地仓库有更新时,需要将更新push到远程仓库
本地修改并提交
Shell
# 查看当前文件
$ ls -l
total 8
-rw-rw-r-- 1 HY HY 818 Dec 28 12:44 README.en.md
-rw-rw-r-- 1 HY HY 907 Dec 28 12:44 README.md
# 创建新文件并提交
$ vim file.txt
$ git add .
$ git commit -m "create file.txt"
[master 8c04ef2] create file.txt
1 file changed, 1 insertion(+), 2 deletions(-)
注意 :本地
name、
推送本地提交
使用git push命令将本地分支推送到远程仓库:
Shell
# 基本语法
git push <远程主机名> <本地分支名>:<远程分支名>
# 如果本地分支名与远程分支名相同,可简写
git push <远程主机名> <本地分支名>
# 实际推送
$ git push origin master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [1.1.23]
remote: Set trace flag 6f44998f
To git@gitee.com:null_mian/test.git
5e9eeb7..8c04ef2 master -> master
注意 :
git push推送的是分支,而不是整个仓库

拉取远程仓库
当远程仓库有更新时,需要将更新pull到本地仓库
远程仓库修改


注意 :实际开发中不要直接在远程仓库修改文件,此处仅为演示
拉取远程更新
使用git pull命令拉取远程更新并合并到本地:
Shell
# 基本语法
git pull <远程主机名> <本地分支名>:<远程分支名>
# 如果本地分支名与远程分支名相同,可简写
git pull <远程主机名> <本地分支名>
# 实际拉取
$ git pull origin master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From gitee.com:null_mian/test
* branch master -> FETCH_HEAD
Updating 8c04ef2..7176cef
Fast-forward
file.txt | 1 +
1 file changed, 1 insertion(+)
# 查看更新内容
$ cat file.txt
hello git
第一次修改内容
Git配置优化
忽略特殊文件
某些文件不应提交到仓库(如配置文件、编译文件等),可通过.gitignore文件进行管理。
创建.gitignore文件
方式一:远程仓库初始化时创建
创建仓库时勾选生成.gitignore模板选项:

方式二:手动创建
如果初始化时没有创建,可以手动在工作区根目录创建:
Shell
# 创建.gitignore文件
$ vim .gitignore
# 添加并提交
$ git add .
$ git commit -m "add .gitignore"
[master eb21de3] add .gitignore
1 file changed, 2 insertions(+)
create mode 100644 .gitignore
# 推送到远程仓库
$ git push origin master
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 297 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [1.1.23]
remote: Set trace flag 594585a2
To git@gitee.com:null_mian/test.git
7176cef..eb21de3 master -> master
忽略规则示例
Plain
# 1. 忽略特定文件
[filename]
# 2. 忽略一类文件(使用通配符)
*.ini # 忽略所有.ini文件
*.so # 忽略所有.so文件
*.log # 忽略所有日志文件
# 3. 忽略目录
temp/ # 忽略temp目录
build/ # 忽略build目录
# 4. 排除特定文件(在忽略规则中例外)
!demo.so # 不忽略demo.so文件
# 5. 复杂模式
.* # 忽略所有以'.'开头的隐藏文件
!.gitignore # 但不忽略.gitignore本身
验证忽略结果
Shell
# 创建应被忽略的文件
$ touch a.so b.ini
# 检查Git状态
$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working directory clean
# 如果.gitignore配置正确,这些文件被追踪
特殊情况处理
1、强制添加被忽略的文件
有时需要临时添加被忽略的文件,可以用-f选项强制添加
Shell
# 强制添加被忽略的文件
git add -f important.so
# 查看文件状态
git status
建议 :尽量别使用
-f选项强制添加,我们可以添加一条例外规则来达到同等效果
2、检查忽略规则
当文件被意外忽略时,可以用git check-ignore命令检查是哪个规则导致的
Shell
# 检查文件被哪个规则忽略
$git check-ignore -v a.so
.gitignore:3:*.so a.so
# Git告诉我们,.gitignore的第3行规则忽略了该文件,
# 于是我们就可以知道应该修订哪个规则
3、排除规则
当使用通配符*忽略一类文件,但需要排除其中个别文件时
Shell
# 错误示例:排除规则可能会失效
.* # 忽略所有以.开头的文件
!.gitignore # 试图不忽略.gitignore,但可能失效
# 正确示例:明确指定排除
.* # 忽略所有以.开头的文件
!.*/ # 但不要忽略目录
!.gitignore # 不忽略.gitignore文件
给命令重命名
Git支持为常用命令创建别名,提高效率。
创建别名
Shell
# 基本语法
git config --global alias.<别名> '<原始命令>'
# 示例:为复杂日志命令创建别名
$git config --global alias.lgpa 'log --graph --pretty=oneline --abbrev-commit'
补充:
--global:全局生效,所有仓库都可用不加该参数:仅当前仓库生效
使用别名
Shell
$ git config --global alias.lgpa 'log --graph --pretty=oneline --abbrev-commit'
$ git lgpa
* aa31f2e merge ReadMe
|\
| * 19895ee modify ReadMe for dev1
* | df5d186 modify ReadMe for master
|/
* 9663d75 insert(+) 1 in ReadMe for dev branch
建议:初学者建议先熟悉完整命令,熟练后再使用别名