前言

笔记动机:第一次做团队开发项目,需要用到一个版本管理工具,我之前对git的知识储备不够用,更新知识的同时给我们小团队写一份帮助文档。
git使用指南网上非常多,本篇笔记相对于其他的笔记来说,详细程度介于快速入门和超详细git文档之间,简化了部分指令拓展技巧和更多不常用指令(不常用指令后续可能会更新在第七点)并且保留了基本的使用和细节。概述部分捋清了几个概念,以图表的方式描述了git的工作流程。
并且针对本次项目的规模,加入了第六个板块“团队开发建议与规范”。

目录

一、Git概述

git是一个版本控制工具,可以在开发中帮助开发者管理代码的变更、回溯版本历史、实现多人协作等。

1.1 集中式与分布式

集中式与分布式的区别
Git是分布式版本控制系统,而SVN和CVS是集中式版本控制系统

区别在于集中式的版本控制系统的代码储存在服务器,每次在写代码时都需要从服务器中拉取一份下来,并且如果服务器丢失了,所有的代码就都丢失了,你本机客户端仅保存当前的版本信息。

分布式的区别在于,每个人的电脑都是服务器,都包含全部代码,你可以自由在本地回滚,提交,当你想把自己的代码提交到主仓库时,只需要合并推送到主仓库就可以了,同时你可以把自己的代码新建一份仓库分享给其它人。

分布式版本控制系统有一个master仓库,这个仓库是一切分支仓库的主仓库,我们可以推送提交到master并合并到主仓库上。

1.2 git用途

  • 变更追踪:记录每次代码修改的内容、时间和作者
  • 版本回溯:能够回退到任意历史版本,可以任意切换
  • 并行并发:支持多分支并行开发,团队里的每个人负责一部分代码,用git管理
  • 代码备份:分布式架构与远程仓库使得你的代码丢失了还可以从别的地方找回

1.3 仓库结构与状态


仓库结构:

  1. 工作区:位置在你的项目根目录,你直接能看到和编辑的文件
  2. 暂存区(Index):是一个中间区域,通过git add将工作区的修改“挑选”出来,放入暂存区。下次提交会提交暂存区的内容。
  3. 本地仓库:开发人员自己电脑上的Git仓库。
  4. 远程仓库:远程服务器上的 Git 仓库。
    四种状态
  • 未跟踪 (Untracked):新文件,Git 未管理
  • 已修改 (Modified):已修改但未暂存
  • 已暂存 (Staged):已添加到暂存区,准备提交
  • 未修改 (Unmodified):已提交,与最新版本一致

二、Git下载安装与配置

2.1下载安装

官网链接:Git - Install 自行下载安装
在任意目录右键,看到以下内容就代表安装成功:

  • Git GUI Here:打开 Git 图形界面。
  • Git Bash Here:打开 Git 命令行。

2.2配置

基础用户配置(重要:这会记录在每次提交中)

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

查看所有配置
1
git config --list

三、基本操作(按最基本工作流程)

这里仅仅放几个基本指令,更多使用细节和更多指令都放在下一个板块内。

新建仓库:git init

在选好的本地文件夹输入这个命令,可以在那里建立一个本地git仓库,
初始化当前目录为仓库,初始化后会自动将当前仓库设置为master

1
2
# 初始化 Git 仓库
git init

可以配合mkdir和cd使用
1
2
3
# 创建项目目录
mkdir 项目文件夹名
cd 项目文件夹名

加到暂存区:git add

把新建文件添加到暂存区

1
2
3
4
5
# 添加特定文件
git add 文件名

# 添加所有变化(包括新文件和修改)
git add .

提交:git commit -m “本次提交的描述信息”

使用git commit命令为其添加修改的描述信息,这样就从暂存区提交到了本地仓库

1
2
3
4
5
# 基础提交
git commit -m "feat: 添加用户登录功能"

# 修改上一次提交(未推送时)
git commit --amend

链接远程仓库:git remote add origin 你的仓库链接

关联你的仓库,一般origin是默认名字,一看就知道是远程仓库
git commit 会为我们生成40位的哈希值,用于作为id,并把刚刚用git add添加到提交缓存区里的文件提交到本地仓库中,便于我们回滚,至此,这个文件就已经添加到本地仓库中了,同时本地仓库也迭代了一个版本。

推送到远程仓库:git push origin master

推送你master分支上的内容过去,第一次要输入git push -u origin master
加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
就是说当你第一次用了-u参数后,本地和远程会创建同名分支(如master),本地的master和远程origin的master分支关联起来。以后直接git push即可,此时git push就相当于git push origin master

拉取远程仓库:git pull

git pull命令的作用是从远程仓库获取最新版本并合并到本地仓库。

1
git pull 远程仓库简称 分支名称

注:不要在未提交的修改上直接pull!!!会把你工作区的东西覆盖掉

拉取远程分支:git fetch

1
git fetch 远程仓库简称 

git pull和git fetch的区别

基本定义区别

  • git fetch:从远程仓库下载最新数据,但不改变本地工作状态
  • git pull:从远程仓库下载并合并最新数据到当前分支
1
2
3
4
5
远程仓库 (GitHub/服务器)
↓ fetch (只下载)
本地远程跟踪分支 (origin/main)
↓ merge/rebase (整合)
本地当前分支 (main)

Pull 实际上是两个命令的组合:

1
2
3
# git pull = git fetch + git merge
git fetch origin main
git merge origin/main

git fetch可以安全地查看远程仓库的更新

1
2
3
4
5
6
7
8
9
# 想看看别人提交了什么,但不影响当前工作区
git fetch origin

# 查看具体的更新内容
git log origin/main --oneline -5
git show origin/main --stat

# 决定是否合并
git merge origin/main

四、其他常用命令(关于仓库与版本)

查看历史提交信息:git log

git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file

1
--pretty=oneline #后面加上这个可以看的简洁一些

HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本写成HEAD~100

版本回滚:git reset

可以进行版本回滚

  • --hard会回退到上个版本的已提交状态(会永久丢弃未提交的修改)
  • --soft会回退到上个版本的未提交状态
  • --mixed会回退到上个版本已添加但未提交的状态。
    1
    git reset --hard 要回滚的id

HEAD是指向当前仓库的,历史版本中可能有别的分支,我们只想迭代我们仓库的上一个版本,这个很简单,我们只需要用HEAD来指向就可以了

1
git reset --hard HEAD^

^代表上一个版本的意思,HEAD代表当前仓库的指向,当前HEAD指向master,就代表回滚到master上一次提交的版本

查看提交历史:git reflog

可以查看到你的每一次命令,以便确定你去哪个版本

克隆仓库:git clone

克隆一份远程仓库到本地仓库
当我们远程有仓库时,想要关联到本地只需要使用git clone就可以了
注:新建一个空目录,不要git init,使用git clone会自动帮我们初始化

移除仓库链接:git remote remove origin

五、分支管理操作

查看所有分支

1
git branch -av

创建新分支

1
git branch 分支名

切换分支

1
git checkout 分支名

删除已合并分支

1
git branch -d 分支名

强制删除分支

1
git branch -D 分支名

重命名分支

1
git branch -m 新分支名

合并分支

当我们新建分支并做完工作之后,要把分支提交至master,就切换到master仓,并执行git merge:

1
git merge 分支名

六、团队开发建议与规范

由于我第一次做项目,这里主要是用来给我们团队写一个和团队开发相关的使用指南以及规范。

分支策略模型(分支规范)

分支名需要规范,(见名知意)知道你当前在做什么事情,合并到主仓库的分支需要知道做的事情以及作者。你自己每天写的代码推到自己仓库要知道自己在干啥。

1
2
3
4
5
main

develop

feature/功能描述

1
2
3
4
5
6
7
远程仓库(自己的,之后靠PR来合并到主仓库)

本地仓库

本地暂存区

本地工作区
  • main: 保护分支,只能通过PR合并
  • develop:主要开发分支
  • feature/功能描述:功能分支,从develop创建,合并回develop。

代码审查Pull Request 标准流程

  1. 创建功能分支
    1
    git checkout -b 分支名 #分支名最好写:改动/作者
  2. 开发并提交
    1
    2
    3
    git add .
    git commit -m "feat: 实现用户登录基础功能"
    git push origin 分支名 #分支名最好写:改动/作者
  3. 创建 Pull Request
    · 在 GitHub 页面创建 PR并填写清晰的标题和描述,关联相关 Issue,让团队进行审查合并。
  4. 合并与清理
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 合并后删除远程分支
    git push origin --delete 分支名 #分支名最好写:改动/作者

    # 清理本地分支
    git branch -d 分支名 #分支名最好写:改动/作者

    # 更新本地 main 分支
    git checkout main
    git pull origin main

日常开发工作流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 开始干活
git checkout main
git pull origin main
git branch 分支名 #分支名最好写:功能改动/日期或者将要实现的功能
git checkout 分支名 #分支名最好写:功能改动/日期或者将要实现的功能

# 干活...
git add .
git commit -m "feat: 完成某个模块"

# 同步远程更新
git fetch origin
git rebase origin/main # 或 git merge origin/main

# 干完活推送
git push origin 分支名 #分支名最好写:功能改动/日期或者将要实现的功能

注:不要在未提交的修改上直接pull!!!

commit -m “这里提交信息的规范”

  • feat:新功能
  • fix:修复bug
  • docs:文档更新
  • style:代码格式调整
  • refactor:重构代码
  • test:测试相关
  • chore:构建过程或辅助工具变动
阿巴阿巴......有点肝