menu Chancel's blog
rss_feed
Chancel's blog
有善始者实繁,能克终者盖寡。

Git入门使用指南

作者:Chancel Yang, 创建:2024-03-08, 字数:4828, 已阅:115, 最后更新:2024-03-18

本文将记录入门的git命令,适用于有其他版本管理经验的人快速了解git的常见操作

Git 是一个分布式版本控制系统,用于跟踪代码更改并协同开发项目

Git 支持在本地进行代码更改,将这些更改推送到远程存储库,以方便其他协作人员拉取以及同步修改进度

git提供的3个主要特性分别是:

  1. 分布式
  2. 版本控制
  3. 多人协作

以上3个特性在开发工作中都提供了非常强大的支持

1. 安装

git官网:https://git-scm.com/

git官方支持Windows/MacOS/Linux等,在Windows下安装git还可以顺带获得bash环境

这也是很多开发人员在Windows上使用Linux Bash环境的常用方法

在安装完成后,请在CLI中设置git账户信息,这个账户信息会在提交时作为默认值

Bash
git config --global user.name [username]
git config --global user.email [gmail@gmail.com]

2. 使用

以下会针对git的常见操作做介绍,分别是仓库、文件、版本以及分支的使用方法

2.1. 仓库管理

在创建一个代码项目后,切换到该代码项目下,初始化仓库,请放心,这不会对代码项目有任何污染

Bash
git init  # 仓库初始化
git add . # 追踪文件

在仓库初始化后,还添加了对所有文件的追踪

如果你需要忽略文件,可以在项目根目录下添加一个.gitignore文件,忽略规则写法如下:

TEXT
# .gitignore文件注释以#开头
file.txt            # 忽略特定文件
directory/          # 忽略特定目录
*.log               # 忽略所有以 .log 结尾的文件
/logs/              # 忽略根目录下的 logs 目录
src/*.txt           # 忽略 src 目录下所有以 .txt 结尾的文件
!important.txt      # 不忽略 important.txt 文件
!/docs/             # 不忽略根目录下的 docs 目录
*.zip               # 忽略所有 .zip 文件
!important.zip      # 但不忽略 important.zip 文件
/logs               # 忽略根目录下的 logs 目录
logs/               # 忽略任意位置的 logs 目录

写好忽略规则后,就可以绑定远程空白仓库

Bash
git remote add origin http://example/example.git    # 绑定远程空白仓库
git push -u origin main                             # 将当前分支绑定到远程仓库的main分支

通常一次正常的代码开发流程如下

Bash
# 拉取同步到最新代码
git clone http://example/example.git

# 切换新的本地分支
git checkout main

# 更新分支代码到最新
git pull origin main

# 切换到新功能分支进行代码开发
git checkout -b faeture-branch

# 进行代码开发
...

# 提交代码开发
git commit -m "update code to ..."

# 切换到主分支并合并代码
git checkout main
git pull
git merge faeture-branch

# 推送代码到远程仓库
git push origin main

第一步的克隆是针对有原始代码的仓库,也可以是上面的空白仓库创建与绑定

2.2. 文件管理

git最主要的是提供了文件管理,在修改文件后,可以与原始仓库对比看看修改了哪些文件

Bash
git status

可以丢弃对某个文件的更改

Bash
git checkout -- file.txt

可以查看文件修改历史

Bash
git log -- file.txt

2.3. 版本管理

git实现对代码版本的定义,通过借助tag来区分不同版本的代码

常见的tag操作如下

Bash
git tag                         # 查看所有tag
git tag v1.0                    # 添加当前仓库版本为v1.0版本tag
git tag v1.0 8a3                # 为commit为8a3开头的提交添加v1.0版本的tag
git tag v1.0 -m "v1.0 version"  # 为tag添加注释
git push origin v1.0            # 推送v1.0的标签到远程
git push origin --tags          # 推送本地所有标签到远程仓库
git tag -d v1.0                 # 删除标签

通常在一次版本代码开发完成后,都会打上tag并推送到远程仓库,tag方便帮助定位问题以及自动化部署集成

2.4. 分支管理

每次修改代码完成后都会推送到远程仓库的具体分支下,常见分支包括:

  • main/master分支:通常用于发布生产环境,具备最新稳定版本的代码分支,是受保护的分支
  • develop分支:用于集成各个功能特性分支的中央分支
  • Faeture分支:用于开发单个功能的分支
  • Hotfix分支:用于修复生产环境紧急问题的分支,修复后及时删除
  • Release分支:在发布新版本之前的进行最后测试的分支

分支的常见操作如下

Bash
git branch -a                                   # 查看所有分支(包括远程仓库)
git branch remote -v                            # 查看远程仓库的分支
git checkout -b feature-branch                  # 从当前分支切换并创建feature-branch的功能分支
git checkout -b feature-branch origin/main      # 拉取远程main分支并创建切换到本地feature-branch分支
git branch --set-upstream-to = origin/main main # 将本地分支main关联到远程仓库的main分支
git merge feature-branch                        # 合并feature-branch功能分支到当前分支
git branch -D feature-branch                    # 删除feature-branch分支

分支用于区分不同的工作情况,包括:

  • 本地常规功能开发
  • 本地修复生产环境问题
  • 测试环境进行版本测试
  • ...

如果没有分支,以上情况都在main分支工作将会变得十分混乱

许多CI/CD部署基于分支和版本(tag)进行管理,合理规范使用分支和标签是必要的

3. 其他

3.1. git stash

当你修改了代码,却因为各种原因(如生产环境紧急修复)需要紧急修改代码,会发现无法切分分支,因为当前分支有未保存的工作

git stash可以帮助你暂存当前工作目录的修改,让你可以在不想提交修改的情况下切换到其他分支进行其他操作

使用如下:

Bash
# 将当前工作区修改暂存
git stash

# 查看暂存列表
git stash list

# 切分到其他分支完成工作
...

# 切换回来当前分支
...

# 恢复方法一:恢复最近的暂存并将其从 stash 中移除
git stash pop

# 恢复方法二:恢复最近的暂存但不移除stash中的记录
git stash apply

# 有多个stash,需要恢复指定的stash
git stash apply stash@{n}

# 丢弃最新的stash
git stash drop

# 丢弃指定的stash
git stash drop stash@{n}

3.2. Gitflow

Gitflow 是一种基于分支管理的工作流程,旨在帮助团队有效地组织和管理代码库中的开发和发布流程

Gitflow通常包含主分支(main/master)、开发分支(develop)、特性分支(feature)、发布分支(release)以及修复分支(hotfix)

代码通常从特性分支开始编写,完成功能后合并到开发分支,在汇聚多个特性分支后合并到release分支进行发布前的测试和验证,通过测试验证后合并到main/master分支并发布产品,在线上发现紧急问题后创建修复分支并合并到main/master分支中修复问题

Gitflow是比较常见的工作流,也有其他的工作流包括Gitlabflow、Githubflow等,可自行查阅

另外一个值得注意的是,Gitflow也有推荐的提交注释格式,包含:

  1. 使用动词开头:如FixAddUpdate等来描述此次提交的目的
  2. 描述语法:应该使用"一般现在时"来描述提交内容
  3. 分隔行:可以使用空行来分隔标题和正文,以增加可读性

示例如下

TEXT
Add feature to allow users to reset passwords

- Implemented a new feature to allow users to reset their passwords
- Added UI components for password reset form
- Fixed bug related to password reset functionality

Issue #123

遵循规范的提交注释格式可以使提交历史更清晰易读,方便团队协作和代码维护

3.3. Pull Requet(PR)

在Git中,PR代表Pull Request,是一种用于协作和代码审查的机制,常见于github

当你在需要在一个非本人拥有的代码仓库中开发新功能或修复bug时,通常会基于某个分支进行开发,当你完成开发并希望将你的代码合并到目标分支(如主分支)时,你可以创建一个Pull Request来请求仓库的所有者审阅你的代码,审阅通过后你的代码将合并到主目标的分支中

PR多依赖于界面操作,其步骤通常如下:

  1. Fork代码仓库到自己账户下
  2. Clone代码仓库并创建分支修改代码
  3. 合并代码并推送代码到自己的远程仓库
  4. 向目标代码仓库发起PR请求

4. 尾语

以上是git的常见用途,git的知识还有非常多,随着使用会愈发惊叹这个程序的不可思议


[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]