// 本文为笔者本人在使用git进行代码库管理时的学习笔记,仅用于本人纪录回顾,如有错误,欢迎指正
1、git结构介绍
git是一个分布式版本控制系统,用于跟踪代码库的更改。git仓库结构及各库之间的命令如下图:
• workspace 即工作区,逻辑上是本地计算机,还没添加到repository的状态;
• staging 即版本库中的stage,是暂存区。修改已经添加进repository,但还没有作为commit提交,类似于缓存;
• Local repository 即版本库中master那个地方。到这里才算是成功生成一个新版本;
• Remote repository 则是远程仓库。用来将本地仓库上传到网络,可以用于备份、共享、合作。
• 如何理解"HEAD"?
HEAD指针是一个指向当前所在分支的引用。它指示了当前工作目录中所使用的分支的最新提交。在Git中,HEAD指针可以指向一个分支(如master),也可以指向一个具体的提交(通过使用具体的commit哈希值)。
2、常见git命令
- 初始化代码库
## 创建新的 Git 仓库:
git init
## 克隆已有的 Git 仓库
git clone <repository_url>
## 查看当前远程仓库地址
git remote -v
- 基本操作
## 查看仓库状态
git status
## 更新仓库状态
git pull
## 添加修改到暂存区
git add <file_name>
## 撤销添加
git checkout -- <file_name>
## 提交更改到local仓库
git commit -m "提交信息"
## 提交修改至远程仓库
git push
- 查看提交历史
git log ## 查看仓库修改历史
git reflog ## 查看各项修改的版本号
git log -n <num> ## 限制最近的n条
git log --since="2023-01-01" ## 显示从某个日期之后的提交
git log --until="2023-01-01" ## 显示在某个日期之前的提交
git log --author="作者名字" ## 按作者过滤
git log --grep="关键词" ## 按提交说明过滤
git log -- <file_path> ## 按路径过滤
- 分支管理
## 创建新分支
git branch <branch_name>
## 切换到指定分支
git checkout <branch_name>
## 创建并切换到新分支
git checkout -b <branch_name>
## 合并分支
## 切换到目标分支(如 `main`),然后合并其他分支:
git checkout main
git merge <branch_name>
## 删除分支
git branch -d <branch_name>
- 远程仓库操作
## 查看远程仓库
git remote -v
## 添加远程仓库
git remote add origin <repository_url>
## 推送更改到远程仓库
git push
git push origin <branch_name>
## 从远程仓库拉取更改
git pull
git pull origin <branch_name>
## 获取远程仓库的更新
git fetch origin
- 其他操作
## 查看文件的更改
git diff
## 撤销暂存区的更改
git reset HEAD <file_name>
## 撤销工作区的更改
git checkout -- <file_name>
## 打标签
git tag -a <tag_name> -m "tag_comment"
3、常见流程
(1)提交修改
对库中代码进行修改,并提交。在提交代码之前,一定要先进行git pull更新,以防与他人的修改内容有冲突,如有冲突要先进行merge(我一般都先把别人的更改git pull,再在他们的更改基础上做改动即可)。
git clone ## 工作区没有库
git pull ## 工作区已有库
## 修改文件后
git status ## 查看修改文件状态
git add <file_name>
## 或者
git add -A
git status ## 添加的文件变成绿色
git commit -m "your_commit_comment" ## 提交至本地库并提那家注释
## 如果是第一次提交,会让你等级你的名字及邮箱,以方便追踪提交人员
git push ## 提交至远程仓库
git log
(2)撤销修改
修改完文件后,后悔了,想要撤销。在git push之前,想要反悔都是没有太大问题的,但push至远程仓库之后再撤销,很有可能会影响其他工作者的修改,可能打乱仓库版本管理,所以在push之前一定要慎重!
git status
## 工作区的撤销(git status显示红色的文件)
git checkout -- <file_name>
## 缓存区的撤销(git add了但是没有commit,git status显示绿色的文件)
git reset HEAD <file_name> ## 撤销文件的缓存,由绿色变回红色
## 本地仓库的撤销(git commit后,还没有push,git status将不显示该文件,但会提示有一个没有push的commit)
git reset --soft HEAD~1 # 撤销最近一次commit,保留工作区和缓存区的修改
git reset --hard HEAD~1 # 撤销最近一次commit,保丢弃所有修改
git reset --mixed HEAD~1 # 撤销最近的一次commit,保留工作区的修改
## 远程仓库的撤销(git push之后)
#方法1
git log ## 查找待撤销的commit hash值
git revert <commit_hash> ## 创建一个新的提交来撤销1指定的commit
git push ## 推送
# 方法2(有风险)会重写版本历史,适用于push完没有其他人push,马上撤回
git log
git reset --hard <commit_hash> ## 回退到某一个版本(还没有push的版本)
git push --force ## 强制重新推送
版本回退
## 将当前分支和工作区都重置为最近一次提交的状态。这个命令会永久性地丢弃工作区的修改,慎用。
git reset --hard HEAD
## 工作区回退上一个版本
git reset --hard HEAD^
git reset --hard HEAD~1
## 工作区回退上两个版本
git reset --hard HEAD^^
git reset --hard HEAD~2
以下是git reset命令的不同模式的区别:
–soft模式:回退到指定的commit,但不会更改工作区和暂存区的修改。这意味着,所有的修改都会保留在暂存区,可以重新提交它们。
–mixed模式(默认模式):回退到指定的commit,同时重置暂存区的内容。这意味着,工作区的修改将保留,但是暂存区的修改将被撤销。需要重新将工作区的修改添加到暂存区,并进行提交。
–hard模式:回退到指定的commit,并且重置暂存区和工作区的内容,使其和指定的commit完全一样。这意味着,所有的修改都会被永久丢弃,及认为完全回退了版本,注意对自己的修改做备份!
(3)打tag
给仓库打上tag标签,可以有效进行代码归类、整理与版本查找
## 查看当前标签
git tag
## 展示tag内容
git show <tag_ID>
## 添加标签
git tag -a <tag_name> -m "tag_comment"
## 给历史提交打标签
git tag -a <tag_name> <commit_hash> -m "tag_comment"
## 提交标签
git push origin --tags ## 推送所有标签
## 删除远程标签
## 先删除本地标签
git tag -d <tag_name>
## 推送删除操作到远程仓库
git push origin :refs/tags/<tag_name>