Git的初次尝试
开篇
由于在此之前从未接触过Git和Github,所以参考了孟老师的五⼤场景玩转 Git,只要这一篇就够了!,通过阅读和学习该文章,对Git和Github有了初步的了解并可以进行一系列的操作。
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目,其分为工作区、暂存区和版本库,工作流程如图所示。

一般工作流程:
-
- git clone 克隆远程资源到本地仓库repository,作为工作目录。
- 在本地的workspace上添加或修改文件。
- 若远程资源修改,需要同步远程的内容,通过git pull就可以更新本地文件。
- 本地文件修改后,可以通过git status查看修改的文件,然后使用git add添加修改的文件到暂存区。
- 添加到暂存区之后,可以使用git commit添加到当前的工作区。
- 修改完成后,如发现错误,可以撤回提交并在此修改提交。
- git push将本地的修改推送到远程的git服务器。
场景一:Git本地版本库的基本用法
-
初始化一个本地版本库,有两种方式初始化一个Git本地版本库,初始化完成后,会在项目根目录下创建一个.git文件夹。
1 git init # 在本地建立一个版本库 2 git clone https://github.com/YOUR_NAME/REPO_NAME.git #将远程版本库克隆到本地完成本地版本库的初始化

这里可以查看.git文件夹的目录结构:
- hooks:存放一些shell脚本。
- info:包含仓库的一些信息。
- objects:存放所有的git对象(共40位,前两位作为文件夹名称,后38位作为对象文件名)。
- refs:refs下有三个文件夹。
- heads:里面包含所有的本地分支,每个分支都是文件,文件中存储了分支当前指向的commit。
- tags:用作记录重要里程碑信息。
- remotes:远程仓库信息。
- config:保存当前仓库的配置信息。
- description:当前仓库的描述信息。
- HEAD:HEAD指针,指向当前分支。

2. 查看当前工作区(workspace)状态(工作目录为空,暂时还没有文件可以提交):
1 git status # 查看当前workspace的状态

3. 创建文件,并将文件提交到暂存区(index),然后查看当前workspace的工作状态。
1 git add FILE_NAME # 将文件提交到暂存区

4. 将暂存区中的文件提交到仓库。
1 1 git commit -m "wrote a commit log info” # 把暂存区里的文件提交到仓库 -m后为本次提交的说明

5. 查看当前HEAD之前的提交记录。
1 git log # 查看commit的日志

6. 修改仓库文件
可以直接通过vi文本编辑器进行修改(vi FILE_NAME),保存并退出后,查看workspace的状态,可以看到红色的modified,按照刚才的步骤将文件添加到暂存区,此时再查看workspace的状态,modified有红色变为绿色,再将文件从暂存区,提交到仓库。


7.版本回退
1 git reset HEAD^ # 回退版本,一个^表示一个版本,可以多个 2 git reset HEAD~5 # 也可以使用这种形式 3 git reset commit-id # 回退到指定版本 4 git reflog # 可以查看当前HEAD之后的提交记录,便于回到未来


场景二:Git远程版本库的基本用法
- 克隆一个远程仓库到本地目录。
1 git clone https://DOMAIN_NAME/YOUR_NAME/REPO_NAME.git

2. 经本地分支的更新推送到远程主机。
更新本地分支后,要想推送到远程主机,同样要先将文件提交到暂存区(git add FILE_NAME),然后提交到本地仓库,最后使用git push命令推送到远程仓库。
1 git push <远程主机名> <本地分支名>:<远程分支名> 2 git push origin master # 将本地的master分支推送到origin主机的master分支

3. 远程获取代码并合并到本地版本。git pull实际上就是git fetch与git merge FETCH_HEAD的简写。
1 git pull <远程主机名> <远程分支名>:<本地分支名> 2 git pull origin master:brantest # 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并
场景三:团队项目中的分叉合并
- 首先要克隆或同步最新的代码到本地仓库,由于上一个场景已经演示这里就不再赘述。
- 创建一个分支。通常情况下,为了保证主分支清晰,团队合作中要建立多个分支,一个分支只负责单一功能模块或代码模块的版本控制。这里我们建立一个dev分支,并在上面做多次提交。
- 首先我们创建dev分支,并切换到dev分支。
1 git checkout -b dev # -b表示创建并切换 2 3 git branch dev #相当于一下两条命令 4 git checkout dev

- 创建文件并提交三次后。

分支状态边为:

3. 合并工作到主分支
这里,当我们切换到master分支后,会发现刚才添加的文件找不到了,是因为刚才的提交在dev分支上,而master分支此刻的提交点并没有变。此时,我们可以通过 git merge dev 将dev分支的工作成果合并到mester上,合并成一条时间线,这里可能和我们期望呈现为一段独立的分支线段不符,因此合并时需要使用--no-ff参数关闭“快进式合并”(fast farward merge)。
1 git checkout master # 切换到主分支 2 git merge dev #通过快进式合并 3 git merge --no-ff dev


将dev分支合并到main分支后,可以通过 gitk 指令查看当前分支结构。

最后提交 git push 本地仓库。

场景四:Git Rebase
1. 经过一系列操作后,我们发现A所做的工作可有可无,为了使分支更加清晰,我们考虑使A不出现在远程网络图中,在合并分支之前需要用到 git rebase 将多次提交合并。

1 git rebase -i [startpoint] [endpoint]
-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。1 git rebase -i commit-id 2 git rebase -i HEAD~3






此时文件的分支结构变成了这样:
将分支切换至main后,合并两条 git merge --no-ff dev 后分支文件的分支结构如下图所示,最后可以 git push 更新远程仓库:

2. git pull 命令的使用
我们先在远程仓库中添加一个test.txt文件用于测试,执行 git pull 后,远程仓库更新了本地仓库。
1 git pull <远程主机名> <远程分支名>:<本地分支名> # 从远程获取代码并合并本地的版本


小结
由于在此之前没有做过系统的开发,更没有接触过Git和Github,但是通过对老师课上所讲知识的学习,对Git和Github有了初步的了解并且可以较为熟练的使用相关指令,肯定对以后的开发有很大的帮助,同时还存在很多不足之处可以弥补并有所提升。
参考链接:五⼤场景玩转 Git,只要这一篇就够了!

浙公网安备 33010602011771号