Git使用心得
在孟宁老师讲授的高级软件工程这门课中,我学习到了git这个版本控制工具的使用方法。
参考文献:https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg
1、Git的基本操作

2、Git本地版本库的基本用法
2.1、初始化一个本地版本库

2.2 查看当前 workspace 的状态
使用git status命令可以查看当前workspace的状态。

此时是刚刚初始化的仓库,里面还没有东西。
2.3 暂存更改的文件
git add [文件名] 将特定文件(FILES)或者当前目录下所有文件添加到暂存区。

再次使用git status命令查看状况,看到指定文件被放到暂存区。
2.4 把暂存区里的文件提交到仓库
使用git commit -m 命令将暂存区的文件提交到仓库。

再用git status命令查看状态,发现暂存区的文件已经被提交。
使用git reset —hard 命令可以回到过去的状态。
使用git reflog 命令回到未来的状态。
3、Git 远程版本库的基本用法
如果您已经在Gitee.com或者Github.com等网站上创建了Git版本库,可以通过git clone命令,将版本库克隆到本地完成本地版本库的初始化。git clone命令的用法如下:

这里使用git clone之后默认的分支,即远程为 origin/master 和本地 master,没有创建其他分支。管理本地版本库跟踪的远程存储库的命令为git remote。

使用git remote -v 可以查看更详细的远程存储库信息,包括fetch(抓取)的远程存储库URL和push(推送)的远程存储库URL。

git fetch、git push加上git clone是三个对远程存储库的基本操作,而git pull(拉取)是实际上是 git fetch + git merge(合并)的组合。
4、团队项目中的分叉合并
4.1、团队项目的一个参考工作流程
有了前面的基础知识和技能之后,我们可以考虑更复杂一些的团队项目合作的工作流程。
如果团队项目像场景二的方法一样多人同时向远程origin/master分支频繁提交代码,一来可能会有诸多冲突合并的情况发生;二来整个git log提交记录中多个开发者或多个代码模块的commit是交错排列在同一条时间线上,不利于回顾查看和回退代码,让跟踪代码的成长轨迹变得异常困难。
我们需要考虑新的方式来能够独立维护不同的开发者或者不同的功能模块的代码,让一段连续的工作在commit日志的时间线上呈现为一段独立的分支线段,只在关键节点处进行分支合并。
基于以上想法我们建议团队项目的每一个开发者都采用的工作流程大致如下:
-
克隆或同步最新的代码到本地存储库;
-
为自己的工作创建一个分支,该分支应该只负责单一功能模块或代码模块的版本控制;
-
在该分支上完成某单一功能模块或代码模块的开发工作;
-
最后,将该分支合并到主分支。
特别注意的是默认的合并方式为"快进式合并"(fast-farward merge),会将分支里commit合并到主分支里,合并成一条时间线,与我们期望的呈现为一段独立的分支线段不符,因此合并时需要使用--no-ff参数关闭"快进式合并"(fast-farward merge)。接下来我们会具体了解分支合并的具体方法。
4.2 分支的基本用法
使用git checkout -b [分支名]创建分支。
使用git branch命令查看分支列表,git checkout [分支名]切换分支。

使用git merge [分支名]合并分支。

如果要保留mybranch分支为一段独立的分支线段,则需要使用--no-ff参数关闭"快进式合并"(fast-farward merge),Git命令如下:
git merge --no-ff [文件名]
使用--no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。合并后大致如下示意图。

5、Git Rebase
一般我们在软件开发的流程中,有一个朴素的版本管理哲学:开发者的提交要尽量干净、简单。开发者要把自己的代码修改按照功能拆分成一个个相对独立的提交,一个提交对应一个功能点,而且要在对应的 commit log message 里面描述清楚。因此在合并和 push 之前检查修改一下 commit 记录时常需要。
场景四实际就是在场景三团队项目工作流程中增加一步Git Rebase,即在mybranch分支上完成自己的工作之后,为了让 log 记录将来更容易回顾参考,用 git rebase 重新整理一下提交记录。注意不要通过rebase对任何已经提交到远程仓库中的commit进行修改。
git rebase命令格式大致如下:
1 git rebase -i [startpoint] [endpoint]
其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支的HEAD。
一般只指定[startpoint] ,即指定从某一个commit节点开始,可以使用HEAD^^、HEAD~100、commit ID或者commit ID的头几个字符来指定一个commit节点,比如下面的代码指定重新整理HEAD之前的三个commit节点。
先提交两次文件。

使用git rebase命令丢弃一次提交。


6、总结
感谢孟宁老师的教导让我们对Git有了一定的了解与应用。

浙公网安备 33010602011771号