如何使用Git
Git简介
Git 是一个分布式版本控制系统,用来管理代码或任何文件的版本历史。
常用于协作开发,支持分支、合并、回滚等操作。
Windows
再Windows上安装Git。
官网下载:https://git-scm.com/download/win
安装之后,就可以使用命令行git工具了。
在开始菜单里找到 “Git”->”Git Bash”,会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。
Git配置
基本身份配置
在第一次使用 Git 时,先配置用户名和邮箱:
1 | git config --global user.name "你的名字" |
这会把配置写入 ~/.gitconfig 文件,并对所有仓库生效。如果只想对当前仓库有效,去掉 –global。
查看配置
查看所有当前生效的配置项:
1 | git config --list |
Git常用命令
仓库操作
初始化一个新仓库
1 | git init |
克隆远程仓库
克隆远程仓库
1 | git clone <仓库地址> |
文件追踪
查看当前状态
1 | git status |
添加文件到暂存区
1 | git add <文件或目录> |
添加全部改动:
1 | git add . |
从暂存区移除文件
1 | git reset HEAD <文件> |
提交
提交到本地仓库
1 | git commit -m "提交信息" |
修改上一次提交(比如漏文件、改信息)
1 | git commit --amend |
日志查看
查看提交历史
1 | git log |
简洁单行显示:
1 | git log --oneline |
分支管理
查看分支
1 | git branch |
新建分支
1 | git branch <分支名> |
切换分支
1 | git checkout <分支名> |
创建并切换新分支
1 | git checkout -b <分支名> |
删除分支
1 | git branch -d <分支名> |
合并与变基
合并分支到当前分支
1 | git merge <分支名> |
交互式变基(整理提交历史)
1 | git rebase -i HEAD~N |
远程操作
添加远程仓库
1 | git remote add origin <仓库地址> |
查看远程地址
1 | git remote -v |
推送到远程分支
1 | git push origin <分支名> |
拉取远程更新并合并
1 | git pull |
获取远程更新但不合并
1 | git fetch |
撤销与恢复
丢弃工作区改动(慎用)
1 | git checkout -- <文件> |
回到最近一次提交状态
1 | git reset --hard |
撤销最近的提交(保留改动在工作区)
1 | git reset --soft HEAD~1 |
Git创建仓库
把工作目录切换到项目所在位置,要是项目目录不存在,就先创建一个。
执行git init命令,对 Git 仓库进行初始化。
把文件添加到暂存区,使用git add命令。
进行首次提交,使用git commit -m “Initial commit”命令。
查看仓库状态,使用git status
以下是具体的操作示例:
1 | # 新建项目目录(若目录已存在则跳过此步) |
关联远程仓库
若要将本地仓库与远程仓库(例如 GitHub)进行关联,可按以下步骤操作:
- 在远程平台上创建一个空仓库。
- 在本地仓库中添加远程仓库地址。
- 将本地分支推送到远程仓库。
具体命令如下:
1 | #添加远程仓库地址 |
从远程仓库克隆
当需要获取远程仓库的副本时,可以使用git clone命令:
1 | git clone https://github.com/ |
这些都是 Git 的基础操作,在实际的开发流程中,还会涉及分支管理、拉取更新等更多操作。
workspace:工作区
staging area:暂存区/缓存区
local repository:版本库或本地仓库
remote repository:远程仓库
Git分支管理
Git 的分支管理是其核心功能之一,它允许开发者在同一仓库中并行开发多个特性或修复 bug,而不影响主分支的代码。以下是关于 Git 分支管理的详细介绍:
- 分支的基本概念
什么是分支?
分支是指向提交对象的可变指针。Git 的默认分支名为master(或main),每次提交时,当前分支指针会向前移动。
分支本质:一个轻量级的可移动引用,存储在.git/refs/heads/目录下。
分支的优势
并行开发:同时进行多个特性开发或 bug 修复。
隔离风险:在分支上的修改不会影响主分支,直到合并完成。
简化协作:团队成员可以在独立分支上工作,减少冲突。
2. 分支的基本操作
查看分支
1 | git branch # 查看本地分支 |
创建分支
1 | git branch <分支名> # 创建新分支(不切换) |
切换分支
1 | git checkout <分支名> # 切换到已存在的分支 |
删除分支
1 | git branch -d <分支名> # 删除已合并的分支(安全删除) |
重命名分支
1 | git branch -m <旧分支名> <新分支名> # 重命名当前分支 |
- 分支合并
合并分支的两种方式
Fast-forward(快进合并):当分支没有分叉时,直接将指针向前移动。
1 | git checkout main |
三方合并(Three-way Merge):当分支有分叉时,Git 会找到两个分支的共同祖先,创建一个新的合并提交。
1 | git checkout main |
合并冲突
当两个分支修改了同一文件的同一部分时,会发生冲突。解决方法:
手动编辑文件:打开冲突文件,根据标记(<<<<<<<、=======、>>>>>>>)修改内容。
使用合并工具:如git mergetool。
提交合并结果:
1 | git add <冲突文件> |
- 分支管理策略
Git Flow
主分支:master(生产环境)和develop(开发主分支)。
辅助分支:
Feature 分支:
从develop创建,完成后合并回develop。
Release 分支:
准备发布时从develop创建,测试后合并到master和develop。
Hotfix 分支:
紧急修复生产问题,从master创建,完成后合并回master和develop。
GitHub Flow
单一主分支:main始终保持可部署状态。
流程:
从main创建新分支。
提交修改并推送到远程。
创建 Pull Request(PR)进行代码审查。
测试通过后合并到main。
立即部署到生产环境。
GitLab Flow
基于 GitHub Flow,增加了环境分支(如staging、production),适合多环境部署。
5. 远程分支操作
推送本地分支到远程
1 | git push -u origin <本地分支名> # 首次推送并关联上游分支 |
跟踪远程分支
1 | git checkout -b <本地分支名> origin/<远程分支名> # 创建并跟踪远程分支 |
拉取远程分支更新
1 | git pull # 拉取并合并远程分支 |
删除远程分支
1 | git push origin --delete <远程分支名> |
- 分支的高级用法
变基(Rebase)
将一系列提交应用到另一个基准点,使提交历史更线性。
1 | git checkout feature-branch |
** cherry-pick**
将指定提交应用到当前分支。
1 | git cherry-pick <提交哈希> # 复制特定提交到当前分支 |
暂存(Stash)
临时保存未完成的修改,用于切换分支。
1 | git stash # 保存当前修改 |
- 分支管理最佳实践
保持主分支稳定:main/master只包含经过测试的代码。
小而专注的分支:每个分支只做一件事(如新特性或 bug 修复)。
定期同步分支:通过git pull –rebase保持分支更新,减少冲突。
使用 PR/MR 进行代码审查:合并前确保代码质量。
删除已合并的分支:保持仓库整洁。
示例工作流程
1 | # 1. 创建并切换到新分支 |
通过合理使用分支管理,开发者可以高效地组织代码、隔离风险,并简化团队协作。Git 的分支操作非常轻量,因此鼓励频繁创建和使用分支!
Git 查看提交历史
常用选项
限制显示的提交数:
1 | git log -n <number> |
例如,显示最近的 5 次提交:
1 | git log -n 5 |
显示自指定日期之后的提交:
1 | git log --since="2024-01-01" |
显示指定日期之前的提交:
1 | git log --until="2024-07-01" |
只显示某个作者的提交:
1 | git log --author="Author Name" |
Git标签
Git 标签(Tag)是用于标记版本历史中特定提交的指针,常用于标记发布点(如v1.0.0)或重要里程碑。与分支不同,标签是不可变的,一旦创建就不会移动。
- 标签的基本概念
标签的作用
版本标记:标记发布版本(如v1.0.0、v2.3.1)。
重要里程碑:标记关键提交(如架构重构、重大功能发布)。
快速定位:通过标签名快速切换到历史版本。
标签的类型
轻量标签(Lightweight):
简单指向特定提交的引用,无额外元数据。
存储在.git/refs/tags/目录下。
附注标签(Annotated):
完整的 Git 对象,包含标签名、标签人、日期、注释信息。
可签名(GPG),用于验证版本。
- 标签的基本操作
创建标签1
2
3
4
5
6
7
8
9
10
11# 创建轻量标签(指向当前提交)
git tag <标签名>
# 创建轻量标签(指向特定提交)
git tag <标签名> <提交哈希>
# 创建附注标签(带注释)
git tag -a <标签名> -m "标签说明"
# 创建带签名的附注标签(需GPG密钥)
git tag -s <标签名> -m "签名标签说明"
查看标签
1 | git tag # 列出所有标签 |
切换到标签
1 | git checkout <标签名> # 切换到标签(处于“分离HEAD”状态) |
删除标签
1 | git tag -d <标签名> # 删除本地标签 |
- 远程标签操作
推送标签到远程
1 | git push origin <标签名> # 推送单个标签 |
删除远程标签
1 | git push origin --delete <标签名> # Git 2.8+ |
获取远程标签
1 | git fetch origin --tags # 获取所有远程标签 |
- 标签命名规范
常见的标签命名规范:
语义化版本:v<主版本>.<次版本>.<修订号>(如v1.0.0、v2.3.1)。
发布类型:
正式版:v1.0.0
预发布版:v1.0.0-alpha、v1.0.0-beta.1、v1.0.0-rc.1
特殊标记:v1.0.0-hotfix、v2.0.0-20230615
- 标签的最佳实践
使用附注标签:建议在发布版本时使用附注标签,保留完整元数据。
及时打标签:在发布或重要提交后立即打标签。
避免修改标签:标签是不可变的,如需修改需删除后重新创建(可能影响协作)。
定期清理标签:删除不再需要的本地 / 远程标签。
标签与分支的区别:
分支:用于开发,指针会随提交移动。
标签:用于标记历史版本,指针固定不变。
示例工作流程
1 | # 1. 提交代码到主分支 |
Git 标签是版本管理的重要工具,通过合理使用标签,可以清晰地标记项目的关键节点,便于回溯和发布管理。
Git进阶操作
- 交互式暂存(Interactive Staging)
作用:逐块选择要暂存的更改,精细控制提交内容。
场景:当一次修改包含多个逻辑更改,需要拆分为多个提交时。
基本用法
1 | git add -p # 交互式暂存(-p 是 --patch 的缩写) |
交互命令
y:暂存当前区块
n:跳过当前区块
s:拆分当前区块(如果区块较大)
e:手动编辑当前区块
d:查看 diff
q:退出
示例
假设修改了两个功能(用户认证和支付),但想分开提交:
1 | # 进入交互式暂存模式 |
- Git Stash
作用:临时保存工作进度,方便切换任务。
场景:需要紧急切换分支,但当前工作未完成。
基本操作
1 | git stash save "临时保存未完成的功能" # 保存当前进度 |
高级用法
1 | git stash branch new-feature # 从stash创建新分支并自动应用 |
示例
1 | # 当前在feature分支开发未完成,需要紧急修复bug |
- Git Rebase
作用:将一个分支上的更改移到另一个分支之上,保持提交历史线性。
场景:在推送到远程前整理本地提交,或同步最新主分支。
基本用法
1 | # 将feature分支的提交变基到main |
交互式变基
合并、修改或删除历史提交:
1 | git rebase -i HEAD~3 # 编辑最近3次提交 |
示例
1 | # 1. 从main创建新分支并提交两次 |
- Git Cherry-Pick
作用:选择特定提交并应用到当前分支。
场景:将其他分支的某个提交引入当前分支,而非合并整个分支。
基本用法
1 | git cherry-pick <提交哈希> # 应用单个提交 |
示例
假设在feature分支上有一个修复提交abc123,需要应用到main分支:
1 | # 1. 切换到main分支 |
最佳实践建议
- 交互式暂存:
每次提交只包含一个逻辑更改
使用git add -p避免提交无关修改 - Git Stash:
定期清理不再需要的 stash
使用描述性的 stash 消息 - Git Rebase:
只对未推送到远程的提交使用 rebase
复杂变基前先备份分支(git branch backup-feature) - Git Cherry-Pick:
避免跨分支频繁 cherry-pick,优先使用合并
注意提交作者信息是否需要保留(-x选项)
这些高级技巧能显著提升代码管理效率,但需谨慎使用,尤其是在团队协作环境中。建议先在个人分支练习,熟悉后再应用到实际开发流程中。
Git远程Github
在 GitHub 上创建远程仓库
登录 GitHub官网。
点击页面右上角 ➕ → New repository。
填写:
Repository name:比如 my-awesome-project Description(可选):项目描述 Public / Private:公开或私有
可以不用勾选「Initialize this repository with a README」—— 方便后面和本地仓库关联。
点击 Create repository。
此时 GitHub 会给你显示一页命令提示,比如:
1 | git remote add origin https://github.com/用户名/仓库名.git |
在本地创建并初始化 Git 仓库
进入你的项目目录:
1 | cd 路径/你的项目目录 |
初始化仓库:
1 | git init |
添加文件:
1 | git add . |
提交到本地:
1 | git commit -m "Initial commit" |
将本地仓库关联到 GitHub 远程仓库
将 GitHub 上刚刚创建的仓库 URL(HTTPS 或 SSH)添加到本地:
1 | git remote add origin https://github.com/用户名/仓库名.git |
推送到远程仓库
第一次推送时,通常需要 -u 参数建立本地分支与远程分支的关联:
1 | git push -u origin main |
如果你本地分支是 master,GitHub 创建的新仓库默认分支是 main,需要先重命名:
1 | git branch -M main |
从远程仓库克隆代码
如果是其他人要获取你的项目,或者你在其他机器上工作,可以直接克隆:
1 | git clone https://github.com/用户名/仓库名.git |
常用远程操作命令
功能 命令
查看当前远程仓库地址 git remote -v
修改远程仓库地址 git remote set-urlorigin 新地址
拉取远程仓库更新 git pull origin main
推送到远程仓库 git push origin main
删除远程仓库关联 git remote remove origin
查看远程仓库分支 git branch -r
HTTPS 和 SSH 的区别
HTTPS:
使用方便,直接用 GitHub 提供的 HTTPS 链接。
缺点是每次推送/拉取可能会提示你输入 GitHub 账号和密码(或 token)。
SSH:
配置一次 SSH Key 后,再推送/拉取都不会需要输入密码。
适合经常操作。
如何配置 SSH Key 以使用 SSH
- 在终端生成 SSH Key:
1 | ssh-keygen -t ed25519 -C "你的邮箱" |
按提示一直回车即可,会在 /.ssh/id_ed25519 生成私钥、/.ssh/id_ed25519.pub 生成公钥。
- 复制公钥内容:
1 | cat ~/.ssh/id_ed25519.pub |
登录 GitHub → 点击右上角头像 → Settings → 左侧菜单 SSH and GPG keys → New SSH key,把上一步复制的公钥内容粘贴进去。
以后你就可以用 SSH 形式克隆仓库,比如:
1 | git clone git@github.com:用户名/仓库名.git |
其他常见问题
- 如何修改 Git 用户名/邮箱?
1 | git config --global user.name "你的名字" |
- 如何只对当前项目设置用户名/邮箱?
1 | git config user.name "你的名字" |
- 如何切换到其他分支?
1 | git checkout 分支名 |
- 如何从远程拉取其他分支?
1 | git fetch origin |
常见完整操作流程
1 | # 1. 创建本地仓库 |