Git简介

Git 是一个分布式版本控制系统,用来管理代码或任何文件的版本历史。

常用于协作开发,支持分支、合并、回滚等操作。

Windows

再Windows上安装Git。
官网下载:https://git-scm.com/download/win
安装之后,就可以使用命令行git工具了。
在开始菜单里找到 “Git”->”Git Bash”,会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。

Git配置

基本身份配置

在第一次使用 Git 时,先配置用户名和邮箱:

1
2
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

这会把配置写入 ~/.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创建仓库

  1. 把工作目录切换到项目所在位置,要是项目目录不存在,就先创建一个。

  2. 执行git init命令,对 Git 仓库进行初始化。

  3. 把文件添加到暂存区,使用git add命令。

  4. 进行首次提交,使用git commit -m “Initial commit”命令。

  5. 查看仓库状态,使用git status

以下是具体的操作示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 新建项目目录(若目录已存在则跳过此步)
mkdir myproject
cd myproject

# 初始化Git仓库
git init

# 创建文件并添加内容
echo "Hello, Git!" > README.md

# 添加文件到暂存区
git add README.md

# 提交到本地仓库
git commit -m "Initial commit"

# 查看仓库状态
git status

关联远程仓库

若要将本地仓库与远程仓库(例如 GitHub)进行关联,可按以下步骤操作:

  1. 在远程平台上创建一个空仓库。
  2. 在本地仓库中添加远程仓库地址。
  3. 将本地分支推送到远程仓库。

具体命令如下:

1
2
3
4
5
#添加远程仓库地址
git remote add origin https://github.com/

# 推送本地master分支到远程仓库
git push -u origin master

从远程仓库克隆

当需要获取远程仓库的副本时,可以使用git clone命令:

1
git clone https://github.com/

这些都是 Git 的基础操作,在实际的开发流程中,还会涉及分支管理、拉取更新等更多操作。

workspace:工作区
staging area:暂存区/缓存区
local repository:版本库或本地仓库
remote repository:远程仓库

Git分支管理

Git 的分支管理是其核心功能之一,它允许开发者在同一仓库中并行开发多个特性或修复 bug,而不影响主分支的代码。以下是关于 Git 分支管理的详细介绍:

  1. 分支的基本概念

什么是分支?

分支是指向提交对象的可变指针。Git 的默认分支名为master(或main),每次提交时,当前分支指针会向前移动。
分支本质:一个轻量级的可移动引用,存储在.git/refs/heads/目录下。
分支的优势
并行开发:同时进行多个特性开发或 bug 修复。
隔离风险:在分支上的修改不会影响主分支,直到合并完成。
简化协作:团队成员可以在独立分支上工作,减少冲突。
2. 分支的基本操作

查看分支

1
2
3
4
git branch            # 查看本地分支
git branch -r # 查看远程分支
git branch -a # 查看所有分支(本地+远程)
git branch -vv # 查看分支关联的远程分支及最后提交信息

创建分支

1
2
3
git branch <分支名>   # 创建新分支(不切换)
git checkout -b <分支名> # 创建并切换到新分支
git checkout -b <分支名> <提交哈希> # 从指定提交创建分支

切换分支

1
2
git checkout <分支名>  # 切换到已存在的分支
git switch <分支名> # Git 2.23+ 推荐的切换命令

删除分支

1
2
git branch -d <分支名>  # 删除已合并的分支(安全删除)
git branch -D <分支名> # 强制删除未合并的分支

重命名分支

1
git branch -m <旧分支名> <新分支名>  # 重命名当前分支
  1. 分支合并
    合并分支的两种方式
    Fast-forward(快进合并):当分支没有分叉时,直接将指针向前移动。
1
2
git checkout main
git merge feature-branch # 无冲突时直接快进

三方合并(Three-way Merge):当分支有分叉时,Git 会找到两个分支的共同祖先,创建一个新的合并提交。

1
2
git checkout main
git merge feature-branch # 创建合并提交

合并冲突

当两个分支修改了同一文件的同一部分时,会发生冲突。解决方法:

手动编辑文件:打开冲突文件,根据标记(<<<<<<<、=======、>>>>>>>)修改内容。
使用合并工具:如git mergetool。
提交合并结果:

1
2
git add <冲突文件>
git commit -m "解决合并冲突"
  1. 分支管理策略
    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
2
git push -u origin <本地分支名>  # 首次推送并关联上游分支
git push origin <本地分支名>:<远程分支名> # 推送到不同名的远程分支

跟踪远程分支

1
2
git checkout -b <本地分支名> origin/<远程分支名>  # 创建并跟踪远程分支
git checkout --track origin/<远程分支名> # 简化命令(本地分支名与远程一致)

拉取远程分支更新

1
2
git pull  # 拉取并合并远程分支
git fetch # 仅获取远程分支更新,不合并

删除远程分支

1
git push origin --delete <远程分支名>
  1. 分支的高级用法

变基(Rebase)

将一系列提交应用到另一个基准点,使提交历史更线性。

1
2
git checkout feature-branch
git rebase main # 将feature-branch的提交变基到main

** cherry-pick**
将指定提交应用到当前分支。

1
git cherry-pick <提交哈希>  # 复制特定提交到当前分支

暂存(Stash)
临时保存未完成的修改,用于切换分支。

1
2
3
git stash  # 保存当前修改
git stash pop # 恢复最近一次stash
git stash list # 查看所有stash
  1. 分支管理最佳实践

保持主分支稳定:main/master只包含经过测试的代码。

小而专注的分支:每个分支只做一件事(如新特性或 bug 修复)。

定期同步分支:通过git pull –rebase保持分支更新,减少冲突。

使用 PR/MR 进行代码审查:合并前确保代码质量。

删除已合并的分支:保持仓库整洁。
示例工作流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1. 创建并切换到新分支
git checkout -b feature/new-feature

# 2. 开发并提交
echo "新功能代码" > feature.txt
git add feature.txt
git commit -m "添加新功能"

# 3. 同步主分支(可选)
git checkout main
git pull origin main
git checkout feature/new-feature
git rebase main # 或 git merge main

# 4. 推送到远程
git push -u origin feature/new-feature

# 5. 创建PR并合并到main
# 6. 删除本地和远程分支
git branch -d feature/new-feature
git push origin --delete feature/new-feature

通过合理使用分支管理,开发者可以高效地组织代码、隔离风险,并简化团队协作。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)或重要里程碑。与分支不同,标签是不可变的,一旦创建就不会移动。

  1. 标签的基本概念

标签的作用

版本标记:标记发布版本(如v1.0.0、v2.3.1)。
重要里程碑:标记关键提交(如架构重构、重大功能发布)。
快速定位:通过标签名快速切换到历史版本。

标签的类型

轻量标签(Lightweight):
简单指向特定提交的引用,无额外元数据。
存储在.git/refs/tags/目录下。
附注标签(Annotated):
完整的 Git 对象,包含标签名、标签人、日期、注释信息。
可签名(GPG),用于验证版本。

  1. 标签的基本操作
    创建标签
    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
2
3
git tag               # 列出所有标签
git tag -l "v1.0.*" # 按模式筛选标签
git show <标签名> # 查看标签详细信息

切换到标签

1
2
git checkout <标签名>  # 切换到标签(处于“分离HEAD”状态)
git checkout -b <分支名> <标签名> # 从标签创建新分支

删除标签

1
git tag -d <标签名>  # 删除本地标签
  1. 远程标签操作

推送标签到远程

1
2
git push origin <标签名>  # 推送单个标签
git push origin --tags # 推送所有未推送的标签

删除远程标签

1
2
3
git push origin --delete <标签名>  # Git 2.8+
# 或旧版语法
git push origin :refs/tags/<标签名>

获取远程标签

1
git fetch origin --tags  # 获取所有远程标签
  1. 标签命名规范

常见的标签命名规范:

语义化版本: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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 提交代码到主分支
git checkout main
git add .
git commit -m "完成v1.0.0功能开发"

# 2. 创建附注标签
git tag -a v1.0.0 -m "首个正式版本发布"

# 3. 推送标签到远程
git push origin v1.0.0

# 4. 后续发现bug,修复后创建补丁版本
git checkout -b hotfix/v1.0.1 main
# 修复bug...
git commit -m "修复登录验证问题"
git checkout main
git merge hotfix/v1.0.1
git tag -a v1.0.1 -m "修复登录验证问题"
git push origin v1.0.1

# 5. 查看历史标签
git tag -l

Git 标签是版本管理的重要工具,通过合理使用标签,可以清晰地标记项目的关键节点,便于回溯和发布管理。

Git进阶操作

  1. 交互式暂存(Interactive Staging)
    作用:逐块选择要暂存的更改,精细控制提交内容。
    场景:当一次修改包含多个逻辑更改,需要拆分为多个提交时。

基本用法

1
git add -p  # 交互式暂存(-p 是 --patch 的缩写)

交互命令
y:暂存当前区块
n:跳过当前区块
s:拆分当前区块(如果区块较大)
e:手动编辑当前区块
d:查看 diff
q:退出

示例

假设修改了两个功能(用户认证和支付),但想分开提交:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 进入交互式暂存模式
git add -p

# 系统会逐块显示更改:
# 1. 用户认证相关更改 -> 选择 y 暂存
# 2. 支付相关更改 -> 选择 n 跳过

# 提交已暂存的用户认证更改
git commit -m "完善用户认证逻辑"

# 再次执行 git add -p 暂存剩余的支付更改
git add -p # 暂存支付相关更改
git commit -m "优化支付流程"
  1. Git Stash

作用:临时保存工作进度,方便切换任务。
场景:需要紧急切换分支,但当前工作未完成。

基本操作

1
2
3
4
5
git stash save "临时保存未完成的功能"  # 保存当前进度
git stash list # 查看所有stash
git stash apply stash@{0} # 恢复指定stash(默认最新)
git stash drop stash@{0} # 删除指定stash
git stash pop # 恢复并删除最新stash

高级用法

1
2
git stash branch new-feature  # 从stash创建新分支并自动应用
git stash show -p # 查看stash的详细更改

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 当前在feature分支开发未完成,需要紧急修复bug
git stash save "未完成的新功能" # 保存当前进度

# 切换到master分支修复bug
git checkout master
git checkout -b hotfix
# 修复bug...
git commit -m "修复登录崩溃问题"
git checkout master
git merge hotfix
git push

# 返回feature分支恢复工作
git checkout feature
git stash pop # 恢复之前的工作进度
  1. Git Rebase
    作用:将一个分支上的更改移到另一个分支之上,保持提交历史线性。
    场景:在推送到远程前整理本地提交,或同步最新主分支。

基本用法

1
2
3
4
5
6
# 将feature分支的提交变基到main
git checkout feature
git rebase main

# 简化操作(直接在main上执行)
git rebase main feature

交互式变基
合并、修改或删除历史提交:

1
git rebase -i HEAD~3  # 编辑最近3次提交

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 从main创建新分支并提交两次
git checkout -b feature main
# 开发...
git commit -m "添加用户列表"
# 开发...
git commit -m "优化用户列表样式"

# 2. 此时main分支已更新,需要同步
git fetch origin
git rebase origin/main # 将feature的提交变基到最新main

# 3. 使用交互式变基合并两个提交
git rebase -i HEAD~2
# 在编辑器中将第二行的pick改为squash,保存退出
# 编辑合并后的提交信息
  1. Git Cherry-Pick
    作用:选择特定提交并应用到当前分支。
    场景:将其他分支的某个提交引入当前分支,而非合并整个分支。
    基本用法
1
2
git cherry-pick <提交哈希>  # 应用单个提交
git cherry-pick A^..B # 应用从A(不含)到B的所有提交

示例
假设在feature分支上有一个修复提交abc123,需要应用到main分支:

1
2
3
4
5
6
7
8
9
# 1. 切换到main分支
git checkout main

# 2. 应用指定提交
git cherry-pick abc123

# 3. 如果有冲突,解决后继续
git add .
git cherry-pick --continue

最佳实践建议

  1. 交互式暂存:
    每次提交只包含一个逻辑更改
    使用git add -p避免提交无关修改
  2. Git Stash:
    定期清理不再需要的 stash
    使用描述性的 stash 消息
  3. Git Rebase:
    只对未推送到远程的提交使用 rebase
    复杂变基前先备份分支(git branch backup-feature)
  4. Git Cherry-Pick:
    避免跨分支频繁 cherry-pick,优先使用合并
    注意提交作者信息是否需要保留(-x选项)

这些高级技巧能显著提升代码管理效率,但需谨慎使用,尤其是在团队协作环境中。建议先在个人分支练习,熟悉后再应用到实际开发流程中。

Git远程Github

在 GitHub 上创建远程仓库

  1. 登录 GitHub官网。

  2. 点击页面右上角 ➕ → New repository。

  3. 填写:

    Repository name:比如 my-awesome-project
    
    Description(可选):项目描述
    
    Public / Private:公开或私有
    
  4. 可以不用勾选「Initialize this repository with a README」—— 方便后面和本地仓库关联。

  5. 点击 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
2
git branch -M main
git push -u origin 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

  1. 在终端生成 SSH Key:
1
ssh-keygen -t ed25519 -C "你的邮箱"

按提示一直回车即可,会在 /.ssh/id_ed25519 生成私钥、/.ssh/id_ed25519.pub 生成公钥。

  1. 复制公钥内容:
1
cat ~/.ssh/id_ed25519.pub
  1. 登录 GitHub → 点击右上角头像 → Settings → 左侧菜单 SSH and GPG keys → New SSH key,把上一步复制的公钥内容粘贴进去。

  2. 以后你就可以用 SSH 形式克隆仓库,比如:

1
git clone git@github.com:用户名/仓库名.git

其他常见问题

  1. 如何修改 Git 用户名/邮箱?
1
2
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
  1. 如何只对当前项目设置用户名/邮箱?
1
2
git config user.name "你的名字"
git config user.email "你的邮箱"
  1. 如何切换到其他分支?
1
git checkout 分支名
  1. 如何从远程拉取其他分支?
1
2
git fetch origin
git checkout -b 本地分支名 origin/远程分支名

常见完整操作流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 创建本地仓库
git init

# 2. 添加所有文件
git add .

# 3. 提交
git commit -m "Initial commit"

# 4. 关联远程
git remote add origin https://github.com/用户名/仓库名.git

# 5. 推送
git branch -M main # 可选,重命名为 main
git push -u origin main