引言
有幸选到孟宁老师的《高级软件工程》这门课,孟老师上课告诉我们,工欲善其事必先利其器,作为软件工程的学生,Git不会用,那是不行的!因此,需要动手操作来学习如何使用Git,一款神奇的魔术软件!
准备工作
首先,我们需要用于VSCode这款编程神奇,然后在github上申请一个属于自己的账号,最后下载Git软件。
我们先在VSCode中创建一个文件夹,然后按住Ctrl+Shift+G,如图所示,
会发现,现在还没有一个本地的存储库,所以需要初始化一个存储库
//这一步也可以通过git init 实现,在VSCode中打开终端,然后输入
git init
初始化后,我们打开这个文件夹,然后查看,你会发现多了一个.git的隐藏文件,而这就是我们的存储库了!
这样我们的魔术工作就准备好了!
魔术场景一:Git本地版本库
我们在homework1的文件夹下创建一个homework1.txt,然后输入点内容,就可以将其上传到我们的github上了!
至于怎么在VSCode连上github,可以参照这样一篇博客https://blog.csdn.net/qq_42852004/article/details/90057151
//在终端中输入,git status可以查看当前工作区的状态
git status
然后我们再创建一个homework2.txt,输入一些内容,然后使用git add功能
//git add [FILES] # 把文件添加到暂存区,可以添加多个文件(这里只添加了一个文件)
git add
仔细查看,其实,这里有一个问题,第一次为什么没有把文件加入暂存区呢?
原因是,我们是在homework1这个文件夹下创建的homework2.txt,因此在高软作业这个目录下是查询不到的,因此也就不能将其添加到暂存区中!
//git commit -m "wrote a commit log infro” # 把暂存区里的文件提交到仓库
git commit -m "使用git commit功能"
提交完成后,你会发现左边工作区的暂存的更改,已经消失了!好神奇哦!然后我们也可以通过可视化操作,将这些修改推送到github上
当我们打开自己的github时候,此时已经多了一个txt文件!
//git log # 查看之前的提交记录,便于回到过去
git log
//git reset *****的头几个字符 # 回退到某一个版本
git reset ......
当我们使用回退功能时,会发现产生了差异,左边是回退后的文件,右边是回退前的文件,在VSCode中,我们可以清楚的看到这样的对比。
//git reflog # 可以查看当前版本之后的提交记录,便于从过去回到未来 //git reset *****的头几个字符 # 回退
git reflog git reset ......
这些就是Git在本地的一些操作,是不是很简单,但又很神器呢,那我们进入下一个魔术吧。
魔术场景二:Git远程版本库
我们先在这里进行一个说明,先用一张图来理一下git fetch
和git pull
的概念:
可以简单的概括为:
git fetch
是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
而git pull
则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge
,这样可能会产生冲突,需要手动解决。
下面我们来实践一下!
我们现在github里对homework1.txt进行修改,修改如下
我们将使用git pull功能,从github上将修改的内容拉到本地
git pull
当我们使用了git pull功能后,我们发现,txt里的代码修改。
我们再次对github上对homework1.txt进行修改
我们将使用git fetch功能,从github上将修改的内容拉到本地
git fetch
当我们使用了git fetch功能后,我们发现,txt里的代码没有修改。我们可以通过使用下面的代码,展示出差异:
git log -p FETCH_HEAD
显示差异后,我们可以通过git merge来将差异合并,解决冲突,从而使得,本地的代码与github上的代码同步。
git merge
这样,本地代码与github上的代码就同步啦!
由此也可以看出:git pull = git fetch + git merge。
我们在本地进行了修改,又需要怎么把代码上传到github上呢?
//git push 可以将本地存储库的代码上传到github上
git push
我们再打开github上看看我们的文件,是不是已经改变了?
魔术场景三:团队项目的分叉合
在实际的工作中,都是团队开发,那么在一个团队中又是怎么操作的呢?
-
团队项目的每一个开发者都采用的工作流程如下:
- 1.克隆或同步最新的代码到本地存储库中;
- 2.为自己的工作创建一个分支,该分支应该只负责单一功能模块或代码模块的版本控制;
- 3.在该分支上完成单一功能模块或代码模块的开发工作;
- 4.最后将该分支合并到住分支上。
下面我们就来试一试吧!
git checkout -b testbranch //创建testbranch分支
git branch //查看所有分支
然后我们在testbranch分支上进行多次操作,然后提交到暂存区。
然后我们切换回主分支(master分支)
git checkout master
VSCode会提示我们主分支需要更新
我们可以通过merge来合并差异,将testbranch的内容融入master分支中。
git merge --no-ff testbranch
然后提交到github上,可以啦!
魔术场景四:Git Rebase
那主分支,也就是master分支要修改其他分支怎么办呢?别急,我们接着往下看:
我们在master分支做出如下修改:
我们切回到testbranch分支,发现还是我们修改前的代码:
我们可以通过这样的操作,将所有分支都和master分支进行同步,然后就会发现,testbranch分支里的代码已经被修改了。
git rebase master
魔术场景五:Fork + Pull request
为了解决开源社区松散团队的协作问题,Github提供了Fork+ Pull request的协作开发工作流程。
当你想更正别人仓库里的Bug或者向别人仓库里贡献代码时,要走Fork+ Pull request的协作开发工作流程:
- 1 先 fork(分叉) 别人的仓库,相当于拷贝一份;
- 2 做一些 bug fix或其他的代码贡献;
- 3 发起 Pull request 给原仓库;
- 4 原仓库的所有者 review Pull request,如果没有问题的话,就会 merge Pull request 到原仓库中。
而这就是Git的一些简单又实用的方法了!Git是不是很神奇呢?
参考文献
1.https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg
2.https://blog.csdn.net/qq_42852004/article/details/90057151
3.https://www.cnblogs.com/runnerjack/p/9342362.html
4.https://blog.csdn.net/nrsc272420199/article/details/85555911