本文会较为详细的学习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 许可协议。转载请注明出处!