1. Git
概述
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Git is easy to learn and has a tiny footprint with lightning fast performance. It outclasses SCM tools like Subversion, CVS, Perforce, and ClearCase with features like cheap local branching, convenient staging areas, and multiple workflows.
为什么选择 Git?
Git 是当前最流行的分布式版本控制系统,优势包括:
- ⚡️ 高效:本地操作速度快,支持离线工作。
- 🌳 强大的分支管理:创建、合并分支简单且安全。
- 🔄 灵活性:适合个人项目到超大规模团队协作,如 Linux 内核开发。
1.1 版本控制
版本控制Version Control
是一种记录和管理文件变更的技术,主要用于追踪文件的历史修改、协作开发和回溯到任意历史版本。它就像文件的时光机,能让你清楚地知道:
- 谁修改了文件?
- 什么时候修改的?
- 修改了哪些内容?
- 为什么做这些修改?
版本控制的核心作用如下:
- 历史追踪:保存每一次变更记录,可随时回退到任意版本,比如修复
Bug
后发现问题,一键还原代码。 - 协作管理:多人同时修改同一文件时,自动合并变更或提示冲突,避免覆盖他人代码。
- 分支开发:支持创建独立分支,如新功能开发、
Bug
修复,不影响主分支的稳定性。 - 责任追溯:记录每次修改的作者和原因,便于团队沟通和问题追踪。
版本控制解决了什么问题?
- ❌ 手动备份混乱::无需手动保存
report_v1.doc
、report_final.doc
、report_final2.doc
这类混乱的副本。 - ❌ 代码丢失风险:误删或改错代码时,可快速恢复历史版本。
- ❌ 协作冲突:多人修改同一文件时,系统自动处理或提示冲突,避免代码覆盖。
1.2 版本控制的类型
版本控制主要分为【本地版本控制】、【集中式版本控制】和【分布式版本控制】三种类型,它们在存储方式、协作模式和适用场景上有显著区别。以下是详细对比:
- 本地版本控制:所有版本历史存储在本地计算机,无法多人协作。通过简单的文件快照或差异记录来管理变更。典型工具如
RCS
。- 优点:无需网络,操作简单,适合个人管理少量文件的版本,如论文、配置文档。
- 缺点:无协作能力,数据丢失风险高。
- 集中式版本控制:所有版本历史存储在中央服务器,开发者通过客户端连接服务器操作。所有版本历史存储在中央服务器,开发者通过客户端连接服务器操作。典型工具如
SVN
。- 优点:支持多人协作,权限管理方便,支持多人协作,权限管理方便。
- 缺点:服务器宕机时,开发者无法提交代码或查看历史;离线时无法提交或查看历史;创建和合并分支效率较低。
- 分布式版本控制:每个开发者本地都有完整的仓库副本,包括全部历史记录。开发者可离线工作,本地提交后再同步到远程仓库。典型工具如
Git
。- 优点:去中心化,无单点故障,本地仓库可独立运行;支持灵活的分支管理;提交、查看历史等操作无需联网。
- 缺点:学习曲线较高,本地存储可能占用更多磁盘。
特性 | 本地版本控制 | 集中式版本控制 | 分布式版本控制 |
---|---|---|---|
存储位置 | 本地单机 | 中央服务器 | 本地 + 远程服务器 |
协作能力 | ❌ 不支持 | ✅ 支持(需联网) | ✅ 支持(可离线提交) |
网络依赖 | ❌ 不需要 | ✅ 提交/拉取需联网 | ❌ 本地操作无需联网 |
容灾能力 | ❌ 本地数据易丢失 | ❌ 服务器故障则瘫痪 | ✅ 本地副本防止数据丢失 |
分支管理 | ❌ 不支持或简单 | ❌ 复杂且低效 | ✅ 高效且灵活 |
典型工具 | RCS | SVN | Git |
适用场景 | 个人小项目 | 企业内部协作 | 开源项目、大规模团队 |
1.3 Git
的工作机制
Git 的核心设计是分布式版本控制,所有操作围绕本地仓库展开,再与远程仓库同步。其工作机制可分为三个关键区域和核心流程:
三个核心区域
区域 作用 操作示例 工作区 本地直接编辑的代码目录 修改文件、新增代码 暂存区 临时存储准备提交的变更【 git add
后的内容】git add file.txt
本地仓库 存储所有提交历史的数据库【通过 git commit
永久保存】git commit -m "message"
数据流动流程:工作区 → 暂存区 → 本地仓库 → 远程仓库
- 工作区修改:编辑代码后,文件处于已修改状态,但未被 Git 跟踪。
- 暂存变更:通过
git add
将变更添加到暂存区,即准备提交。 - 提交到本地仓库:
git commit
将暂存区的变更永久存储到本地仓库,生成一个唯一的提交记录,含作者、时间、变更内容。 - 推送到远程仓库:
git push
将本地仓库的提交同步到远程服务器,如 GitHub。
核心机制特点
- 快照存储:每次提交保存文件的完整快照而非仅差异,便于快速回溯。
- 分支本质:分支是指向某个提交的指针,创建分支只需新建一个指针,轻量且高效。
- 离线操作:所有提交、分支操作均在本地完成,无需联网。
1.4 代码托管中心
代码托管中心是存储 Git 仓库的远程服务器,提供团队协作、备份和项目管理功能。以下是主流平台对比:
平台 | 特点 | 适用场景 |
---|---|---|
GitHub | 全球最大开源社区,支持公开/私有仓库,集成 CI/CD、Issue 管理 | 开源项目、个人开发者协作 |
GitLab | 支持自托管,内置 DevOps 工具链【CI/CD、代码审查等】,企业级权限管理 | 企业内部私有项目 |
Gitee | 国内镜像平台,访问速度快,符合国内合规要求 | 国内团队、需要快速同步的场景 |
代码托管中心的核心作用如下:
- 备份与同步:防止本地数据丢失,多设备间同步代码。
- 协作开发:多人通过
git push
/git pull
共享代码。 - 权限管理:控制成员对仓库的访问权限,如只读、可写。
- 项目管理:通过 Issue、Pull Request、Wiki 等功能跟踪任务和文档。
1.5 Git
安装
首先从官网上下载Git
,然后进行傻瓜式安装,安装之后在桌面鼠标右键打开Open Git Bash Here
,即Git
的命令行客户端,执行git --version
,出现版本信息即安装成功。Git
的客户端能够使用所有的Linux
命令。
2. Git
常用命令
2.1 配置相关
在初次使用 Git 时必须设置用户名和邮箱,Git 需要这些信息来标识代码提交的作者,用于追踪代码变更的责任人。修改的配置文件即用户目录下的.gitconfig
文件。
命令 | 说明 | 示例 |
---|---|---|
git config --global user.name "xxx" |
设置全局用户名 | git config --global user.name "Bruce" |
git config --global user.email "xxx" |
设置全局邮箱 | git config --global user.email "Bruce@example.com" |
git config --list |
查看所有配置项 | git config --list |
除了全局设置,还可以单仓库设置,如下:
# 进入项目目录
cd /path/to/your-project
# 设置当前仓库的用户名和邮箱
git config user.name "公司用户名"
git config user.email "company@example.com"
# 查看所有配置项【包括全局和当前仓库】
git config --list
# 仅查看全局配置
git config --global --list
# 查看当前仓库的配置
git config --local --list
# 修改全局用户名
git config --global --replace-all user.name "NewName"
# 修改全局邮箱
git config --global --replace-all user.email "new@example.com"
对于配置相关,有以下注意点:
- 邮箱是否需要真实:如果是开源项目如
GitHub
,建议使用 GitHub 账号绑定的邮箱,否则提交记录不会关联到你的账号。如果是私有仓库,可以自由设置,但需符合团队规范。 Git
读取配置的顺序:仓库配置 > 全局配置
2.2 仓库与基础操作
命令 | 说明 | 示例 |
---|---|---|
git init |
初始化本地仓库 | git init |
git clone <url> |
克隆远程仓库到本地 | git clone https://github.com/user/repo.git |
git status |
查看工作区/暂存区状态 | git status |
git add <file> |
添加文件到暂存区 | git add . 【添加所有文件】 |
git commit -m "msg" |
提交暂存区内容到本地仓库 | git commit -m "修复登录bug" |
git rm --cache <file> |
删除暂存区中的文件 | git rm --cache hello.txt |
git reset --hard <版本号> |
重置当前分支的 HEAD 指针 | git reset --hard 86434aa |
2.2.1 git init
git init
会在指定目录下创建一个新的 Git 仓库,且在该目录下创建一个名为 .git
的隐藏文件夹。这个文件夹包含了 Git 仓库的所有元数据和对象数据库,是 Git 管理项目版本的核心。一旦 git init
命令执行成功,该目录就成为了一个 Git 仓库,你可以开始使用 Git 的各种功能,如添加文件到暂存区、提交文件到本地仓库、创建分支等。
# 进入项目目录
cd /path/to/your/project
# 初始化 Git 仓库
git init
# 输出
86182@tao MINGW64 /e/Git-Space/demo-project
$ git init
Initialized empty Git repository in E:/Git-Space/demo-project/.git/
86182@tao MINGW64 /e/Git-Space/demo-project (master)
2.2.2 git status
git status
命令能够展示当前仓库中文件的状态,这些状态主要涉及工作目录、暂存区和本地仓库之间文件的差异。通过运行该命令,你可以知道哪些文件是新创建的、哪些文件被修改过、哪些文件被删除了,以及这些文件是否已经被添加到暂存区或者提交到本地仓库。在 git status
命令后面跟上指定文件,其作用是查看该特定文件在 Git 仓库中的状态,而不是显示整个仓库所有文件的状态。
$ git status
On branch master
No commits yet
# 未被追踪的文件,可以使用 git add new_file.txt 命令将其添加到暂存区
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
2.2.3 git add
git add
的核心作用就是把工作目录里发生变更的文件添加到暂存区,为后续的提交操作做准备。具体使用如下:
追踪新文件:当你在工作目录中创建了新文件,这些文件最初处于未被 Git 追踪的状态。使用
git add
可以让 Git 开始追踪这些新文件。执行以下命令后,new_file.txt
就被添加到了暂存区,后续可以通过git commit
提交到本地仓库。# 创建一个新文件 touch new_file.txt # 将新文件添加到暂存区 git add new_file.txt
暂存已修改的文件:如果你对已经被 Git 追踪的文件进行了修改,使用
git add
可以将这些修改添加到暂存区。# 修改 existing_file.txt 文件 # 将修改添加到暂存区 git add existing_file.txt
暂存删除操作:当你删除了工作目录中的文件,使用
git add
可以将删除操作记录到暂存区。# 删除文件 rm deleted_file.txt # 将删除操作添加到暂存区 git add deleted_file.txt
批量添加文件:
git add
支持使用通配符来批量添加文件。# 添加当前目录下所有以 .txt 结尾的文件 git add *.txt # 添加当前目录下所有文件 git add .
2.2.4 git commit
git commit
命令将暂存区的修改提交到本地仓库。每一次提交都会生成一个唯一的哈希值commit hash
,用于标识该提交,并且会记录提交的作者、提交时间和提交信息等元数据。
# 提交暂存区的修改,并直接输入提交信息
git commit -m "修复登录Bug"
# 直接将工作目录中的修改提交到本地仓库,跳过暂存区
git commit -a -m "修复登录Bug"
86182@tao MINGW64 /e/Git-Space/demo-project (master)
$ git commit -m "first commit" hello.txt
warning: in the working copy of 'hello.txt', LF will be replaced by CRLF the next time Git touches it
[master (root-commit) db13ef1] first commit
1 file changed, 23 insertions(+)
create mode 100644 hello.txt
# 指向Second commit
86182@tao MINGW64 /e/Git-Space/demo-project (master)
$ git reflog
eda1f57 (HEAD -> master) HEAD@{0}: commit: Second commit
db13ef1 HEAD@{1}: commit (initial): first commit
86182@tao MINGW64 /e/Git-Space/demo-project (master)
2.2.5 git reset
git reset
命令的主要作用是重置当前分支的 HEAD 指针,而 --hard
选项则表示不仅要重置 HEAD 指针,还要将暂存区和工作目录都恢复到指定提交的状态。也就是说,它会丢弃自指定提交之后的所有本地修改,包括未提交的修改和已暂存但未提交的修改。使用方式有以下几种:
提交哈希值
# 查看提交历史 git log # 重置到指定提交 git reset --hard 123456789abcdef
分支名:可以将分支重置到某个分支的最新提交状态。
git reset --hard main
该命令的使用场景如下:
撤销本地修改:当你在本地进行了一些修改,但发现这些修改是错误的,或者想要放弃这些修改,回到之前的某个提交状态时,可以使用
git reset --hard
命令。同步远程分支:如果远程分支有新的提交,而你本地的修改不再需要,想要直接将本地分支重置到远程分支的最新状态,可以先拉取远程分支,然后使用
git reset --hard
命令。例如:git fetch origin git reset --hard origin/main
该命令的功能是很强大的,使用时应该慎用,使用不当可能会导致数据丢失,因此需要注意以下事项:
数据丢失风险:
git reset --hard
会永久丢弃自指定提交之后的所有本地修改,这些修改无法通过常规的 Git 操作恢复。因此,在使用该命令之前,一定要确保你真的想要丢弃这些修改。多人协作问题:在多人协作的项目中,如果使用
git reset --hard
命令将本地分支重置到某个旧的提交,然后再推送到远程仓库,可能会覆盖其他开发者的提交,导致冲突和数据丢失。因此,在多人协作的环境中,要谨慎使用该命令,最好先与团队成员沟通。备份重要修改:如果不确定是否要丢弃某些修改,可以先将这些修改保存到一个新的分支或者使用
git stash
命令将其暂存起来,然后再使用git reset --hard
命令。如下:# 暂存当前修改 git stash # 重置到指定提交 git reset --hard <commit> # 恢复暂存的修改 git stash pop
2.3 分支管理
在 Git 中,分支Branch
是一个非常重要的概念,它允许开发者在不影响主代码的情况下,并行地开发新功能、修复 bug 或进行实验性修改。分支的常用命令如下:
命令 | 说明 | 示例 |
---|---|---|
git branch [-v] |
查看本地分支【-v 更详细】 |
git branch |
git branch <name> |
创建新分支 | git branch feature-login |
git checkout <branch> |
切换分支 | git checkout main |
git switch <branch> |
切换分支(Git 2.23+推荐) | git switch feature |
git checkout -b <branch> |
创建并切换到新分支 | git checkout -b hotfix |
git merge <branch> |
合并指定分支到当前分支 | git merge feature |
git branch -d <branch> |
删除本地分支 | git branch -d old-feature |
git branch -D <branch> |
强制删除未合并的分支 | git branch -D broken-feature |
分支的本质如下:
- 轻量级指针:分支本质上是一个指向提交
commit
的指针,它记录了某个特定版本的代码状态。 - 并行开发:多个分支可以同时存在,每个分支代表不同的开发方向,开发者可以在不同分支上独立工作。
分支的作用如下:
- 隔离开发:避免在主分支如
main
或master
上直接修改代码,防止未完成的功能或错误影响稳定版本。 - 并行工作:团队成员可以在不同分支上同时开发不同的功能,互不干扰。
- 版本管理:通过分支管理不同的版本,如测试版、发布版。
- 灵活回溯:可以基于某个历史提交创建分支,修复旧版本的问题。
分支的工作原理如下:
- 默认分支:初始化 Git 仓库时,会自动创建一个主分支,通常命名为
main
或master
。 - 分支创建:使用
git branch
命令创建新分支,新分支会复制当前分支的代码状态。 - 分支切换:通过
git checkout
或git switch
命令切换分支,工作目录会更新为目标分支的代码。 - 分支合并:使用
git merge
或git rebase
命令将分支的修改合并到其他分支。
常见的分支类型如下:
- 主分支(Main Branch):通常用于存放稳定的生产代码,如
main
。 - 功能分支(Feature Branch):用于开发新功能,完成后合并到主分支。
- 修复分支(Hotfix Branch):用于紧急修复线上
bug
,直接基于主分支创建。 - 实验分支(Experiment Branch):用于尝试高风险或不确定的修改,失败后可删除。
分支是Git
中的核心之一,有以下注意点:
- 避免长期未合并的分支:长期不合并可能导致冲突难以解决。
- 分支命名规范:使用清晰的命名(如
fix/login-bug
、feature/payment
),便于识别。 - 保护主分支:通过权限控制避免直接提交到主分支,推荐通过合并请求(Pull Request)管理。
分支冲突:分支冲突是指在合并分支的过程中,Git 无法自动决定如何将不同分支上的修改整合到一起,从而需要用户手动介入解决的情况。**当出现分支冲突时,Git 会在合并过程中暂停,并在终端输出相应的冲突信息。同时,冲突的文件会包含特殊的标记,用于指示冲突的位置和内容。**此时可以使用vim
进入冲突文件进行手动修改,一般格式如下:
未修改内容
<<<<<<< HEAD
当前分支的修改内容
=======
合并进来的分支的修改内容
>>>>>>> branch-name
对于发生冲突的情况,有以下两种解决办法:
- 手动解决冲突
- 编辑冲突文件:打开包含冲突标记的文件,根据实际需求选择保留哪个分支的修改,或者将两个分支的修改进行合并。例如,对于上述冲突标记的内容,你可以根据需要选择保留其中一段,或者将两段内容进行整合。
- 移除冲突标记:在解决冲突后,删除文件中的
<<<<<<<
、=======
和>>>>>>>
等冲突标记。 - 添加并提交修改:使用
git add
命令将解决冲突后的文件添加到暂存区,然后使用git commit
命令提交修改。
- 放弃合并:如果冲突过于复杂,无法解决,或者你不想继续合并操作,可以使用
git merge --abort
命令放弃当前的合并操作,回到合并前的状态。
2.4 查看历史与差异
命令 | 说明 | 示例 |
---|---|---|
git reflog |
查看提交历史 | git reflog |
git log |
查看提交历史【完整信息】 | git log |
git log --oneline |
查看简洁版提交历史 | git log --oneline |
git log -p <file> |
查看某文件的详细修改历史 | git log -p app.js |
git diff |
查看工作区与暂存区的差异 | git diff |
git diff --staged |
查看暂存区与最新提交的差异 | git diff --staged |
2.5 远程仓库操作
命令 | 说明 | 示例 |
---|---|---|
git remote -v |
查看关联的远程仓库地址 | git remote -v |
git remote add <name> <url> |
关联远程仓库 | git remote add origin https://github.com/xxx.git |
git remote rename <旧别名> <新别名> |
修改远程仓库别名 | / |
git remote set-url <别名> <新地址> |
修改别名对应的远程仓库地址 | / |
git push |
推送本地提交到远程仓库 | git push origin main |
git push -u origin <branch> |
推送并关联远程分支【首次推送】 | git push -u origin dev |
git pull |
拉取远程分支并合并到当前分支 | git pull origin main |
git fetch |
仅拉取远程更新【不自动合并】 | git fetch origin |
git remote add <name> <url>
是 Git 里的一个常用命令,其用途是在本地仓库和远程仓库之间建立关联。
<name>
:这是你为远程仓库所设定的别名。一般情况下,默认使用origin
作为主远程仓库的别名,建议仓库名和项目名一致。<url>
:这指的是远程仓库的地址,该地址可以是 HTTPS 地址(例如https://github.com/user/repo.git
),也可以是 SSH 地址(例如git@github.com:user/repo.git
)。86182@tao MINGW64 /e/Git-Space/demo-project (master) $ git remote add git-demo https://github.com/2781196094/git-demo.git 86182@tao MINGW64 /e/Git-Space/demo-project (master) $ git remote -v git-demo https://github.com/2781196094/git-demo.git (fetch) git-demo https://github.com/2781196094/git-demo.git (push)
git push
是 Git 中一个极为重要的命令,它的主要功能是将本地仓库中的提交推送到远程仓库。其基本语法为git push <远程仓库名> <本地分支名>:<远程分支名>
。***在执行 git push
之前,建议先使用 git pull
命令将远程仓库的最新更改拉取到本地,以避免冲突。***若没有足够的权限向远程仓库推送更改,会收到权限错误提示。此时,你需要确认自己的权限或者联系仓库管理员。
git push origin main
git push origin local-branch:remote-branch
// 删除远程分支
git push origin --delete remote-branch
2.6 SSH
免密登录
SSH 免密登录是一种允许用户在不输入密码的情况下通过 SSH(Secure Shell)
协议登录到远程服务器或主机的技术。以下是其原理、配置方法和优缺点的介绍:
- 原理:SSH 免密登录基于公钥加密技术。用户在本地生成一对密钥,包括公钥和私钥。将公钥复制到远程服务器上,当用户尝试登录远程服务器时,服务器会使用用户的公钥对一个随机数据进行加密,然后发送给用户。用户的本地 SSH 客户端使用私钥对这个加密数据进行解密,并将解密结果返回给服务器。服务器通过验证解密结果来确认用户的身份,如果验证成功,则允许用户登录,无需输入密码。
- 配置方法
- 生成密钥对:在本地主机上使用
ssh -keygen
命令生成公钥和私钥,通常会在用户目录下的.ssh
文件夹中生成id_rsa
(私钥)和id_rsa.pub
(公钥)文件。 - 上传公钥:将公钥内容添加到远程服务器的
authorized_keys
文件中。可以使用ssh-copy-id
命令将本地公钥复制到远程服务器,也可以手动将公钥内容追加到远程服务器的~/.ssh/authorized_keys
文件中。
- 生成密钥对:在本地主机上使用
- 优点
- 提高效率:无需每次登录时输入密码,节省了时间,尤其在需要频繁登录远程服务器进行操作时,能显著提高工作效率。
- 便于自动化:适合用于自动化脚本和批量操作,例如在进行服务器集群管理、自动化部署等任务时,无需为每个登录操作提供密码,方便脚本的编写和执行。
- 缺点
- 安全性风险:如果私钥泄露,他人就可以利用该私钥登录到配置了相应公钥的远程服务器,因此需要妥善保管私钥,设置严格的访问权限。
- 管理复杂度:在多用户或多服务器环境中,管理公钥和私钥对可能会增加一定的复杂度,需要确保公钥与正确的用户和服务器进行关联,并且及时更新和撤销不再使用的公钥。
如果 Git 要实现ssh
免密登录,可以按照如下步骤进行:
在用户家目录打开
git
终端,生成SSH
密钥对。执行下面命令后,会在用户家目录中生成.ssh
文件,里面存放公钥和私钥。$ ssh-keygen -t ed25519 -C "aaa@qq.com" Generating public/private ed25519 key pair. Enter file in which to save the key (/c/Users/86182/.ssh/id_ed25519): Enter passphrase for "/c/Users/86182/.ssh/id_ed25519" (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /c/Users/86182/.ssh/id_ed25519 Your public key has been saved in /c/Users/86182/.ssh/id_ed25519.pub The key fingerprint is: SHA256:7l4Cymw+R25MH3ZeY3PDcB8PL82J+q/daIVDvVErCT4 2781196094@qq.com The key's randomart image is: +--[ED25519 256]--+ | | | . .| | . . ..o| | E.o++.| | . S .=oB*| | o .ooo . =.BoB| | == oo+.o.+ = | | o. =..o.. o..| | .+ .o .++o.| +----[SHA256]-----+
86182@tao MINGW64 ~/.ssh $ ll total 3 -rw-r--r-- 1 86182 197609 411 Mar 20 17:29 id_ed25519 // 私钥 -rw-r--r-- 1 86182 197609 99 Mar 20 17:29 id_ed25519.pub // 公钥 -rw-r--r-- 1 86182 197609 92 Mar 20 09:37 known_hosts
添加公钥到代码托管平台,如
github
。连接成功后即可正常拉取、提交代码。
$ git pull git@github.com:aaa/git-demo.git remote: Enumerating objects: 5, done. remote: Counting objects: 100% (5/5), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) Unpacking objects: 100% (3/3), 927 bytes | 231.00 KiB/s, done. From github.com:2781196094/git-demo * branch HEAD -> FETCH_HEAD Updating c95cab6..81fa07b Fast-forward new.txt | 1 + 1 file changed, 1 insertion(+)
SSH
免密登录与Https
拉取的核心区别如下:
特性 | SSH 免密登录 | HTTP(S) 拉取 |
---|---|---|
协议 | SSH【加密传输】 | HTTP/HTTPS【明文/加密传输】 |
默认端口 | 22 | 80【HTTP】或 443【HTTPS】 |
身份验证方式 | 基于 SSH 密钥对【公钥+私钥) | 用户名+密码 或 个人访问令牌【PAT】 |
免密配置 | 通过密钥对实现永久免密 | 需手动缓存凭证【如 git config credential.helper 】 |
适用场景 | 高频操作、自动化脚本、安全敏感环境 | 临时使用、简单克隆、受限网络环境【如公司代理】 |
URL 格式 | git@github.com:user/repo.git |
https://github.com/user/repo.git |
防火墙限制 | 可能被限制【需开放 22 端口】 | 通常允许【走 HTTP/HTTPS 端口】 |
3. IDE
集成Git
3.1 git
忽略文件
为什么需要配置git
忽略文件?在使用 IntelliJ IDEA
集成 Git 时配置忽略文件【.gitignore
】的目的是避免将不必要的、自动生成的文件提交到版本控制中,如java
的out/
、node.js
的node_modules/
。其主要作用如下:
- 保护用户、环境特定的配置:IDEA 生成的
.idea
目录、.iml
文件等包含开发者本地 IDE 的个性化配置,如代码风格、运行配置等,又或是一些系统生成的文件,这些文件通常与项目本身无关。 - 避免提交冗余文件
- 编译输出文件:如 Java 的
target/
(Maven)、out/
(IDEA 默认编译目录)、build/
(Gradle)等。这些文件可以通过重新编译生成,无需版本控制。 - 依赖文件:如
node_modules/
(Node.js)、.venv/
(Python 虚拟环境)等。这些文件体积庞大且可通过包管理器恢复,提交它们会浪费存储空间。
- 编译输出文件:如 Java 的
- 提高协作效率和仓库清洁度
- 减少仓库体积:自动生成的文件(如日志、缓存)会占用不必要的存储空间,拖慢克隆和拉取操作。
- 防止历史记录污染:避免将临时文件(如
*.log
、*.tmp
)提交到仓库,保持提交历史的清晰。 - 统一团队规范:通过
.gitignore
确保所有开发者忽略相同的文件,避免误提交。
在IDE
中,要创建忽略文件,可以在项目根目录右键创建文件.gitignore
,然后找到选项Add to .gitignore
应用忽略规则即可,如果修改了.gitignore
文件本身则需要重新提交修改。git
忽略文件的模板如下:
# IDE 文件
.idea/
*.iml
*.ipr
*.iws
# 编译输出
target/
build/
out/
# 系统文件
.DS_Store
Thumbs.db
# 依赖目录
node_modules/
.vendor/
.venv/
# 日志和缓存
*.log
*.tmp
3.2 Pycharm
集成Git
首先打开设置File -> Settings
,导航到 Version Control → Git
,在Path to Git executable*
中输入 Git 可执行文件路径,点击Test
,如果输出版本号则配置成功,如下:
配置上git
后,就可以初始化Git
仓库了:
- 新项目:在导航栏的
VCS
中找到Create Git Repository
,选择项目目录作为仓库根目录。 - 已有项目:如果存在
.git
目录,则会自动识别;如果不存在同新项目。
在 PyCharm
或其他 JetBrains IDE
如 IntelliJ IDEA
中初始化 Git 仓库后,文件会通过不同颜色标识其版本控制状态。以下是常见颜色及其含义的详细说明:
颜色 | 状态 | 说明 |
---|---|---|
红色 | 未跟踪(Untracked) | 文件未被 Git 纳入版本控制(新创建或手动排除的文件)。 |
蓝色 | 已修改(Modified) | 文件已跟踪,但本地有未提交的更改。 |
绿色 | 已暂存(Staged) | 文件已通过 git add 添加到暂存区,等待提交。 |
灰色 | 已忽略(Ignored) | 文件被 .gitignore 规则排除,Git 不会跟踪。 |
黄色 | 冲突(Conflict) | 文件在合并或拉取时发生冲突,需手动解决。 |
深蓝色 | 未修改(Committed) | 文件已提交到仓库,当前内容与仓库最新版本一致。 |
3.3 文件颜色与状态对照
在 PyCharm
或其他 JetBrains IDE
如 IntelliJ IDEA
中初始化 Git 仓库后,文件会通过不同颜色标识其版本控制状态。以下是常见颜色及其含义的详细说明:
颜色 | 状态 | 说明 |
---|---|---|
红色 | 未跟踪Untracked |
文件未被 Git 纳入版本控制【新创建或手动排除的文件】 |
蓝色 | 已修改Modified |
文件已跟踪,但本地有未提交的更改 |
绿色 | 已暂存Staged |
文件已通过 git add 添加到暂存区,等待提交 |
灰色 | 已忽略Ignored |
文件被 .gitignore 规则排除,Git 不会跟踪 |
黄色 | 冲突Conflict |
文件在合并或拉取时发生冲突,需手动解决 |
深蓝色 | 未修改Committed |
文件已提交到仓库,当前内容与仓库最新版本一致 |
红色文件
Untracked
:如新创建的脚本文件、临时日志文件若需跟踪:右键文件 →
Git → Add
【或直接提交时勾选】。若需忽略:右键文件 →
Git → Add to .gitignore
【需插件支持,或手动编辑.gitignore
】。
蓝色文件
Modified
:如已修改的源代码文件、更新的配置文件提交更改:右键文件 →
Git → Commit File
→ 填写提交信息。撤销修改:右键文件 →
Git → Rollback
(谨慎操作,会丢失本地更改)。
绿色文件
Staged
:通过git add
添加的待提交文件提交到仓库:使用
Commit
按钮提交暂存区内容。取消暂存:右键文件 →
Git → Unstage
(或通过提交界面取消勾选)。
灰色文件
Ignored
:如虚拟环境目录(venv/
)、编译输出文件(__pycache__/
)检查
.gitignore
规则是否合理,必要时调整忽略规则。若需恢复跟踪:删除
.gitignore
中的相关规则 → 右键文件 →Git → Add
。
黄色文件
Conflict
:如多人协作时同时修改同一文件的同一区域打开冲突文件 → 使用 IDE 的三窗格合并工具解决冲突 → 标记为已解决(
Mark as Resolved
)→ 提交合并结果。若需中止合并:
Git → Reset HEAD
回退到合并前状态。
3.4 切换版本
如果需要查看提交信息,则可以点击Git
,如下:
如果需要切换版本则可以右键要切换的版本,点击Checkout Revision
即可,如下:
3.5 分支相关操作
在根目录右键找到new Branch
即可创建新的分支,如下:
当然切换分支也很简单,如下:
对于分支的合并,分为正常合并和合并冲突,下面为正常合并,选择需要合并的分支即可:
上面情况是理想情况,在实际开发中,经常遇到合并冲突的问题,这种情况则需要手动修改,总共有三种修改方案,如下:
4. Git hub
远程仓库
4.1 添加git hub
账号
通过账号添加
通过
Token
添加:首先在自己的git hub
账号上生成token
,在IDE
上配置该token
即可。
4.2 分享项目到git hub
4.3 推送、拉取、克隆
推送和拉取可以直接通过鼠标右键选择,如下:
如果需要克隆远程仓库的代码,需要配置远程仓库的地址,如下:
5. Gitee
码云
Gitee
是开源中国OSChina
推出的代码托管与协作平台,专注于为开发者提供稳定高效的Git服务,尤其适合中国用户,具备本土化优势和高速访问体验。支持个人、企业及开源项目的代码管理、协作开发和DevOps流程。其使用方式与Git hub
类似。
如果IDE
需要集成Gitee
,需要下载Gitee
插件。