跳到主要内容Git 版本控制从入门到精通实战指南 | 极客日志Shell / Bash
Git 版本控制从入门到精通实战指南
综述由AI生成Git 作为分布式版本控制系统,广泛应用于软件开发中。本文详细介绍了 Git 的安装配置、基础工作流程、工作区与版本库概念、分支管理策略以及远程仓库操作。内容涵盖从入门到进阶的实用技巧,包括 Git Flow 模型、标签管理、服务器搭建及图形化工具使用。通过清晰的命令示例和场景解析,帮助开发者掌握高效的代码版本控制方法,提升团队协作效率。
云间运维12 浏览 什么是 Git?
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
它是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的开放源码版本控制软件。与常用的 CVS、Subversion 等不同,它采用了分布式版本库的方式,不必依赖服务器端软件支持。
Git 与 SVN 区别
Git 不仅仅是个版本控制系统,它也是个内容管理系统 (CMS) 和工作管理系统等。
如果你习惯使用 SVN,需要做一些思想转换来适应 Git 的概念:
- 分布式架构:Git 是分布式的,SVN 不是。这是最核心的区别。
- 存储方式:Git 按元数据方式存储内容,SVN 按文件存储。
- 分支模型:Git 的分支非常轻量且强大,SVN 的分支只是版本库中的另一个目录。
- 版本号:Git 没有全局版本号,SVN 有。
- 完整性:Git 使用 SHA-1 哈希算法确保代码内容完整性,降低磁盘故障和网络问题的影响。
Git 安装配置
在使用 Git 前需要先安装。目前支持 Linux/Unix、Solaris、Mac 和 Windows 平台。
Linux 平台上安装
各大 Linux 平台可以使用包管理器进行安装。
Debian/Ubuntu 安装最新稳定版本:
apt-get install git
CentOS/RedHat 安装命令:
yum -y install git-core
Fedora 安装命令(21 及之前):
yum install git
Fedora 安装命令(22 及更高):
dnf install git
FreeBSD 安装命令:
pkg install git
OpenBSD 安装命令:
pkg_add git
Alpine 安装命令:
apk add git
源码安装
也可以从官网下载源码包安装。解压后执行以下命令:
tar -zxf git-1.7.2.2.tar.gz
cd git-1.7.2.2
make prefix=/usr/local all
sudo make prefix=/usr/local install
Windows 平台上安装
Windows 上推荐使用 msysGit 项目提供的安装包。下载 exe 文件并运行即可。
安装完成后,可以在开始菜单找到 "Git" -> "Git Bash" 弹出命令窗口进行操作。
如果使用 winget 工具,可以执行:
winget install --id Git.Git -e --source winget
Mac 平台上安装
通过 Homebrew 安装:
brew install git
如果需要安装 git-gui 和 gitk:
brew install git-gui
也可以使用图形化安装工具,下载 dmg 文件运行即可。
Git 配置
Git 提供了 git config 命令来配置工作环境变量。这些变量决定了 Git 在各个环节的具体工作方式。
/etc/gitconfig:系统级配置,对所有用户适用。
~/.gitconfig:用户级配置,仅适用于当前用户。
.git/config:项目级配置,仅针对当前项目有效。
用户信息
git config --global user.name "Your Name"
git config --global user.email [email protected]
文本编辑器
git config --global core.editor "code --wait"
差异分析工具
git config --global merge.tool vimdiff
查看配置信息
生成 SSH 密钥(可选)
验证安装
git --version
git config --list
Git 工作流程
克隆仓库
git clone https://github.com/username/repo.git
cd repo
创建新分支
git checkout -b new-feature
工作目录
暂存文件
git add filename
git add .
提交更改
git commit -m "Add new feature"
拉取最新更改
推送更改
git push origin new-feature
创建 Pull Request(PR)
在托管平台上创建 PR,邀请团队成员审查。合并后更改进入主分支。
合并更改
git checkout main
git pull origin main
git merge new-feature
删除分支
git branch -d new-feature
git push origin --delete new-feature
Git 工作区、暂存区和版本库
基本概念
- 工作区:你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index,一般存放在
.git/index 中。
- 版本库:工作区隐藏目录
.git,包含所有版本历史记录。
图中左侧为工作区,右侧为版本库。标记为 "index" 的区域是暂存区,"master" 代表 master 分支。
HEAD 指向 master 分支的一个游标。objects 标识区域为对象库,位于 .git/objects 目录下。
当对工作区修改执行 git add 时,暂存区更新,文件内容写入对象库,ID 记录在索引中。
执行 git commit 时,暂存区目录树写到版本库,master 分支更新。
执行 git reset HEAD 时,暂存区被重写,工作区不受影响。
执行 git rm --cached <file> 时,直接从暂存区删除文件。
执行 git checkout . 会用暂存区替换工作区文件,此操作危险,会清除未暂存的改动。
执行 git checkout HEAD . 会用 HEAD 指向的分支替换暂存区和工作区文件,同样危险。
1、工作区(Working Directory)
本地计算机上的项目目录,进行文件的创建、修改和删除。
- 显示项目的当前状态。
- 文件修改在此进行,但未记录到版本控制中。
2、暂存区(Staging Area)
- 保存下一个提交中的更改。
- 可多次使用
git add 直到准备好提交。
git add filename
git add .
git status
3、版本库(Repository)
- 分为本地和远程版本库。
- 本地存储在
.git 目录中。
git commit -m "Commit message"
git log
git diff
git diff --cached
关系流转
- 工作区 -> 暂存区:
git add
- 暂存区 -> 版本库:
git commit
- 版本库 -> 远程仓库:
git push
- 远程仓库 -> 本地版本库:
git pull 或 git fetch
实例
- 工作区:修改并保存。
- 暂存区:
git add file.txt
- 版本库:
git commit -m "Update file.txt"
- 远程仓库:
git push origin main
Git 创建仓库
git init
初始化 Git 仓库,生成 .git 目录,包含资源元数据。
使用方法
mkdir my-project
cd my-project
git add *.c
git add README
git commit -m '初始化项目版本'
注意:Linux 系统中 commit 信息可用单引号,Windows 命令行建议使用双引号。
git clone
git clone <repo> <directory>
git clone git://github.com/schacon/grit.git mygrit
配置
git config -e
git config -e --global
git config --global user.name "Your Name"
git config --global user.email [email protected]
Git 基本操作
常用 6 个命令:git clone、git push、git add、git commit、git checkout、git pull。
git init
git add .
git commit
创建仓库命令
| 命令 | 说明 |
|---|
git init | 初始化仓库 |
git clone | 拷贝远程仓库 |
提交与修改
| 命令 | 说明 |
|---|
git add | 添加文件到暂存区 |
git status | 查看仓库当前状态 |
git diff | 比较文件差异 |
git difftool | 使用外部差异工具 |
git commit | 提交暂存区到本地仓库 |
git reset | 回退版本 |
git rm | 删除文件 |
git mv | 移动或重命名文件 |
git checkout | 分支切换 |
git switch | 更清晰地切换分支 |
git restore | 恢复或撤销文件更改 |
git show | 显示 Git 对象详细信息 |
提交日志
| 命令 | 说明 |
|---|
git log | 查看历史提交记录 |
git blame | 查看文件历史修改记录 |
git shortlog | 生成简洁摘要 |
git describe | 基于标签描述提交 |
远程操作
| 命令 | 说明 |
|---|
git remote | 远程仓库操作 |
git fetch | 从远程获取代码 |
git pull | 下载并合并 |
git push | 上传并合并 |
git submodule | 管理子模块 |
Git 文件状态
工作目录
- 未跟踪(Untracked):新文件,未被 Git 记录。
- 已修改(Modified):已跟踪文件发生更改,未提交。
暂存区
- 使用
git add <filename> 添加文件。
- 使用
git add . 添加所有更改。
本地仓库
- 隐藏在
.git 目录中。
- 使用
git commit -m "commit message" 提交。
状态转换流程
- 未跟踪:新文件。
touch newfile.txt
git status
- 已跟踪:
git add 后。
git add newfile.txt
git status
- 已修改:对已跟踪文件更改。
echo "Hello" > newfile.txt
git status
- 已暂存:
git add 后等待提交。
git add newfile.txt
git status
- 已提交:
git commit 后。
git commit -m "Added newfile.txt"
git status
Git 分支管理
创建分支
git checkout -b <branchname>
git checkout <branchname>
查看分支
合并分支
解决合并冲突
git add <conflict-file>
git commit
删除分支
git branch -d <branchname>
git branch -D <branchname>
git push origin --delete <branchname>
实例
mkdir gitdemo
cd gitdemo/
git init
touch README
git add README
git commit -m '第一次版本提交'
git branch testing
git branch
git checkout -b newtest
git rm test.txt
touch runoob.php
git add .
git commit -am 'removed test.txt, add runoob.php'
git checkout master
git merge newtest
git branch -d newtest
合并冲突示例
git checkout -b change_site
vim runoob.php
git commit -am 'changed the runoob.php'
git checkout master
vim runoob.php
git commit -am '修改代码'
git merge change_site
cat runoob.php
git add runoob.php
git commit
命令手册
| 命令 | 说明 | 用法示例 |
|---|
git branch | 分支管理 | git branch, git branch -d old |
git checkout | 切换分支或恢复文件 | git checkout branch-name |
git switch | 专门切换分支 | git switch -c new-branch |
git merge | 合并分支 | git merge branch-name |
git mergetool | 启动合并工具 | git mergetool |
git log | 显示提交历史 | git log --oneline |
git stash | 保存未提交更改 | git stash pop |
git tag | 创建或删除标签 | git tag v1.0 |
git worktree | 多工作区管理 | git worktree add path branch |
Git 查看提交历史
git log
-p:显示补丁内容。
--oneline:简洁一行格式。
--graph:图形化显示分支合并。
--author=<作者>:特定作者。
--since=<时间>:指定时间之后。
--grep=<模式>:搜索提交消息。
git log --oneline --graph
git log --reverse --oneline
git log --author=Linus --oneline -5
git blame
-L:指定行号范围。
-C:溯源重命名或拷贝行。
-M:溯源移动行。
git blame --show-stats <文件路径>
恢复和回退
1、git checkout
git checkout <commit> -- <filename>
2、git reset
--soft:只重置 HEAD。
--mixed(默认):重置 HEAD 和暂存区。
--hard:重置 HEAD、暂存区和工作目录。
3、git revert
4、git reflog
git reflog
git reset --hard HEAD@{3}
Git 标签
git tag -a v1.0 -m "message"
推送标签到远程仓库
git push origin <tagname>
git push origin --tags
删除标签
git push origin --delete <tagname>
Git Flow
一种基于 Git 的分支模型,旨在帮助团队更好地管理和发布软件。
主要由以下几类分支组成:master、develop、feature、release、hotfix。
Git Flow 安装
Linux
sudo apt-get install git-flow
macOS
Windows
使用 Git for Windows 或 Chocolatey/Scoop 包管理工具安装。
Git Flow 分支模型
- master:永远保持稳定和可发布状态。
- develop:集成所有开发分支,代表最新开发进度。
- feature:开发新功能,从 develop 创建,完成后合并回 develop。
- release:准备新版本,从 develop 创建,测试修复后合并回 develop 和 master。
- hotfix:紧急修复,从 master 创建,完成后合并回 master 和 develop。
Git Flow 工作流程
1. 初始化 Git Flow
2. 创建功能分支
git flow feature start feature-name
git flow feature finish feature-name
3. 创建发布分支
git flow release start release-name
git flow release finish release-name
4. 创建修复分支
git flow hotfix start hotfix-name
git flow hotfix finish hotfix-name
优点和缺点
优点:明确的分支模型,隔离开发和发布,版本管理方便。
缺点:对于小型项目可能过于复杂,频繁合并可能导致冲突增加。
Git 进阶操作
1、交互式暂存(Interactive Staging)
2、Git Stash
git stash
git stash list
git stash apply
git stash pop
3、Git Rebase
4、Git Cherry-Pick
Git 远程仓库
Git 不像 SVN 那样有个中心服务器。如果想分享代码,需要将数据放到服务器上。
添加远程库
git remote add [shortname] [url]
生成 SSH Key 并添加到 GitHub/GitLab 等平台。
查看当前的远程库
提取远程仓库
- 下载新分支与数据:
git fetch
- 提取并尝试合并:
git pull
推送到远程仓库
git push [alias] [branch]
删除远程仓库
Git 服务器搭建
使用裸存储库(Bare Repository)
1、安装 Git
2、创建裸存储库
groupadd git
useradd git -g git
sudo su - git
cd /home
mkdir gitrepo
chown git:git gitrepo/
cd gitrepo
git init --bare runoob.git
chown -R git:git runoob.git
3、创建证书登录
将公钥添加到 ~/.ssh/authorized_keys。
4、克隆仓库
git clone git@server_ip:/home/gitrepo/runoob.git
使用 GitLab
- 安装 GitLab。
- 配置管理员账户。
- 创建项目。
- 生成密钥对并添加 SSH key。
- 克隆项目。
Sourcetree 使用教程
SourceTree 是 Git 客户端管理工具,适用于 Windows 和 Mac。
Sourcetree 安装
连接 Github 账户
创建本地仓库
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online