本文会较为详细的学习github的一些操作,以下是具体的步骤。
安装与配置git
安装git的环境,在这里有详细的解答,便不过多赘述了。
git学习
这是git操作的基本流程
Repository,index,workspace,都存储在本地
一. git的基本操作(这部分由master完成)
git init-初始化一个本地仓库
1  | $ git init #初始化了一个本地仓库,建立了一个.git文件夹  | 
这是git init后当前文件夹的目录结构图,将仓库,暂存区和工作树(项目本地目录)都确定下来了。
1  | githublearning  | 
工作树:.git所在的目录,就是workplace。本例中就是githublearning文件夹,该文件夹内的内容就是需要版本控制的文件
暂存区:.git下的index的文件
仓库:.git文件夹就是仓库
 **
HEAD**:这是一个指向当前活动分支的引用,它告诉 Git 你当前处在哪个分支上。 **
config**:存储仓库级别的配置信息,如用户信息、远程仓库地址等。 **
refs**:存储分支(refs/heads/)、标签(refs/tags/)等引用。每个分支和标签都指向特定的提交对象。 **
objects**:存储 Git 对象(提交、树、文件 blob)的数据库。Git 是通过哈希(SHA-1 值)来存储每个对象的,确保了内容的唯一性和完整性。 **
index**:即暂存区,用于存储那些你已经用git add命令暂存的更改,准备提交时从这里取数据。 **
logs**:保存引用的历史,记录了每个分支或引用的变更日志,便于追踪。
1  | $ git status #记录着当前处于master还是branch分支,有无需要commit的文件等  | 
gid add-向暂存区添加文件
1  | git add xxx.cpp #上传一个xxx.cpp文件  | 
git commit-提交到本地仓库
1  | $ git commit -m “本次提交的备注” #上传到master分支,并打上备注  | 
git log-查看提交日志
查看全部日志
1  | $ git log  | 
查看日志常用快捷键:和man操作,less操作基本一样
f:往后翻一页
b:往前翻一页
也可以简短一行的输出每次提交的修改
1  | $ git log --pretty=short  | 
也可以查看文件前后修改的对比
1  | $ git log -p README.md  | 
也可以以图形的方式查看提交历史
1  | $ git log --graph  | 
git diff-查看更改前后的区别
git diff命令可以查看工作树、暂存区、仓库最新提交之间的差别。
查看工作树和暂存区的区别
1  | $ git diff  | 
vscode配合gitlens插件可以清楚看到本地工作目录(左边)和暂存区(右边)的区别,红色表示删除,绿色表示新添加的内容
当然使用git diff命令也能明显的看出区别,如下,+代表添加或者修改,-代表删除内容:
这两种方法都可以看出工作树和暂存区的区别
当我git add -A后,git diff就无任何输出了
查看工作树和本地仓库最新提交的差别
1  | $ git diff HEAD  | 
由于本地工作树和暂存区内容是一样的, 这个命令比较的就是仓库的最新提交和工作树的区别,比较的结果形式和上面的比较是一样的,就不贴图了
二. 分支操作(本部分由分支1完成)
通常一个大型的项目视需要多人合作完成的,每个人负责不同的模块和功能,这通常是并行进行的,所以我们需要分支进行,在各自的功能没有完全上线,各个分支和已经上线的程序master应互不干扰!
分支1完成后,需要与master合并
git branch-显示所有的分支
1  | $ git branch  | 
当前只有一个master分支,*指向了master分支,表示当前处于master分支下
git checkout -b-创建切换分支
创建切换分支1
创建一个名字为分支1的分支,并切换到分支1下:
1  | $ git checkout -b 分支1  | 
查看结果:
1  | $ git branch  | 
等价操作:
1  | git branch 分支1 #创建一个名为分支1的分支  | 
提交修改:
1  | git add -A  | 
切换到到master分支
1  | git checkout master #切换到主分支  | 
继续查看当前文件大纲,发现master分支的大纲并没有分支1的这部分的文字,如下图:
而在分支1的大纲是这样的:
切换到上一个分支
1  | git checkout -  | 
分支的删除
1  | git branch -d 分支名  | 
分支的分类
在 GitHub 或 Git 版本控制系统中,特性分支(feature branch)和主干分支(通常是 main 或 master 分支)是两种常见的分支类型,它们用于不同的开发目的:
1. 主干分支(Main/Master Branch)
- 作用:主干分支是项目的稳定版本,通常包含可部署的代码。它是团队协作时的主分支,代表项目当前的生产环境代码。
 - 特点:
- 代码通常是稳定的、经过测试的版本。
 - 项目的发布版本往往基于主干分支。
 - 只有当代码经过充分测试、代码审核通过后,才会合并到主干分支。
 
 
2. 特性分支(Feature Branch)
- 作用:特性分支用于开发某个特定的功能或修复某个 bug。每个新功能、改进或问题修复通常会创建一个单独的特性分支,以便与主干分支保持隔离,确保主干分支的稳定性。
 - 特点:
- 每个特性分支的命名通常与开发的功能相关,如 
feature/login-system或feature/add-profile-page。 - 开发人员可以自由地在特性分支上进行实验,而不会影响到其他开发者的工作或主干分支的稳定性。
 - 开发完成后,特性分支会通过 Pull Request 进行代码审核,测试通过后才合并到主干分支。
流程: 
 - 每个特性分支的命名通常与开发的功能相关,如 
 
- 从主干分支拉取最新代码,创建一个新的特性分支。
 - 在特性分支上开发和测试功能。
 - 开发完成后,提交 Pull Request 以请求将特性分支的代码合并到主干分支。
 - 经过代码审核和测试,确认无问题后合并到主干分支。
 
这种分支模型能够帮助团队并行开发不同功能,同时确保主干分支始终保持在一个稳定的状态。
git merge-分支的合并
合并分支
分支1已经完成了当前的功能,需要与master合并
1.切换回主干分支
1  | git checkout master  | 
2.合并分支
1  | git merge --no-ff 分支1  | 
冲突解决
每次的合并并都不是一帆风顺的,如果分支修改了相同的文件,就会产生冲突,需要手动解决冲突
以下是合并后的报错,提示有冲突:
1  | $ git merge --no-ff 分支1  | 
解决办法:
1.查看合并的状态,找到冲突的文件
1  | git status  | 
2.打开冲突的文件(README.md),解决冲突
打开文件,会发现文件中有以下的标注,如下:
1  | <<<<<<< HEAD(当前分支的内容)  | 
可以手动的选择要保留的内容,保留后,删除’<<<<<<< HEAD’,’======= ‘,’>>>>>>> branch’,等标注,保存文件即可。
3.提交解决冲突后的文件
1  | git add README.md  | 
4.合并完成
1  | git merge 分支1  | 
git log-以图表的形式查看分支
可以以图形的方式查看分支的合并情况,并且看到分支的提交记录
1  | git log --graph  | 
三. 更改提交的操作
git reset-回溯历史版本
为了有助于学习,我们先回到创建分支1的时候,然后创建一个fix—B的特性分支
回到分支1创建前
1  | git reset --hard hash值 #这个hash值就是每次commit后的hash值  | 
如果你没有做好标记寻找创建分支前的hash值的技巧:git log –graph ,找到分叉前的一个提交的hash值!,如下就是第8次修改的hash值
| | Author: lyroom codingfish@outlook.com
| | Date: Mon Oct 14 16:59:48 2024 +0800
| |
| | master的第10次提交
| |
* | commit 7362bced26a2648153fac6779e4c5d2067eab42b
|/ Author: lyroom codingfish@outlook.com
| Date: Mon Oct 14 16:57:45 2024 +0800
|
| master下的第九次修改
|
* commit 61126b34e2330bad3945c616374df80de7346be1
| Author: lyroom codingfish@outlook.com
| Date: Mon Oct 14 16:17:33 2024 +0800
|
| 第8次修改
|
* commit ce7d1ccfd971bed9e79a3ececcdb67df97428692
| Author: lyroom codingfish@outlook.com
| Date: Mon Oct 14 16:15:19 2024 +0800
创建分支fix-B
当前状态:
fix-B的下一个目标:
回溯到分支1合并后的状态
git reflog-查看当前仓库的操作日志
使用git reflog查看当前仓库的操作日志,找到回溯之前的hash值
1  | $ git reflog  | 
回溯:
1  | $ git reset --hard f77bdd9  | 
目前状态如下:
合并fix-B到master:
1  | $ git merge --no-ff fix-B  | 
消除冲突后,达到最终状态:
git commit –amend-修改最新的一次commit信息
查看git log:
1  | commit b8c8f1ba295a524f8b85593aa2cde9c233900e61 (HEAD -> master)  | 
上次在消除冲突后,master又commit一次,这次提交本质是无意义的,因为没有冲突,就不需要提交了,因此需要修改提交备注信息:
1  | $ git commit --amend  | 
修改提交信息为:合并master和fix-B:
1  | commit 9441272bca5d390e54cfd05ba8b6ead3412c72b7 (HEAD -> master)  | 
这样就修改成功了,除了备注不一样,其他信息都一样。
git rebase -i-修改历史提交信息
当我们提交了多次,但是发现这些提交工作树的内容都一样,或者无关紧要的好几次commit。如下:
1  | $ git log  | 
这些仅仅都是些微的修改,但是提交了多次,我们可以使用git rebase -i命令,修改合并这些提交信息。如下:
1  | $ git rebase -i HEAD~3 # 修改最近3次提交信息  | 
合并后的commit的hash值,时间和最新的一致,但是提交信息已经修改了
1  | $ git log  | 
虽然’git rebase -i’ 和 ‘git commit –amend’ 都能修改commit的备注信息,但是
‘git rebase -i’ 可以合并多次提交,
‘git commit –amend’ 只能修改最近一次提交的备注信息。
四. 推送至远程仓库
前面的所有操作都是基于本地的操作,接下来我们要进行的是远程仓库的操作。
当然前提是你需要在github创建一个仓库,如果本地写了README.md就不要勾选创建README.md文档了
1. git remote add-添加远程仓库
1  | git remote add <远程名称> <远程仓库URL> # 添加远程仓库命令格式  | 
<远程名称>:为远程仓库指定的别名,常用的是origin,但您可以根据需要自定义名称。<远程仓库URL>:远程仓库的实际地址。它可以是 HTTPS 或 SSH 的 URL,格式如下:- HTTPS: 
https://github.com/user/repo.git - SSH: 
git@github.com:user/repo.git 
- HTTPS: 
 
1  | $ git remote add origin https://github.com/lyroom/githublearning.git #用户名:lyroom,仓库名字:githublearning  | 
2.git push-推送本地仓库到远程仓库
推送至远程仓库master分支
1  | $ git push -u origin master #推送本地仓库到远程仓库 u:upstream上游的缩写,  | 
推送至远程仓库master以外分支
1  | $ git checkout fix-B #切换到fix-B分支  | 
五.从远程仓库获取
1.git clone-克隆远程仓库到本地
获取远程仓库(master)
首先我们切换到其他目录下
1  | $ git clone https://github.com/lyroom/githublearning.git #克隆远程仓库到本地  | 
执行完成之后我们默认处于master分支下,并且和远程仓库master/main分支的内容是一样的
1  | $ git branch  | 
获取远程仓库(非master)
git branch -a-查看远程分支
我们可以使用git branch -a查看远程和本地的分支
1  | $ git branch -a  | 
可以看到本地只有master分支,远程有master和fix-B分支
注意:我们已经切换了文件夹(gitlearning—>githublearning),所以之前本地仓库只上传了master和fix-B分支,不要和之前的仓库搞混了
git checkout -b-克隆远程仓库的fix-B分支到本地
1  | $ git checkout -b fix-B origin/fix-B #克隆远程仓库的fix-B分支到本地  | 
向本地的fix-B分支提交更改
1  | $ git commit -am "向本地的fix-B添加了内容" #向本地的fix-B分支提交更改  | 
推送fix-B分支到远程仓库
1  | $ git push #推送本地的fix-B分支到远程仓库  | 
2.git pull-拉取远程仓库到本地仓库
刚刚在githublearning的仓库中修改了fix-B分支的内容并且上传到了github,但是我们gitlearnging仓库中的fix-B分支并没有更新,所以我们需要拉取远程仓库的fix-B分支到本地仓库
注意要切换到最开始的项目目录(githublearning—>gitlearning)
1  | $ git checkout fix-B #切换到fix-B分支  | 
参考资料
- 本文作者: 迪丽惹Bug
 - 本文链接: https://lyroom.github.io/2024/10/11/github学习/
 - 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!