EGit基本功能操作

EGit基本功能操作
2011-07-01

EGit基本功能操作

    博客分类:
  • IDE

EGit基本功能操作

在使用EGit这个部分,我们会依照各个不同的情境并搭配其操作流程,让您了解可以如何来使用EGit

在以下我们会分为建立和克隆(Clone)版本库、新增文件、提交(Commit)、推(Push)变更到远程版本库,与从远程版本库变更拉(Pull)到客户端等功能来说明。

客户端初始化建立版本库

在本节中会使用EGit在Eclipse上建立版本库或从远程版本库克隆到客户端并建立项目,因为要展示初始化建立版本库和从远程版本库克隆到客户端,所以我们会有2个开发者分别是yvonne和john,而这二个开发者都是使用同一个远程版本库来做同步,所以在他们的工作环境中会有一样的项目HelloJava

Git也可以不用透过第三方的版本库来做同步,这个案例架构有点类似VCS透过一个共同的远程版本库做为两个开发者之间的版本库同步,只是为了方便说明。如果两个开发者不透过第三方的版本库做同步,则要两个开发者的计算机都要设置git server,这个设置则是本文件没有说明的地方。

 

客户端建立/初始化版本库


 

请注意:yvonne是使用Mac平台,以下操作过程为Mac平台的画面。

开发者yvonne先在Eclipse建立一个新的Java项目,名称为HelloJava,接着yvonne使用Share Project来建立一个客户端版本库,然后进行第一次的变更提交到客户端版本库。

以下为操作图示说明:

在Eclipse的Package Explorer区块点右键选择New → Java Project: 

 

Project name字段键入项目名称,在此键入的项目名称为:HelloJava 

 

HelloJava项目点右键选择Team → Share Project... 

 

请选择Repository类型为Git,完成请按Next按钮继续。 

 

在下图画面先点选HelloJava,点选后会在下方的TextBox显示默认的版本库路径,可在TextBox自行修改版本库路径(如没有修改则以默认路径为主),修改完后请按下Create Repository按钮,按下后则会在上方的Repository显示您刚修改(或默认)的版本库路径,建立完成请按Finish按钮结束。 

 

建立好版本库即可在HelloJava项目右方看到[HelloJava master]的字样。 

 

以上就是将项目建立好后并初始化版本库的设置,如果您是独自开发的开发者则设置到此即可,您可以选择往下方的新增与提交变更到客户端的版本库 将项目提交到版本库。假如您想要将客户端的版本库同步到远程版本库则请在新增与提交变更到客户端的版本库之后继续将客户端的版本库推(Push)到远程版本库步骤。

新增与提交变更到客户端的版本库

在Git中做任何的变更,例如:新增、删除、修改,都一定要使用Add的命令才能将变更文件加入准备区(Staging Area),变更的文件进入准备区才能提交到客户端的版本库中,如下图: 

 

以下是说明yvonne在Eclipse中,新增文件到准备区,提交文件到版本库的图标变化。

  • 新增HelloWorld.java → 文件图标为 → 使用Add → 文件图标为 → 使用提交(文件状态为:Added) → 文件图标为
yvonne修改了文件,并使用Add加入准备区,并再一次提交文件到版本库。 
  • 修改HelloWorld.java → 文件图标为 → 使用Add → 文件图标为 → 使用提交(文件状态为:Modified) → 文件图标为

 

 

详细的操作流程如下:

我们先来新增一个Java文件,请按右键选择New → Class。 

 

接着请在Name字段键入文件名称,在此我们键入HelloWorld,键入完请按Finish按钮完成。 

 

新增文件完成后,您会在Package Explorer区块看到新增的HelloWorld.java文件,且在文件前面图标的右下角会出现一个?,这表示此文件在版本库中是一个未知的文件。 

 

接着我们使用Add加入准备区,请在项目点击右键选择Team → Add。 

 

使用Add选项后,在Package Explorer的HelloWorld.java文件前面图标的右下角会出现一个+,这表示此文件在版本库中是一个新增的文件。 

 

我们将变更提交到客户端版本库,请在项目点击右键选择Team → Commit...。 

 

键入提交的变更记录后按Commit按钮提交。 

 

 

 

提交完成后,您会在Package Explorer的HelloWorld.java文件前面看到如的图标,这表示此文件在版本库中是受版本控管的文件。 

 

修改文件与提交变更

 

我们将HelloWorld.java文件修改如下,修改完成后请记得储存。 

 

按下储存按钮后,您会在Package Explorer的HelloWorld.java文件前面看到如的图标,这表示此文件受版本库控管的文件已经有修改,但还没使用Add加到准备区,所以对版本库而言并不是一个有修改的文件。 

 

使用Add选项后,在Package Explorer的HelloWorld.java文件前面图标的右下角会出现一个*,这表示这个修改的文件已加入准备区,准备提交到客户端的版本库。 

 

接着我们使用Commit选项,并键入变更记录信息,设置好后请按Commit按钮提交变更到客户端版本库。 

 

提交完成后,您会在Package Explorer的HelloWorld.java文件前面看到如的图标,这表示此文件已经完成提交到版本库。 

 

但在EGit中不一定要使用Add选项来加入准备区再提交,这部份操作可参考EGit新增或是修改不使用添加到准备区(Staging Area)的情况使用说明

 

将客户端的版本库推(Push)到远程版本库


 

如果您想将新建立的客户端版本库推(Push)到一个远程版本库,例如:CodeBeamer上的Git版本库。这份文件假设您的远程版本库已经初始化建立好。可以继续使用以下步骤来设置:

以下我们以推到CodeBeamer的Git版本库为例,推到远程版本库我们需使用推选项,所以我们须先做以下的设置:

  • 请选择Eclipse → 偏好设定… → General → Network Connections → SSH2,检查是否有设置ssh路径和private key。 
  • 另外如果您是使用CodeBeamer的Git版本库请依照You must login to see this link. Register now, if you have no user account yet.文件将自己的public key放到CodeBeamer上。

 

以上设置完ssh后请依照以下步骤将客户端的版本库推(Push)到远程版本库。

在项目点击右键选择Team → Push。 

 

请在URI字段键入远程版本库的网址,Host和版本库路径,会依照您所键入的数据自行显示,中间Connection区块的Protocol选择您的git所使用的协议例如ssh协议。

本文件的远程版本库是设置为ssh,并将客户端的public key推到远程版本库服务器,所以只键入用户名称,不用键入密码

请依照指示键入登入用户名称与密码。 

请在以下画面的上红框处选择Source ref:为refs/heads/master,在右方的Destination ref:即会显示对应的refs/heads/master,请按下Add spec按钮后即会在下方的红框处显示要推的选项,完成后请按下Finish按钮。 

推完成后您就会在远程版本库上看到提交的信息,则表示HelloJava项目已推到远程版本库。 

以上远程版本库的log画面是使用codeBeamer Git版本库浏览功能

从远程版本库克隆(Clone)到客户端

在以上操作,开发者yvonne已经将他的客户端版本库同步到远程版本库上了,接着另一个同项目下的开发者john要使用yvonne所分享的项目,john可以选择使用Import Project的方式将远程版本库克隆(Clone)到他的Eclipse。

克隆版本库的流程如下图所示: 

在此图中有以下重点:

  1. 将远程版本库克隆到客户端
  2. 建立新的Java项目。

 

请注意:john使用Windows平台,以下操作过程为Windows平台画面。

首先,请选择File → Import…。 

 

请选择Git → Projects from Git,完成请按Next按钮继续。 

 

请按下右边的Clone...按钮。 

 

请在URI字段键入远程版本库的网址,Host和版本库路径会依照您所键入的数据自行显示,中间Connection区块的Protocol选择您的git所使用的协议,例如使用ssh协议,下方Authentication的User选择远程Git服务器的帐户与密码完成请按Next继续。 

同推操作,本范例也是使用ssh与public key,所以不用键入密码

选择您要克隆的分支,目前我们只有一个分支master,所以我们勾选此分支,完成请按Next继续。 

 

选择您要克隆的目的文件夹,您也可以选择使用默认的目的文件夹,在此我们使用自订的文件夹,定义在work/HelloJava,完成请按Finish完成。 

 

克隆完成后,您就会在Git版本库列表上看到您刚克隆的版本库,选择此版本库后请按Finish完成。 

 

接着就是要新增一个项目,所以Eclipse会直接跳出新增项目的窗口,我们选择Java Project。 

 

键入项目名称,这里的项目名称需命名为您在前面克隆设置目的文件夹的文件夹名称,如您键入的名称并不是此名称,则Eclipse会在窗口的上方提醒您须键入的名称是什么。 

 

键入的正确的名称后请按Finish按钮完成。 

 

完成后,您就会在Package Explorer区块看到您建立的HelloJava项目。 

 

 

冲突与合并

如果yvonne又在自己的项目中产生变更并提交到客户端版本库,接着同步到远程版本库,在推同步完成后john再使用拉从远程版本库来更新客户端版本库,这样john的版本库会和yvonne的版本库同步。

Git拉过程会做自动合并,如果无法合并则会产生冲突

以下是推与拉的示意图: 

冲突

以下是发生冲突的原因示意图: 

推到远程版本库失败,表示最后一次与远程版本库同步后,远程版本库又有其他开发者推新的版本到远程版本库,这时候要使用拉从远程版本库的变更更新到客户端版本库,拉过程无法自动与客户端的版本库合并,则Git会标志冲突的文件内容,必须手动解除这些冲突。

以下是一个实际案例操作,当推失败、拉又产生冲突的状况。

请注意:yvonne使用Mac平台、john使用Widnows平台,所以前半部的操作过程是Mac平台画面,后半部的操作过程是Windows画面。

yvonne先在自己的客户端新增Hello.java文件并提交到客户端版本库,接着推到远程上的版本库,这些动作在新增与提交变更到客户端的版本库已经详细说明,在这边就不再重复说明。

 

john也在自己的客户端新增Hello.java文件,接着提交到客户端版本库并推到远程端版本库,但推却失败,因此john使用拉远程版本库更新客户端版本库,但在拉过程中产生了冲突。

操作画面如下:

显示推结果,其结果在右方的Status: Repo #1字段显示为x [rejected],表示推结果是失败。 

 

使用拉将远程版本库的变更更新到HelloJava项目,请在项目点击右键选择Team → Pull。 

 

进行拉中。 

 

显示拉结果。 

 

在拉之后,您会看到在HelloJava项目有出现冲突标志,且在Hello.java文件中也出现冲突标志。 

合并(Merge)

您可以选择直接去修改文件,或是使用Merge工具来解决冲突,在这里我们选择使用Merge工具,请在项目点击右键选择Team → Merge Tool。 

 

如您选择的是Use the workspace version of conflicting files (pre-merged by Git)则显示的文件中会有包含冲突标志。 

 

显示画面如下。 

 

如果在这里我们选择Use HEAD (the last local version) of conflicting files。 

 

则显示以下画面。 

 

红框处的按钮说明如下:

  • :显示先前的变更。
  • :显示三方比对方式或二方比对方式(忽略先前的变更)。
  • :从左边复制所有非冲突的变更到左边。
  • :从右边复制所有非冲突的变更到左边。
  • :从左边复制目前变更到右边。
  • :从右边复制目前变更到左边。
  • :显示下一笔不同处。
  • :显示上一笔不同处。
  • :显示下一个变更。
  • :显示上一个变更。

 

使用合并工具来解决冲突的文件,则会以右边的结果做为修改的目标,如您不想如此,则请使用手动修改的方式,在这里我们以右边的文件为修改结果: 

 

使用Add和Commit选项,将此次变更提交,在这里会自动产生Commit Message,请按Commit按钮提交。 

 

将客户端版本库的变更推到远程版本库后显示的推结果。 

如果想对Git merge深入了解,可参考以DAG介绍Git的合并

 

 

回复变更

在前面我们已经学到如何将变更提交,如果我们想要将已经提交到客户端版本库的变更回复到前一版本或是回复到某一个版本,Git也有提供回复的功能。

如果您的客户端版本库是从远程版本库克隆,则回复的版本只能回复到尚未推的版本(或是已推的最后一版),虽然您在自己的客户端可以将您的版本回复到已经有推的版本,但在之后的推皆会失败,如图: 
 
注1:因为Git的版本号是一组40字符的代号(如:9f54417c8ae0ab95014eab906099b8089a6da2a1),为了方便说明在此图以"第n版"代表每一次的变更。 
注2:在版本间的箭头方向,有箭头的部分代表着后面版本的parent,例如:第1版是第2版的parent、第4版是第5版的parent。 
说明:目前最新版本是在第5版,您目前可以选择要回复到第4版或第3版,上图的上半部是回复到第4版,回复到第4版后原本的第5版就会消除,如您有产生新的变更就会有新的第5版、第6版,假如目前最新版本是第6版,在第6版时推变更会成功。而上图下半部的部分是回复到第2版,后面产生的第3版、第4版、第5版就会消失,如您产生新的变更就会有新的版本第3版、第4版产生,但这时如果您推则会失败。

会有推错误的原因是:目前在远程版本库的最新版本是第3版,而您将版本回复到第2版后再产生新的第3版,这时在您客户端的第3版和远程版本库的第3版的版本号是不一样的,所以就会在推的时候产生错误。因此,如您在使用回复版本时须注意不能回复到已推最后一版的前面版本。

在接下来所有情境中的History,您会看到第n版的历史变更(例如:第1版、第2版),这是为了方便说明各个版本的回复例子而产生的变更。

版本回复

EGit的版本回复功能只能从Eclipse的History窗口来回复,如您选择回复的版本是目前最新的版本(HEAD),或是直接在项目上选择Reset选项,则只是将未提交的变更文件回复,此部分会在下方的文件回复详细介绍。

EGit的回复版本功能与使用Git Reset命令一样,而回复的方式又分为Soft、Mixed、Hard三种:

  • Soft:回复到前面版本,保留文件变更内容,且将已变更的所有文件加到准备区(Staging Area)。
  • Mixed:回复到前面版本,保留所有已变更文件的变更内容。
  • Hard:回复到前面版本,不保留所有已变更文件的变更内容。

 

以下就为您来介绍如何操作回复功能:

请在项目点击右键选择Team → Show in History。 

 

选择Show in History就会显示如下画面,在本例中会以Commit Message显示每一个提交的版本,现在您可以看到目前的HEAD是在第15版。 

 

如果您使用Reset的soft选项:

我们选择回复到第14版,在使用Reset前我们先看一下第15版的History,请注意在第15版的变更文件是HelloWorld.java: 

 

所以我们在第14版点击右键选择Reset → Soft。 

 

使用Reset(Soft)命令后,您会看到History的第15版不见了,而目前的HEAD是第14版。 

 

而在Package Explorer的HelloWorld.java文件图标变为,表示已将15版的变更保留下来并加到准备区中。 

 

如果您使用Reset的Mixed选项:

目前最新版本(HEAD)是第14版,我们选择回复到第12版,回复前我们先看第14版和第13版的History。

第14版变更文件:World.java第13版变更文件:HelloWorld.java

我们选择回复到第12版,所以我们在第12版点击右键选择Reset → Mixed。 

使用Reset(Mixed)命令后,您会看到History的第14版、第13版不见了,而目前的HEAD是第12版。 

而在Package Explorer的HelloWorld.java和World.java文件图标变为,表示已将14版和第13版的变更保留下来但还没有加到准备区中。 

如果您使用Reset的Hard选项:

目前最新版本(HEAD)是第12版,我们选择回复到第7版,回复前我们先看第12版、第11版、第10版、第9版、第8版的History。

 

第12版变更文件:World.java第11版变更文件:Hello.java

 

第10版变更文件:World.java第9版变更文件:Hello.java

 

第8版变更文件:HelloWorld.java

我们选择回复到第7版,所以我们在第7版点击右键选择Reset → Hard。 

 

使用Hard选项会将在第8版到第12版的变更全部消除,所以会跳出此信息询问您是否要以第7版来覆盖第8版到第12版的变更,也就是说第8版到第12版的变更完全都不会保留。 

 

按下Yes按钮后,您会看到History的第12版、第11版、第10版、第9版、第8版不见了,而目前的HEAD是第7版。 

而在Package Explorer的所有文件图标依然是,表示第8版到第12版的变更都没有保留,因此所有文件都没有变更。 

 

文件回复

在Package Explorer的项目上或是在History的最新版本(HEAD)上使用Reset命令就可以将已变更的文件回复,而此时使用的Reset选项只有Mixed、Hard有作用,而Soft选项不会有作用。

  • Mixed:可以将已加入准备区(Stanging Area)的文件取消,并保留变更。
  • Hard:不保留文件变更直接回复文件。

 

接下来是使用Reset来回复文件的操作方式:

假设目前的HelloWorld.java文件内容如下: 

 

我们将文件内容改为如下: 

 

并使用Add选项,将文件加到准备区,则您会看到在HelloWorld.java文件前的图标为,表示此文件有修改且已加到准备区中。 

 

我们可以在项目点击右键选择Team → Reset...。 

 

选择Mixed选项,按下Reset按钮。 

 

或是在History的最新版本(HEAD)点击右键选择Reset → Mixed。 

 

则在Package Explorer的HelloWorld.java文件的图标变为,表示此文件有修改但尚未加到准备区中。 

 

如果我们使用Hard选项,可以在项目点击右键选择Team → Reset...,选择Hard选项,按下Reset按钮。 

 

或是在History的最新版本(HEAD)点击右键选择Reset → Hard。 

 

使用Hard选项会将所有文件的变更全部消除,所以会跳出此信息询问您是否要以最新版本来覆盖所有的变更,也就是说所有文件的变更完全都不会保留。 

 

按下Yes后,在Package Explorer的所有文件图标变为,表示已将所有的变更都消除,因此目前所有文件都没有变更。 

 

回复到已推(Push)版本的解决方式

在前面介绍回复变更的部分,我们有提到:如果您回复到已推的版本,然后再新增变更之后,使用推则会失败,这是因为客户端版本库的版本树已经与远程版本库的版本树不同步了。和解决冲突一样,您必须使用拉来与远程版本库做一次同步,合并或是解决冲突后才能再重新推。

 

源地址:http://cb.esast.com/cb/wiki/27735





posted @ 2013-03-23 00:13  man1m  阅读(1213)  评论(0编辑  收藏  举报