• 第二章作业第2题--苏志华


    2.每人自己建立一个HelloWorld项目,练习使用git的add/commit/push

    /pull/fetch/clone等基本命令。比较项目的新旧版本的差别。

    (1)创建版本库:

         首先在本地电脑新建HelloWorld文件夹,而后打开Git Bash,通过git init命令把这个目录变成Git可以管理的仓库:

    而后编辑HelloWorld.c文件

    (2)设置用户名、邮箱,添加、提交及查看状态、日志

    a. 设置用户名和邮箱

    b. 将HelloWorld.c添加至暂存区,再提交到本地仓库

    c 查看状态、日志

    git log显示从最近到最远的提交日志,其中commit id为版本号,可使用git reset --hard commit id实现版本回退

    (3)在github上建立远程仓库并添加SSH KEY

    建立远程仓库

    生成SSH KEY

    这里要特别注意的是其中邮箱是你github账号注册的邮箱,要不然无法将本地仓库和本地仓库关联起来,出现类似下图的错误

     在github上添加SSH KEY

     (4)关联仓库并将本地仓库上传到远程仓库

    这时我们查看github上的对应仓库,会发现已然同步。

    由于远程库是空的,因而第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令

     (5)从远程库fetch、pull、clone

    为了便于比较fetch和pull的区别,首先将本地的工作空间中HelloWorld.c文件修改如下并提交至本地仓库

    通过git log可查看具体提交情况

    a、使用git fetch从远程获取最新版本到本地

    这里git branch -a是显示所有分支情况(可看出目前分支位于master),而git branch -r是只显示远程分支

    下图中使用git diff命令查看不同分支的情况,两者有差异,说明git fetch不会自动merge,那么我想merge该如何呢?

    使用git merge命令,即合并分支,按照预想的应该是两分支有冲突,合并的时候会出现错误,然后得先解决冲突才能合并,可会出现下面的情况

    what???ㄟ(▔︹▔ㄟ) (╯▔︹▔)╯

    Already up-to-date 说明已经合并了啊,可是切换到对应的分支,分别查看HelloWorld.c的内容仍然是不一样,这是为什么呢?

    这里推荐一个gitk的命令,它可将分支情况很好的可视化以及历史信息显示出来,

    举一个例子来更好地说明这种情况,假设在branch1分支上提交历史如下

    然后建立一个新的分支branch2,继续提交四次:

    此时branch1的头指针指向D,branch2的头指针指向H。"Already up-to-date"说明你想要合并的分支已然成为你现在分支的parent,这里D便是H的parent

    那么将branch1分支合并到branch2是不管用的,因为branch2并没有发生改变,要想合并就需要将branch1的指针提交历史变成

    即使用git reset --hard H强制变成branch1分支的指针指向H 

    回到问题中,remotes/origin/master显然是master的parent,因此无法将其合并到master分支中。

    下图中git fetch origin master:temp 这句命令的意思是:将远程origin仓库的master分支下载到本地并新建一个分支temp

    显然这种情况是可以将master分支合并到temp分支上

    b、git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。

    git pull <远程主机名> <远程分支名>:<本地分支名>

    比如,取回origin主机的master分支,与本地的master分支合并,需要写成下面这样。

    git pull origin master:master

    如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

    git pull origin master

    上面命令表示,取回origin/master分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。

    c、可使用git clone将远程库克隆到本地仓库

    d、在远程仓库新建一文件,而后git fetch、git clone

    新建test.txt文件

     

    git merge

    git pull

    (6)总结:

          整个过程中我们可以看出git作为分布式系统的强大之处,而远程仓库和本地仓库既相互独立而又紧密相连,分支的存在使得工作能够分工而有条理地进行。由上我们也可以得知,"git fetch"命令执行完毕之后,还不会立即将下载的文件合并到当前工作目录里,要是想将从远程分支下载的文件更新到工作目录里,需要执行一个合并("git merge")操作。"git pull"的问题是它把过程的细节都隐藏了起来而是自动合并,这样导致本地工作目录在未经确认的情况下就会被远程分支更新,一旦代码有问题,很难找到错误的地方,因而建议使用git fetch+git merge。

  • 相关阅读:
    认识Java数组(一)
    Java之定时任务详解
    Java三大特征之多态(三)
    Java三大特征之继承(二)
    Java三大特征之封装(一)
    eclipse常用快捷键汇总
    JDK动态代理
    Java代理模式——静态代理模式
    CRISPR/Cas9基因敲除原理及实验建议
    MicroRNA 详解
  • 原文地址:https://www.cnblogs.com/bywb/p/5873611.html
Copyright © 2020-2023  润新知