Git 是一个分布式版本控制系统 (Distributed Version Control System, DVCS)。 它的核心目标是跟踪文件的变化,让你能够随时记录、回溯、协作和管理你的项目。
区域名称 | 英文名 | 说明 | 相关命令 |
---|---|---|---|
工作区 | 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 |
编辑文件 → git add → git commit → git push
工作区 暂存区 本地仓库 远程仓库
[工作区] --git add--> [暂存区] --git commit--> [本地仓库] --git push--> [远程仓库]
↑ ↓ ↑
修改 git reset HEAD file git pull
↑ ↓
恢复(checkout) 拉取更新
指令 | 说明 | 示例 |
---|---|---|
git status |
查看当前工作区和暂存区状态 | git status |
git add |
将文件加入暂存区,准备提交 | 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 |
从暂存区移除文件(但保留工作区更改) | git reset HEAD main.c |
git checkout -- |
撤销工作区修改,恢复成最后一次 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 |
.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模板,可以直接使用
远程仓库和本地仓库同步的方式
https已不再使用
推荐使用ssh
ssh公钥和密钥的关系:
+-----------------+ +-----------------+
| 你的电脑 |----->| 远程服务器 |
| (拥有私钥) | | (拥有公钥) |
+-----------------+ +-----------------+
配置密钥流程:
Windows:
1.ssh-keygen -t rsa -b 4096 -c "邮箱"
生成的密钥一般在:
C:\Users\<你的用户名>\.ssh\
2.然后将rsa.pub内的内容添加到github上
3.测试
命令行输入:ssh -T [email protected]
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
1.关联本地仓库和远程仓库
git remote add origin <远程仓库的 URL>
1.1 查看本地关联的仓库
git remote -v
2.推送本地仓库
git push -u 远程仓库别名 本地分支:远程分支
3.拉取远程仓库
自动合并
git pull
手动合并
git fetch
Git 的分支(branch)功能允许你在版本库中创建多个开发线索,使你可以在不影响主线(如 main
)的情况下开发新功能、修复 bug 等。
1.创建新分支
git branch 分支名
2.切换分支
git checkout 分支名
# 或 Git 2.23+ 版本
git switch 分支名
3.查看分支列表
git branch
4.合并分支
git switch 分支名
5.删除分支
git branch -d 分支名 (已合并)
git branch -D 分支名 (未合并)
想象一下你和你的团队成员正在同一个 Git 仓库中并行开发不同的功能或修复不同的 bug。每个人都在自己的分支上工作,这样可以保持主线代码的稳定,并且让不同的开发任务相互隔离。
当以下两种情况同时发生时,就可能产生分支冲突:
简单来说,分支冲突就是 Git 在合并或变基分支时,遇到对同一文件相同部分的冲突修改,不知道应该采纳哪个版本而需要人为介入解决的情况。
若不想继续合并,执行
git merge --abort
终止合并过程