Git的初次尝试

 开篇

  由于在此之前从未接触过Git和Github,所以参考了孟老师的五⼤场景玩转 Git,只要这一篇就够了!,通过阅读和学习该文章,对Git和Github有了初步的了解并可以进行一系列的操作。

  Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目,其分为工作区、暂存区和版本库,工作流程如图所示。

一般工作流程:

    •  git clone 克隆远程资源到本地仓库repository,作为工作目录。
    • 在本地的workspace上添加或修改文件。
    • 若远程资源修改,需要同步远程的内容,通过git pull就可以更新本地文件。
    • 本地文件修改后,可以通过git status查看修改的文件,然后使用git add添加修改的文件到暂存区。
    • 添加到暂存区之后,可以使用git commit添加到当前的工作区。
    • 修改完成后,如发现错误,可以撤回提交并在此修改提交。
    • git push将本地的修改推送到远程的git服务器。

场景一:Git本地版本库的基本用法

  1. 初始化一个本地版本库,有两种方式初始化一个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. 克隆一个远程仓库到本地目录。
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 分支合并

 场景三:团队项目中的分叉合并

  1. 首先要克隆或同步最新的代码到本地仓库,由于上一个场景已经演示这里就不再赘述。
  2. 创建一个分支。通常情况下,为了保证主分支清晰,团队合作中要建立多个分支,一个分支只负责单一功能模块或代码模块的版本控制。这里我们建立一个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
  查看log之后我们可以运行 git rebase -i cb7b3f 或 git rebase -i HEAD~3 ,经需要删除文件前的pick 改为drop:
    由于后面的hello.py文件是在A的基础上做出的修改,所以hello.py会出现冲突。
    这里我们手动处理冲突,删掉多余的信息。
    执行 git add . 后 git rebase --continue 继续完成,期间需要添加该过程的描述信息。

    此时文件的分支结构变成了这样:

    

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

2. git pull 命令的使用

  我们先在远程仓库中添加一个test.txt文件用于测试,执行 git pull 后,远程仓库更新了本地仓库。

1 git pull <远程主机名> <远程分支名>:<本地分支名>   #  从远程获取代码并合并本地的版本

小结

  由于在此之前没有做过系统的开发,更没有接触过Git和Github,但是通过对老师课上所讲知识的学习,对Git和Github有了初步的了解并且可以较为熟练的使用相关指令,肯定对以后的开发有很大的帮助,同时还存在很多不足之处可以弥补并有所提升。

  参考链接:五⼤场景玩转 Git,只要这一篇就够了!

       Git教程

posted @ 2020-10-06 11:51  Dem0_zhu  阅读(168)  评论(0)    收藏  举报