1. Git是什么
Git 是一个分布式版本控制系统 (Distributed Version Control System, DVCS)。 它的核心目标是跟踪文件的变化,让你能够随时记录、回溯、协作和管理你的项目。
2. 介绍
2.1 Git 工作区、暂存区、本地仓库介绍
区域名称 | 英文名 | 说明 | 相关命令 |
---|---|---|---|
工作区 | Working Directory | 你当前编辑的目录,包含所有可见的项目文件 | git status , git checkout |
暂存区 | Staging Area / Index | 暂时保存你准备提交的文件修改(git add 后进入) | git add , git reset |
本地仓库 | Local Repository | 提交后的版本快照,存储于 .git 目录中 | git commit , git log |
远程仓库(可选) | Remote Repository | GitHub、Gitee 等远程平台上的仓库,用于多人协作 | git push , git pull |
2.2 文件生命周期(状态流转)
编辑文件 → git add → git commit → git push
工作区 暂存区 本地仓库 远程仓库
2.3 状态变更图示(简单流程)
[工作区] --git add--> [暂存区] --git commit--> [本地仓库] --git push--> [远程仓库]↑ ↓ ↑修改 git reset HEAD file git pull↑ ↓
恢复(checkout) 拉取更新
3. 操作
指令 | 说明 | 示例 |
---|---|---|
git status | 查看当前工作区和暂存区状态 | git status |
git add <file> | 将文件加入暂存区,准备提交 | git add main.c |
git add . | 添加当前目录下所有更改文件到暂存区 | git add . |
git diff | 查看工作区和暂存区之间的差异(未暂存的修改) | git diff |
git diff --cached | 查看暂存区和最后一次 commit 的差异(已暂存未提交) | git diff --cached |
git commit -m "msg" | 提交暂存区内容到本地仓库,并附带提交说明 | git commit -m "fix bugs" |
git log | 查看提交历史记录 | git log |
git reset HEAD <file> | 从暂存区移除文件(但保留工作区更改) | git reset HEAD main.c |
git checkout -- <file> | 撤销工作区修改,恢复成最后一次 commit 的内容 | git checkout -- main.c |
git reset --soft HEAD~1 | 撤销最近一次 commit,保留更改在暂存区 | git reset --soft HEAD~1 |
git reset --mixed HEAD~1 | 撤销最近一次 commit,保留更改在工作区(默认方式) | git reset --mixed HEAD~1 |
git reset --hard HEAD~1 | 撤销最近一次 commit,且清除所有更改(慎用!) | git reset --hard HEAD~1 |
git log --oneline | 简洁查看提交历史(每条一行) | git log --oneline |
git reflog | 查看 HEAD 引用日志,找回丢失的提交 | git reflog |
git stash | 暂存当前所有修改(保存工作进度) | git stash |
git stash pop | 恢复最近一次 stash 并删除 | git stash pop |
git stash apply | 应用最近一次 stash(不删除) | |
git rm | 删除工作区和暂存区的文件 | git rm file |
4. 忽略文件
.gitignore
以下文件需要被忽略:
- 系统或者软件自动生成的文件
- 编译产生的中间文件和结果文件
- 运行时生成日志文件、缓存文件、临时文件
涉及身份、密码、口令、秘钥等敏感文件
匹配规则:
按行从上到下匹配
# 代表注释
* 匹配多个字符
? 匹配单个字符
[ ]表示匹配列表中的单个字符,比如:[abc] 表示a/b/c
** 表示匹配任意的中间目录中括号可以使用短中线连接,比如:[0-9]表示任意一位数字,[a-z]表示任意一位小写字
! 表示取反
示例
忽略所有的 .a 文件
但跟踪所有的 lib.a,即便你在前面忽略了.a 文件
!lib.a
只忽略当前目录下的TOD0 文件,而不忽略subdir/ToD0
/TOD0
# 忽略任何目录下名为 build 的文件夹
build/
忽略 doc/notes.txt,”但不忽略 doc/server/arch.txt
doc/*.txt
忽略 doc/目录及其所有子目录下的·pdf 文件
doc/**/*.pdf
👿注意,github官网有不同语言的gitignore模板,可以直接使用
5. SSH配置
远程仓库和本地仓库同步的方式
https已不再使用
推荐使用ssh
ssh公钥和密钥的关系:
+-----------------+ +-----------------+
| 你的电脑 |----->| 远程服务器 |
| (拥有私钥) | | (拥有公钥) |
+-----------------+ +-----------------+
配置密钥流程:
Windows:
1.ssh-keygen -t rsa -b 4096 -c "邮箱"
生成的密钥一般在:C:\Users\<你的用户名>\.ssh\
2.然后将rsa.pub内的内容添加到github上
3.测试命令行输入:ssh -T git@github.com
4.若通过则可以直接使用git clone ssh地址
5.不通过需要看下方提示
Linux:
cd .ssh
ssh-keygen -t rsa -b 4096
🤓若无法连接,可以尝试:
在~/.ssh/
下创建config
文件
添加内容:# github Host github.com HostName ssh.github.com Port 443
6. 远程仓库和本地仓库关联
1.关联本地仓库和远程仓库git remote add origin <远程仓库的 URL>1.1 查看本地关联的仓库git remote -v
2.推送本地仓库git push -u 远程仓库别名 本地分支:远程分支
3.拉取远程仓库自动合并git pull手动合并git fetch
7. 分支
Git 的分支(branch)功能允许你在版本库中创建多个开发线索,使你可以在不影响主线(如 main
)的情况下开发新功能、修复 bug 等。
✅ 主要用途
- 并行开发不同功能
- 实验新特性
- 快速 bug 修复
- 提高协作效率
🛠️ 常用 Git Branch 操作
1.创建新分支git branch 分支名
2.切换分支git checkout 分支名# 或 Git 2.23+ 版本git switch 分支名
3.查看分支列表git branch
4.合并分支git switch 分支名
5.删除分支git branch -d 分支名 (已合并)git branch -D 分支名 (未合并)
8. 解决分支冲突
想象一下你和你的团队成员正在同一个 Git 仓库中并行开发不同的功能或修复不同的 bug。每个人都在自己的分支上工作,这样可以保持主线代码的稳定,并且让不同的开发任务相互隔离。
当以下两种情况同时发生时,就可能产生分支冲突:
- 不同的分支修改了同一文件的相同部分。 这意味着你和你的同事可能在同一文件的同一行或相邻的几行代码上做了不同的更改。
- 其中一个分支的更改被合并(git merge)或变基(git rebase)到另一个分支时。 Git 在尝试自动合并这些不同的修改时,发现无法确定最终应该保留哪个版本。
简单来说,分支冲突就是 Git 在合并或变基分支时,遇到对同一文件相同部分的冲突修改,不知道应该采纳哪个版本而需要人为介入解决的情况。
情景
- master分支修改了main1.txt 第一行
- dev分支修改了main1.txt 第一行
- master commit 修改
- dev commit 修改
- master merge dev
- 冲突产生,需要手动修改和保留,合并冲突内容
- 添加暂存区
- 提交修改
若不想继续合并,执行
git merge --abort
终止合并过程