什么是git
Git 是一个分布式版本控制系统,用于跟踪文件变化,协调多人协作开发,帮助开发者管理代码历史和协作开发的工具。
版本控制
text
时间线:版本1 → 版本2 → 版本3 → 版本4
│ │ │ │
初稿 添加图表 修改结论 最终版
-随时可以回到任意版本
查看每次修改的内容
知道"谁在什么时候改了什么地方"
分支管理(最重要的功能!)
text
主分支(main)
/ \
功能A分支 功能B分支
(开发中) (开发中)
\ /
合并到主分支
主分支:稳定可运行的代码
功能分支:开发新功能,不影响主分支
修复分支:紧急修复bug
协作开发
多人同时工作,不会互相覆盖
清晰的责任追踪
代码审查(Pull Request)
工作原理
text
你的电脑 Git仓库
↓ ↓
工作区 → 暂存区 → 本地仓库 → 远程仓库(GitHub)
编写 暂存 提交 分享
工作区(Working Directory) → 暂存区(Staging Area) → 仓库(Repository)
↓ ↓ ↓
编辑文件 git add git commit
基本配置
bash
# 设置用户名(提交记录显示的名字)
git config --global user.name "你的用户名"
# 设置邮箱(用于识别提交者)
git config --global user.email "你的邮箱@example.com"
# 查看配置是否生效
git config --global --list
# 编辑器选择
git config --global core.editor 编辑器的名字 eg:emacs
# 设置默认分支名,默认为master
$ git config --global init.defaultBranch 分支名 eg:main
# 解决中文乱码问题(Windows)
# 1.解决提交信息乱码
git config --global core.quotepath false
# 2.解决ls命令中文乱码
echo "export LANG=zh_CN.UTF-8" >> ~/.bashrc
source ~/.bashrc
基本操作

获取 Git 仓库
直接创建
bash
# 进入仓库目录
cd D:/Goproject/git-project
# 1、可以直接初始化,是以当前目录为仓库目录并创建一个.git隐藏文件
git init
# 2、可以指定目录,是以git-project下的newgit为仓库目录并创建一个.git隐藏文件
git init newgit
从远程仓库克隆
bash
# 从现有的Git仓库中拷贝项目、克隆仓库
git clone <repo>(Git 仓库)
# 克隆到指定的目录
git clone <repo> <directory>
# eg:
git clone https://github.com/rfhdw0102/onlineChatRoom.git git-clone
基本命令
提交与修改
git add: 把文件添加到本地仓库的暂存区
bash
git add *.go
git add README
# 以上命令将当前目录下以 .go 结尾(不会递归子目录)及 README 文件提交到缓存区
# 递归匹配所有目录(包括子目录)中的 .go 文件
git add **/*.go
# 精确添加 tool 包下的 tool.go
git add tool/tool.go
# 如果想添加当前目录下所有文件(包括子目录),可以简化为 :
git add . #(. 表示当前目录)
git commit: 把文件提交到本地仓库,注意必须加 -m 后面跟着本次提交的内容说明
bash
git commit -m "提交说明"
# 在 Linux 系统中,commit 信息使用单引号 ',Windows 系统,commit 信息使用双引号 "。
# 如果提交说明写错了,可通过 git commit --amend 修正最近一次的提交说明
git commit --amend
git status:查看缓存区状态
git diff:比较暂存区和工作区的差异
bash
# 暂存区和工作区的差异
git diff
# 直接对比两次提交的所有文件差异
git diff a1b2c3d d4e5f6g
# 如果只想看某个个文件(比如 main.go)在两次提交中的差异
git diff a1b2c3d d4e5f6g -- main.go
git range-diff:比较两个提交范围的差异
bash
# 比较 (c4e5f6g 相对于 a1b2c3d 的变化) 与 (d1e2f6e 相对于 a1b2c3d 的变化) 的差异
git range-diff a1b2c3d..c4e5f6g a1b2c3d..d1e2f6e
git reset:回退版本
bash
# 回退到指定版本
git reset --hard commitID
# 查看已经删除的记录
git reflog
1ecb58f (HEAD -> main) HEAD@{0}: reset: moving to 1ecb58f
1ecb58f (HEAD -> main) HEAD@{1}: commit (amend): first commit
3ab1ea0 HEAD@{2}: commit (initial): first commit
.gitignore:有些文件不想被跟踪时,将其写入.gitignore
bash
# 创建一个.gitignore文件、vim编辑,将不想被跟踪的文件写进去或者匹配进去
eg: .idea
*.c
git mv:移动或重命名工作区文件
git notes:添加注释
git restore:恢复或撤销文件的更改
git shwo:显示 Git 对象的详细信息
日志
| 命令 | 说明 |
|---|---|
git log |
查看历史提交记录 |
git blame <file> |
以列表形式查看指定文件的历史修改记录 |
git shortlog |
生成简洁的提交日志摘要 |
git describe |
生成一个可读的字符串,该字符串基于 Git 的标签系统来描述当前的提交 |
bash
# 以简洁的一行格式显示当前分支上所有的提交记录
git log --oneline
# 显示所有分支的提交记录,而不仅限于当前分支
git log --all
git log --oneline --all
git log --oneline --all --graph
远程操作
| 命令 | 说明 |
|---|---|
git remote |
远程仓库操作 |
git fetch |
从远程获取代码库 |
git pull |
下载远程代码并合并 |
git push |
上传远程代码并合并 |
git submodule |
管理包含其他 Git 仓库的项目 |
bash
# 添加远程仓库
git remote add <远端名称> <仓库路径>
git remote add git@github.com:rfh0102/git.git
# 查看远程仓库
git remote
# 推送到远程仓库
git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名] ]
# 如果远程分支名和本地分支名称相同,则可以只写本地分支
# -f 表示强制覆盖,一般不用
# -u: --set-upstream 推送到远端的同时并且建立起和远端分支的关联关系。
git push -u origin master
# 如果当前分支已经和远端分支关联,则可以省略分支名和远端名。
git push # 将master分支推送到已关联的远端分支
# 查看关联关系我们可以使用:
git branch -vv
# 抓取指令就是将仓库里的更新都抓取到本地,不会进行合并、如果不指定远端名称和分支名,则抓取所有分支。
git fetch [remote name] [branch name]
git fetch origin main
# 拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge、如果不指定远端名称和分支名,则抓取所有并更新当前分支。
git pull [remote name] [branch name]
git pull
解决合并冲突
在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。
A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要
推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分
支 ,如下图所示。

在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲
突。
远程分支也是分支,所以合并时冲突的解决方式也和解决本地分支冲突相同相同
分支管理
git switch:更清晰地切换分支
bash
# 切换到已存在的分支、效果:工作区文件会更新为目标分支的最新版本,HEAD 指针指向该分支。
git switch <分支名>
# eg: 从 main 分支切换到 dev 分支
git switch dev
# 切换到上一个分支、用 - 代替分支名,快速返回上一个分支(类似 cd -):
git switch -
# 创建并切换到新分支
# 基于当前分支创建新分支
git switch -c <新分支名>
# 基于指定分支 / 提交 创建新分支
git switch -c <新分支名> <基础分支名/提交ID>
# eg:
# 基于 dev 分支创建 feature/pay 分支:
git switch -c feature/pay dev
# 基于某个历史提交(ID:a1b2c3d)创建修复分支:
git switch -c hotfix a1b2c3d
# git switch 可以丢弃工作区中未暂存的修改,将文件恢复到「暂存区版本」或「当前分支的最新提交版本」
# 恢复单个文件
git switch -- <文件名>
# 丢弃 main.go 的未暂存修改(恢复到最近一次 commit 或 add 的状态)
git switch -- main.go
| 命令 | 说明 | 用法示例 |
|---|---|---|
git branch |
列出、创建或删除分支。它不切换分支,只是用于管理分支的存在。 | git branch:列出所有分支 git branch new-branch:创建新分支 git branch -d/-D(强制删除) old-branch:删除分支 |
git checkout |
切换到指定的分支或恢复工作目录中的文件。也可以用来检出特定的提交。 | git checkout branch-name:切换分支 git checkout file.txt:恢复文件到工作区 git checkout <commit-hash>:检出特定提交 |
git switch |
专门用于切换分支,相比 git checkout 更加简洁和直观,主要用于分支操作。 |
git switch branch-name:切换到指定分支 git switch -c new-branch:创建并切换到新分支 |
git merge |
合并指定分支的更改到当前分支。 | git merge branch-name:将指定分支的更改合并到当前分支 |
git mergetool |
启动合并工具,以解决合并冲突。 | git mergetool:使用默认合并工具解决冲突 git mergetool --tool=<tool-name>:指定合并工具 |
git log |
显示提交历史记录。 | git log:显示提交历史 git log --oneline:以简洁模式显示提交历史 |
git stash |
保存当前工作目录中的未提交更改,并将其恢复到干净的工作区。 | git stash:保存当前更改 git stash pop:恢复最近保存的更改 git stash list:列出所有保存的更改 |
git tag |
创建、列出或删除标签。标签用于标记特定的提交。 | git tag:列出所有标签 git tag v1.0:创建一个新标签 git tag -d v1.0:删除标签 |
git worktree |
允许在一个仓库中检查多个工作区,适用于同时处理多个分支。 | git worktree add <path> branch-name:在指定路径添加新的工作区并切换到指定分支 git worktree remove <path>:删除工作区 |
解决冲突
当两个分支上对文件的修改可能会存在冲突,例如同时修改了一个文件的同一行,这时就需要手动解决冲突,解决冲突的步骤如下:
1、处理文件中冲突的地方
打开文件会看到提示:

修改成我们想要的样子,比如:
count=15
2、将解决完冲突的文件加入暂存区
3、提交到仓库

分支使用流程

删除分支
bash
# 删除时必须切换到别的分支再删除
git branch -d dev01
# 强制删除,当在dev02分支中做了操作且没有合并到别的分支上,就不能 -d 删除
git branch -D dev02
标签
Git 标签(Tag)用于给仓库中的特定提交点加上标记,通常用于发布版本(如 v1.0, v2.0)
bash
# 标签语法格式:
git tag <tagname>
# -a 选项、选项意为"创建一个带注解的标签",Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。
git tag -a v1.0
# 可以事后追加标签
git tag -a v0.9 85fc7e7
# -m:指定注解消息的内容、两者配合使用可以避免打开编辑器,直接在命令行完成操作
git tag -a <tagname> -m "message" # 不会再打开编辑器了
# 查看标签的信息
git show <tagname>
# 查看标签
git tag
# 但是当执行git log --decorate 时 也可以看到标签
# 推送标签,git push 默认不会推送标签,需要显示推送
git push origin <tagname>
# 推送所有标签
git push origin --tags
# 删除,本地删除
git tag -d <tagname>
# 远程删除
git push origin --delete <tagname>
在编辑器里面配置github地址
这里有一篇博客写的不错,可以直接看这一篇 点这里