现代软件工程第二次作业

作业要求


完成下面的题目,并在小组博客中写出整个操作过程及学习心得(图文并茂):(每人都要在小组博客中写出来,并注明姓名)

1.参照 http://www.cnblogs.com/xinz/p/3803109.html 的第一题,每人建立一个GitHub账号,组长建立一个Project,将本组成员纳入此Porject中的Collaborators,并添加zykgnyue 为Collaborator。

2.每人自己建立一个HelloWorld项目,练习使用git的add/commit/push/pull/fetch/clone等基本命令。比较项目的新旧版本的差别。

3.完成小组的“CanTool”项目的需求文档(使用Markdown写文档),尝试同组成员在各自PC上修改同一文档后,如何使用Git命令完成GitHub上的文档的更新,而不产生冲突。并验证GitHub上的文档确实是最新的文档。

完成情况


  • 1.已经建立project,并按要求添加Collaborators

  • 2.project中每人已经建立HelloWorld项目,并使用git命令进行操作,操作心得在后面展示

  • 3.“CanTool”项目的需求文档已经放在github上并协作更新

操作心得


魏广宁


​ 对于Git,之前在社团写程序的时候就开始用了,不过用的比较初级,都是知道怎么用,但是不知道什么具体原理,趁着老师这次作业,我对Git做了一点深入的研究。

​ 下面的内容主要是通过学习git-recipes以及自己实践完成(引用部分来自学习的网页,其他为自己写的部分)

git clone

git clone 命令拷贝整个 Git 仓库。这个命令就像 svn checkout 一样,除了「工作副本」是一个完备的Git仓库——它包含自己的历史,管理自己的文件,以及环境和原仓库完全隔离。

为了方便起见,clone 自动创建了一个名为 origin 的远程连接,指向原有仓库。这让和中央仓库之间的交互更加简单。

简单来说,git clone就是把远程的仓库拉到本地,形成本地项目的副本,如下是实践图:

可以看到,项目现在已经被复制到本地了,值得注意的是,在clone的过程中,git会自动创建了一个origin的远程连接,指向原有仓库

git add

git add 命令将工作目录中的变化添加到缓存区。它告诉 Git 你想要在下一次提交时包含这个文件的更新。但是,git add 不会怎么影响你的仓库——在你运行 git commit 前更改都不会被记录。

使用这些命令之时,你还需要 git status 来查看工作目录和缓存区的状态。

git add就是把目录里面的修改加到缓存区,等待之后的commit,加入到项目的历史,可以通过git status查看目录的变化,有选择的add想要的文件,如下是实践图:

可以看到,在add之前,我新创建的文件夹是Untracked的状态,在add 之后,文件夹以及里面的文件都是to be committed的状态了

git commit

git commit命令将缓存的快照提交到项目历史。提交的快照可以认为是项目安全的版本,Git 永远不会改变它们,除非你这么要求。和 git add 一样,这是最重要的 Git 命令之一。

尽管和它和 svn commit 名字一样,但实际上它们毫无关联。快照被提交到本地仓库,不会和其他 Git 仓库有任何交互。

git commit就是将缓存区的变化提交到项目历史,通过学习,我知道了其实是存的整个的项目的快照。

如下是实践图

可以看到,在commit之后,显示状态,就没有需要提交的文件了,显示我们本地的项目,提前远程仓库一个提交

git push

Push 是你将本地仓库中的提交转移到远程仓库中时要做的事。它和 git fetch 正好相反,fetch 将提交导入到本地分支,而 push 将提交导出到远程分支。它可以覆盖已有的更改,所以你需要小心使用。

git push用于将本地仓库的内容推送到远程仓库(前提是有权限修改),这个push可能会覆盖别人对 项目的更改,所以在推送之前最好先pull一下,使本地仓库同步远程仓库的信息

如下图:

可以看到,git push的时候,她会验证你的权限,当输入完账号密码之后, 你本地仓库的信息就被推送到远程分支了,但是这样做实际上是很危险的,如果在你修改之后,远程仓库有别人修改了,你直接推送,可能会造成冲突,甚至导致覆盖别人的修改,这是很危险的,因此在推送之前,要先git pull或者git fetch同步远程仓库的信息。

git fetch

git fetch 命令将提交从远程仓库导入到你的本地仓库。拉取下来的提交储存为远程分支,而不是我们一直使用的普通的本地分支。你因此可以在整合进你的项目副本之前查看更改。

git fetch实际上把远程仓库拉到本地,形成一个新的分支,我们可以在提交之前对比本地分支和远程分支的状态,然后进行相应的修改,在再把两个分支merge到一起,之后再提交,就不会产生冲突了,在产生冲突之前解决,总比冲突发生之后解决要好。

git pull

在基于 Git 的协作工作流中,将上游更改合并到你的本地仓库是一个常见的工作。我们已经知道应该使用 git fetch,然后是 git merge,但是 git pull 将这两个命令合二为一。

git pull实际上是将git pullgit merge两个命令合为一个了,简化了操作,当我们知道远程和本地一定没有冲突,或者就是想直接解决冲突的话,这个操作很有用。


商聪


git clone

从远程库克隆,讲远程库克隆到本地conghua文件夹下

ls

显示文件夹下内容,可以看到本地已经有了远程的modern_software_engineering分支

open

打开相应的文件夹。并且在里面进行添加文件

git pull

从远程库中拉下最新的更新

tips:在push之前先pull,能够尽量避免自己的修改冲掉别人的最新修改。不过终端或者图形化工具一般都有提醒,如果本地不是最新的修改,会提示你先git pull远程库中最新的修改,才能进行提交和推送(只要你别 -f 强行推送,如果冲了别人的新修改你会哭的)因为实习的时候就用同学大晚上写代码然后提交-f,把别人修改的覆盖了,老板哭笑不得,扬言谁再犯这样的错误就罚做俯卧撑

如果目前已经是最新会提示你:“Already up-to-date”,这个时候你就放心大胆的提交你的修改吧,你的本地已经是远程库里最新的修改了

git status

是个很好的习惯。这里能看到你当前的状态,比如在这里,提示的依次是:位于主分支,当前本地仓库已经拉取最新远程库的修改,本地库中还没有提交的文件

git add

添加本地文件

git commit –m “description”

提交本地文件,好的习惯是description部分加上形象具体的描述,这样能更清楚的看到项目的改变,在大型合作项目中非常重要和有用。在项目有bug时,也方便回滚和debug。

git push

最后将更新推送到远程仓库

tips:
这是从终端进行git命令行的操作,还有一些好用的图形化工具也可以实现,而且图形化工具不仅好用,还会更加清晰。工具推荐:smartgit, sourceTree

解决冲突

在北京八分量(一家创业公司)实习的时候,由于很多人合作完成一个项目,所以经常会出现两个人一起修改了同一个文件,有些可以自动merge,但是同一部分的内容无法自动merge,就需要手动解决冲突。

在发生冲突的时候,命令行在你push的时候会提醒你冲突文件,然后你打开文件进行修改,里面有冲突提示,<<<<<<< HEAD和=之间的内容是你的修改,类似=和>>>>>>>符号之间是别人的修改,你需要跟别人沟通然后解决冲突(跟别人沟通,看看他改的是什么内容,同一部分留一个人的修改)ps.团队合作里面沟通是很重要的

本地文件解决完冲突之后,将本地修改添加提交推送,需要的操作依次是:

  • git status:查看当前状态,不是必要的,但是是个好习惯,也更加清晰

  • git add [file]:添加解决冲突之后最新的修改

  • git commit -m [description]:提交修改,描述里面可以备注一下merge,解决冲突

  • git push:将你的修改提交到远程仓库

解决冲突大概思路就是这样,注意的就是一定要沟通,不要怕有冲突,积极去解决。也不要怕麻烦,就直接凭感觉删掉了自己的或者别人的修改。


林华睿


新建HelloWorld项目:

(一)访问GitHub网站创建账号。

在完成注册之后登陆进入GitHub。

(二)进入本组的Project后,创建一个HelloWorld项目。

1、在电脑上安装GIt,打开Git Bash。

2、进入桌面目录,在Git Bash界面中可以输入git指令从而完成操作。

3、在浏览器端复制本组项目的地址,然后使用git clone命令,将项目clone到本地。

4、进入本组项目文件中,即modern_software_engineering,输入ls命令,查看已有文件。

5、当前文件夹中还没有文件。我需要在这个文件夹中新建一个HelloWorld项目,我根据我的名字给他起名为HelloWorld-LinHuaRui。所以我使用mkdir HelloWorld-LinHuaRui命令新建一个文件夹。

6、打开eclipse,新建了一个HelloWorld.java文件,其功能是输出“HelloWorld”然后将它放入HelloWorld-LinHuaRui文件夹中。

7、使用git add命令,将新建的文件添加到暂存区。

8、使用git status查看目前的状态。此时根据提示信息我们可以知道当前的状态是有一个新文件。

9、使用git commit命令提交,commit类似给暂存区生成快照,每次commit都代表仓库到了一个支付状态。

10、使用git push命令将改动提交到远端仓库,第一次push的时候需要登录,输入我的GitHub的账号密码。

11、在网站上查看自己提交的HelloWorld项目,发现在自己提交不久之后,其他人也创建HelloWorld项目,需要使用pull命令进行更新。

12、fetch命令是将远程分支的最新内容拉到了本地,但是fetch后是看不到变化的。

使用完fetch命令,发现本地项目文件并没有发生改变。于是又使用了git merge命令。发现本地项目文件发生了修改。

13、在平常情况下git status可以用来查看本地仓库的状态。

编辑Cantool项目的需求文档:

1、浏览文件,发现已经有CanTool项目的需求文档。

2、进入本地项目路径中。右击鼠标打开git bash。使用git pull命令更新本地项目文件。

3、下载Typora(一种Markdown编辑器),用Typora打开CanTool requirement.md文件进行编辑。修改文字“保存数据,格式为XML或JSON”。

4、使用git add、git commit和git push命令将本地修改提交。但是却没有成功push,出现错误。

5、经过调查,发现是因为在自己pull之后到修改文件push提交之前,有队友对相同的CanTool requirement.md进行修改并且push提交到远端仓库。使用git pull命令,出现Automatic merge failed。

因为编辑器格式问题,在Typora中标记冲突的地方无法正常显示,所以用UE打开CanTool requirement.md文件,查看冲突的地方。<<<<<<< HEAD和=之间是我修改的内容,=和>>>>>>> 114d85e5731b5d15947d1fbd6d4256c42f58c0f0之间是别人修改的内容。

6、将冲突的部分修改好,查看自己的分支,依然是master分支,然后重新使用git add、git commit和git push命令将修改后的文件提交到远端仓库。然后登陆远端仓库,对比发现此时确实是最新的版本。

经过与队友讨论后总结经验。如果以后想避免此类冲突,在修改文件push之前可以先检查远端仓库有没有其他对相同文件的修改,如没有直接提交。如有,采取以下步骤:

  • 备份本地修改文件。
  • 使用git pull将远端仓库同步到本地。
  • 用之前备份的修改文件覆盖本地项目中的文件。
  • 使用git add、git commit和git push进行提交。

要查看本地仓库是否是最新的,首先进入本地项目中,然后使用git branch检查分支,进入需要进入的分支,(本项目中只有master分支)再使用git pull命令,如果是最新的则会显示Already up-to-date.

个人总结:

本科在项目开发的过程中,使用了Github。当时使用GitHub的目的主要有三个:1、保存自己的代码,避免因为硬盘损坏,电脑换系统等问题导致以往的代码丢失,当时也想过用云盘来存放,但是云盘不方便对代码进行修改。更不方便记录自己对代码的修改历史。2、与别人合作写代码开发项目。对我来说,使用了GitHub之后,大大提高了多人同时在线开发的效率。3、学习其他优秀的项目,众所周知,GitHub上有许多优秀的开源项目可以供人参考。
但是当时对GitHub的使用也只是在浏览器浏览代码和在本地PC机上使用GitHub的桌面图形版。

进过这段时间对命令行的学习,我又学习了很多知识。对GitHub以及git命令的使用又上了一个台阶。不仅是git add、git commit和git push命令的使用,还有如何处理冲突问题。以前我遇上冲突的时候,都是直接备份自己的修改文件,然后删除本地项目,重新从远端仓库导入项目,覆盖修改的地方再提交。但是这一段时间的学习,我学会了如何直接在冲突的地方进行修改,然后通过命令行的方式重新提交。


张栋迪


一、git各个命令的使用

使用git进行项目的管理和开发合作之前的项目中我已经使用过。从个人经验来看,git确实能够帮助项目管理,提升多人合作开发的效率。开发人员使用git进行开发管理通常分为两种方式:一类是使用GUI界面进行操作,另一类是使用控制台命令进行操作。我个人更喜欢使用控制台。

曾经我是git shell控制台和github桌面版混合着使用的,因为github桌面版的查看文件差异更加方面直观。但是不久前我在与小伙伴共同开发一个项目的时候,在处理一次文件同步冲突的时候,在github桌面版中进行了几步操作导致冲突无法解决只能重新clone项目,其间还无数次出现github桌面版的程序卡死并占用大量cpu,需要手动杀死进程的情况。还记得那天我发了一条朋友圈:

image

相比GUI操作界面,控制台命令是git的使用的基础。Git命令对git项目的操作全面而细致,网上也能够很方面地找到各个命令地作用和详细使用方式。无论是新手入门还是老手进行项目开发,我认为git命令都是比GUI界面更好的选择。
在Linux下使用命令行的方式可以直接在终端中进行,而windows下一般常常会使用下载的shell。我之前一直习惯的时旧版github桌面版下载时附带的git shell,但是那个版本的github桌面版现在普遍在下载到一半会卡住。而新版的github桌面版不再附带git shell,因此这里我使用的是另一个下载的shell。

言归正传,下面我重温一下git控制台的各个操作命令。
我们使用github作为源。首先,对于一个新项目,我们需要在github上建立一个远程仓库。由于本次各个操作命令的使用需要多人在远程仓库中进行提交,所以我们一个小组使用同一个github仓库进行实验。
Github中仓库地新建非常简单,只需要点击new repository后输入仓库的名字即可创建。

image

远程仓库创建之后,接下来需要将仓库克隆到本地。在仓库中复制地址后在控制台中使用git clone命令进行克隆。

image

image

克隆完成后,电脑本地就会出现一个与仓库对应的工作空间。接下来,我选择直接输入git pushl命令。

image

image

第一次输入push命令后弹出了一个github的登陆窗口,这是由于我们clone了仓库之后还没有进行身份的验证,因此无法直接进行各个操作。在输入了账号密码之后,时候我们在这要电脑上对这个仓库进行的操作就不会再出现身份验证了。
接下来,我在工作空间中创建了一个HelloWorld_Zhang文件夹,并在里面创建了一个名为test.txt的文件,里面的内容如下图。

image

然后我们在控制台中使用git add命令将我们的更新提交到索引库中。

image

之后在用git commit 命令将索引库中的内容提交到本地仓库中。

image

此时,我们提交的更新还不能够在github中看到,这是因为我们的更新现在仅仅提交到了本地仓库,还没有同步到远程仓库中。想要将本地仓库的更新提交到远程仓库中,就需要使用push命令。

image

接下来,同组的一个小伙伴对仓库中的一些内容进行了更新。此时我们需要使用pull命令直接将远程仓库中的更新信息同步到我本地电脑的工作空间中。

image

从控制台中的输出可以看到,我们同步到了另一个同学创建的HelloWorld文件夹及里面的文件。

接下来我又对我之前创建的test.txt文件进行了一些修改。修改文件后,使用git status命令就可以看到提示modified的文件有一个test.txt。然后使用git diff命令查看这个文件修改的情况。这个功能就有相当于GUI页面上直接点击提交后看到的这次提交每个文件的修改情况。行前加号表示增加,行前减号表示删除。在有的shell中(比如我当前使用的这个)增加和删除分别会用绿色和红色表示,能够更加清晰的展示。

image

对文件进行修改后,我接下来使用add,commit和push命令提交了更新。

image

最后要测试的fetch命令。Fetch命令是将远程仓库的命令更新到本地仓库中,但不更新到本地的工作空间之中。我让同组的小伙伴提交了一版更新,然后我在控制台中使用了fetch命令。

image

小伙伴在他自己的HelloWorld目录中加入了一个test文件,但是此时我在我本地的工作空间是看不到这个文件的。想要将本地仓库的更新获取到本地的工作空间中,需要使用merge命令。

image

需要注意的是,merge命令的作用是合并分支,在本次实验中,这个命令将小伙伴提交了更新后的master主分支与我当前本地所在的分支进行了合并。Merge命令在使用git进行多人合作时会频繁使用。

二、git中冲突的自动与手动解决

接下来我要尝试的是多人同时修改同一个文件的情况,感谢小伙伴林的配合。

首先,我创建了一个新的文件to_merge.txt,文件内容如下图。

image

我将文件同步到远程仓库后,小伙伴林将这个同步更新到了本地。然后,我们将同时对这个文件进行修改。我的修改如下。

image

而小伙伴林的修改如下。

image

小伙伴林首先在控制台使用add,commit和push命令将他的更新同步到远程仓库。接下来我也在本地尝试使用add,commit和push命令提交更新。Add与commit命令都没有出现问题,但是在push命令时出现了不一样的提示。

image

反馈的输出中提示我现在我远程仓库中可能有了新的提交,需要我先使用pull命令将远程的更新同步到本地。所以我使用pull命令。

image

控制台输出表明了,git对这个我和小伙伴林都修改过的文件进行了自动合并(Auto-merging)。由于我和小伙伴林没有修改文件的同一行,因此自动合并成功了。合并后的文件见下图。

image

合并成功后,我只需要再使用push命令就能将合并的提交更新到远程仓库中了。

那么,如果我和小伙伴林修改了同一个文件的同一行,那么git的自动合并会发生什么呢?于是我们在上图修改的基础上,再次对这个文件同时进行了修改。我修改了文件的第4和第6行,如下图。

image

小伙伴林修改了文件的第6和第8行,如下图。

image

还是小伙伴林首先add,commit和push将修改提交到远程仓库,然后我尝试add,commit和push。和上次一样,git还是提醒我需要先pull。在输入pull命令之后,出现了和之前不一样的情况。Git提示自动合并失败,需要我手动解决冲突。

image

我本地的这个to_merge.txt文件的内容变成了这样。

image

此时需要我手动对这个文件进行冲突合并。我将这个文件修改如下。

image

然后再add commit push,手动合并后的更新就可以提交到远程仓库了。

在github网页上,这两次冲突和解决都表现为分支和合并。

image

在了解了以上内容后,使用git进行合作开发时即使出现了冲突,也能够很方便的解决。

 posted on 2017-09-28 21:17  17MSE-team6  阅读(310)  评论(0编辑  收藏  举报