git笔记v1.0

1313108756 贡献于2017-12-04

作者 sunyl  创建于2017-05-25 21:24:00   修改者Derek Sun  修改于2017-11-01 15:25:00字数13622

文档摘要:同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维护代码。
关键词:

1. Git历史 同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维护代码。 到 2005 年的时候,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属于自己的版本控制系统才不至于重蹈覆辙。他们对新的系统订了若干目标: • 速度 • 简单的设计 • 对非线性开发模式的强力支持(允许上千个并行开发的分支) • 完全分布式 • 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量) 2. Git与SVN对比 2.1. SVN SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就郁闷了。 下图就是标准的集中式版本控制工具管理方式: 集中管理方式在一定程度上看到其他开发人员在干什么,而管理员也可以很轻松掌握每个人的开发权限。 但是相较于其优点而言,集中式版本控制工具缺点很明显: l 服务器单点故障 l 容错性差 2.2. Git Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。 下图就是分布式版本控制工具管理方式: 3. Git工作流程 一般工作流程如下: 1. 从远程仓库中克隆 Git 资源作为本地仓库。 2. 从本地仓库中checkout代码然后进行代码修改 3. 在提交前先将代码提交到暂存区。 4. 提交修改。提交到本地仓库。本地仓库中保存修改的各个历史版本。 5. 在修改完成后,需要和团队成员共享代码时,可以将代码push到远程仓库。 下图展示了 Git 的工作流程: 4. Git的安装 最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。由于开发机大多数情况都是windows,所以本教程只讲解windows下的git的安装及使用。 4.1. 软件下载 下载地址:https://git-scm.com/download 参考资料中安装包已经下载完毕,根据不同的操作系统选择对应的安装包。 4.2. 软件安装 4.2.1. 安装Git for windows 分32位和64位,这里安装的是64位。 双击按照文件: 然后下一步下一步直到完成: 安装完成后在右键菜单中就会出现: Git Gui可以创建Git仓库: Git Bash是命令行: 以上两种形式功能是相同的。 但Git自带的这两种使用起来不方便,所以我们一般使用Tortoise来操作Git。 4.2.2. 安装TortoiseGit 一路“下一步”使用默认选项即可: 默认选项下会启动配置画面: 由于目前只有英文语言包,默认即可继续下一步。 配置git.exe,在4.2.1中已经安装过git-for-windows了所以在此找到git.exe所在的目录。 所以一定要先装Git,然后在装Tortoise。 配置开发者姓名及邮箱,每次提交代码时都会把此信息包含到提交的信息中。 使用默认配置,点击“完成”按钮完成配置。 完整完毕后在系统右键菜单中会出现git的菜单项。 4.2.3. 安装中文语言包 安装中文语言包并不是必选项。可以根据个人情况来选择安装。 语言包安装完毕后可以在TortoiseGit的设置中调整语言,空白处右键选择 菜单中的选项变成中文了 如果你英文特别好,也可以不装语言包,都没有问题 5. 使用Git管理文件版本 5.1. 创建版本库 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。由于git是分布式版本管理工具,所以git在不需要联网的情况下也具有完整的版本管理能力。 创建一个版本库非常简单,可以使用git bash也可以使用tortoiseGit。首先,选择一个合适的地方,创建一个空目录(D:\temp\git\repository)。 5.1.1. 使用Git GUI 在当前目录中点击右键中选择Git GUI来启动。 创建一个git文件夹: 再创建一个first文件夹 右键选择Git GUI Here 选择我指定好的的first目录 这就创建完成了。关闭上面的界面 但是文件夹first中啥都没有,这是因为你需要退出文件夹,再重新进入一下,并且把隐藏项目的选项选中,就可以看到一个【.git】文件夹。 如果删除这个文件夹这个版本仓库就没有了。也就是说这个.git文件夹代表Git本地仓库,它在仓库在,删掉仓库也删除。 5.1.2. 使用Git Bash 我们还可以通过命令行方式创建: 执行完成: 看一下这个仓库中的内容: 5.1.3. 使用TortoiseGit 使用TortoiseGit创建Git版本库: 先删除刚才创建的.git: 空白处右键: 上面无论哪种方式创建都可以,都是创建了一个.git隐藏目录,这个隐藏目录就是版本仓库。 概念: 版本库:“.git”目录就是版本库,将来文件都需要保存到版本库中。 工作目录:包含“.git”目录的目录,也就是.git目录的上一级目录就是工作目录。只有工作目录中的文件才能保存到版本库中。 版本库 工作目录 有一个绿色的对勾图标。 5.2. 添加文件 5.2.1. 添加文件过程 在first工作目录下创建一个test.txt 然后右键,选择【添加】 文件图标出现一个加号,这表示这个文件已经到了暂存区。 要想提交本地仓库还要进行commit: 这时候test.txt文件就已经在版本库中存在了。 5.2.2. 工作区与暂存区 Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。 什么是工作区(Working Directory)? 工作区就是你在电脑里能看到的目录,比如我的first文件夹就是一个工作区。 有的同学可能会说first不是版本库吗?怎么是工作区了?其实first目录是工作区,在这个目录中的“.git”隐藏文件夹才是版本库。这回概念清晰了吧。 Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。 如下图所示: 分支和HEAD的概念我们稍后再讲。 把文件往Git版本库里添加分两步执行: 第一步是用git add把文件添加进暂存区; 第二步是用git commit把暂存区的所有内容提交到本地的Git仓库 因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。 5.2.3. 查看提交到本地仓库中的内容 这个时候直接打开.git目录是看不到你添加的文件的。最方便的方法就是使用TortoiseGit查看,空白处右键: 5.3. 修改文件 5.3.1. 提交修改 修改文件并提交: 保存之后,图标变成红色:说明这个文件和版本库中的文件不一致了。 这个时候可以直接往本地仓库中提交。选中文件右键: 文件图标再次变绿: 再修改一下: 又变成修改状态了: 再次提交本地仓库: 图标再次变绿: 5.3.2. 查看修改历史 在开发过程中可能会经常查看代码的修改历史,或者叫做修改日志。来查看某个版本是谁修改的,什么时间修改的,修改了哪些内容。 可以使用TortoiseGit在文件上点击右键选择“显示日志”来查看文件的修改历史。 5.3.3. 差异比较 版本差异比较可以分为两种比较:一是直接与工作空间的文件比较,二是在历史版本中任意选择两个版本的文件进行比较。 1. 直接与工作空间的文件比较: 工作空间中的文件称为文件副本 右键文件直接选择【比较差异】时就是把当前副本中的内容与本地仓库中最新版本的内容进行比较: 内容完全相同: 修改副本文件: 显示副本中新增的差异代码: 2. 在历史版本中选择一个版本与副本进行比较 3. 在历史版本中任意选择两个版本的文件进行比较 5.3.4. 还原修改 当文件修改后不想把修改的内容提交到本地仓库,还想还原到未修改之前的状态。此时可以使用“还原”功能 注意:此操作会撤销所有未提交的修改,所以当做还原操作是需要慎重慎重!!! 5.4. 删除文件 创建一个新的文本文件:test2.txt,并提交本地仓库 在工作区目录中直接删除要删除的文件test2.txt 然后空白处右键: 删除成功,可以到版本库浏览器中看一看: 右键,用TortoiseGit的【显示日志】查看版本变更情况: 还有一种删除方式: 新添加一个文件test5.txt,在TortoiseGit中有删除的选项菜单: 然后需要提交,才能更新本地仓库: 用TortoiseGit的版本浏览器: 注意: 【删除】是删除版本库同时删除本地副本 【删除并保留本地副本】是删除版本库但不会删除本地副本。 5.5. 将java工程提交到版本库 第一步:将参考资料中的java工程project-test复制到工作目录中 要想添加工程,必须把工程放到git工作目录下面,然后再添加,不在git工作目录下是无法添加到git本地仓库的。 下面要排除不想提交到版本库中的文件: 需要设置Git提交版本时的忽略列表,svn中有忽略,在我们这里同样也有忽略 .settings已经被移除: 文件在本地还在,但已经从缓冲区移除了。多了一个.gitignore文件 这里记录了忽略的文件夹 再忽略.classpath和.project 上面的这个文件是可以手动编辑的,但是我们真正做的时候直接使用工具来做就可以了,没有必要手写,也很少手动编辑这个文件,手动编辑万一边错了就不好用了,你还不知道错误在哪 (手动编辑的规范在本章最后的附录中,可以简单了解一下。) 下面把bin也忽略,然后就可以提交版本库了 提交版本库: .gitignore文件也要提交,这样别人下载后再提交就会自动忽略被忽略掉的文件。 Java工程的图标已经变绿 浏览一下版本库: 附:忽略文件语法规范 空行或是以 # 开头的行即注释行将被忽略。 可以在前面添加正斜杠 / 来避免递归,下面的例子中可以很明白的看出来与下一条的区别。 可以在后面添加正斜杠 / 来忽略文件夹,例如 build/ 即忽略build文件夹。 可以使用 ! 来否定忽略,即比如在前面用了 *.apk ,然后使用 !a.apk ,则这个a.apk不会被忽略。 * 用来匹配零个或多个字符,如 *.[oa] 忽略所有以".o"或".a"结尾, *~ 忽略所有以 ~ 结尾的文件(这种文件通常被许多编辑器标记为临时文件); [] 用来匹配括号内的任一字符,如 [abc] ,也可以在括号内加连接符,如 [0-9] 匹配0至9的数; ? 用来匹配单个字符。 看了这么多,还是应该来个栗子: # 忽略 .a 文件 *.a # 但否定忽略 lib.a, 尽管已经在前面忽略了 .a 文件 !lib.a # 仅在当前目录下忽略 TODO 文件, 但不包括子目录下的 subdir/TODO /TODO # 忽略 build/ 文件夹下的所有文件 build/ # 忽略 doc/notes.txt, 不包括 doc/server/arch.txt doc/*.txt # 忽略所有的 .pdf 文件 在 doc/ directory 下的 doc/**/*.pdf 6. 远程仓库 6.1. 添加远程仓库 现在我们已经在本地创建了一个Git仓库,又想让其他人来协作开发,此时就可以把本地仓库同步到远程仓库,同时还增加了本地仓库的一个备份。 比较流行的远程仓库:github,码云(国内的GitHub) 最常用的远程仓库就是github:https://github.com/,注意:github使用前要先注册。 如果嫌github慢,可以使用开源中国创建的码云:https://git.oschina.net/ Github的缺点是慢,免费的只能创建公开的远程仓库,私有的远程仓库需要收费 码云的私有远程仓库是不收费的。 接下来我们演示如何将本地代码同步到github。 6.1.1. 在github上创建仓库 在github上创建完帐号之后,可以点击【Start a project】 或者右上角点击+号: 输入仓库名:first 这个仓库就创建完成了。是一个空的仓库 可以通过本地仓库把文件推送到远程仓库,有两种方法:一个是https一个是ssh: 上面这两个是github创建完空仓库后自动生成的。 Github支持两种同步方式“https”和“ssh”。如果使用https很简单基本不需要配置就可以使用,但是每次提交代码和下载代码时都需要输入用户名和密码。而且如果是公司配置的私有git服务器一般不提供hppts方式访问,所以我们着重讲“ssh”方式。 6.1.2. SSH协议 6.1.2.1. 什么是SSH SSH是英文Secure Shell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、Pop、甚至为PPP提供一个安全的"通道"。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。 最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。 6.1.2.2. SSH密钥生成 在windows下我们可以使用 Git Bash.exe来生成密钥,可以通过开始菜单或者右键菜单打开Git Bash 空白处右键: 执行命令: 在c盘用户,你的用户目录下会生成一个.ssh的目录 我们需要用编辑器打开公钥,然后把里面的内容复制到github上面: 6.1.2.3. SSH密钥配置 复制后到github上面右上角用户图标中有一个Settings 最终新配置的SSH公钥 6.1.3. 本地仓库同步到远程仓库 同步到远程仓库可以使用Git bash也可以使用TortoiseGit 先来到首页:用SSH方式就要记录下SSH的URL 6.1.3.1. 使用Git Bash 可以先执行如下命令,然后再继续 $ git remote rm origin 输入推送命令,回车: 这个命令执行完只是把本地仓库与远程仓库建立了一个关联关系,并没有真正的推送。在本地用origin代表远程仓库,这个名称可以任意。 真正推送: 完成。 然后刷新github页面: (刷新前) (刷新后) 6.1.3.2. 使用TortoiseGit同步 可以先将已经推送上去的仓库删除: Settings页面最下面: 删除完了就没有了 然后再删除第一次推送时与远程仓库中创建的关联代号:origin 可以使用命令行删除: 重新新建: 使用TortoiseGit向远程同步相对命令比较麻烦,需要事先设置好同步远端的一些信息,特别是SSH的url以及私钥,还有就是指定好使用的ssh程序。 在本地仓库目录空白处右键: TortoiseGit本身的SSH叫“PuTTY”,这个不太好用。 Git Bash使用的SSH工具是“openSSH”,所以刚才生成的密钥在openSSH下才好用,所以如果想在TortoiseGit使用刚才生成的密钥,那就需要TortoiseGit引用Git的SSH: 已经引用完成: 在【远端】中选择私钥: 同步到远程仓库: 到此本地仓库与远程仓库的关联关系就建好了。它与【git remote add origin git@github.com:DerekSun96/first.git】命令是一样的道理。 点击推送: 刷新:github的first: 在github上面:https://github.com/DerekSun96/first这个URL是可以直接访问的,不管你等没登陆,就跟我们看mybatis的开源代码下载的页面一样。 6.1.3.3. https推送方式 选择https,然后拷贝这个URL 新建一个和远端仓库绑定的别名: 使用origin2这个别名来同步: 要求输入github用户名密码:(有时候可能已经缓存了用户名密码,就不需要输入了。) 这个时候没有啥变化,可以先添加点东西,在本地工作目录中创建一个新的文本文件,然后先添加到本地仓库: 提交完立刻推送: 注意选择origin2 刷新我的GitHub页面: 创建了两个origin,一个用ssh,一个用https,其实都一样,用途没有区别。只是ssh需要公钥私钥,https需要用户名密码。 6.2. 从远程仓库克隆 克隆远程仓库也就是从远程把仓库复制一份到本地,克隆后会创建一个新的本地仓库。选择一个任意部署仓库的目录,然后克隆远程仓库。 先创建一个目录用于存放下载的工作目录: 6.2.1. 使用Git Bash 进入这个clone文件夹,然后可以使用命令:Git Bash git clone 远程仓库的路径,分SSH的和https的,用哪一个都可以: 完成: 在clone文件夹下面就下载了远程仓库,同时生成这个仓库的工作目录first: 和我们刚才提交到远程仓库的内容是一模一样的,包括对文件操作的历史都有,也就是说clone并不仅仅是把代码复制下来了,而是把远程仓库中的一切都给拷贝过来。 6.2.2. 使用TortoiseGit 再创建一个目录clone2。然后进入clone2,空白处右键: 查看: 可以比较一下clone1与clone2内容是一致的。 6.3. 从远程仓库取最新更新的文件 Git中从远程的分支获取最新的版本到本地有这样两种命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge(合并代码) 2. git pull:相当于是从远程获取最新版本并merge到本地,相当于git fetch + git merge 在实际使用中,git fetch更安全一些 因为在merge前,我们可以查看更新情况,然后再决定是否合并。 如果使用TortoiseGit的话更为方便,可以从右键菜单中点击“拉取”(pull)或者“获取”(fetch)。我们主要使用TortoiseGit取得最新的文件。 取得先在clone目录下的本地工作目录first中修改点东西,然后提交到远程仓库,再在原先的first工作目录中把新的版本取得。 clone的first中修改内容: 然后提交本地仓库: 然后推送到远程仓库: 刷新GitHub: 新加的内容: 6.3.1. 拉取(pull) 在【\git\first】最初这个工作目录中,空白处右键: 6.3.2. 获取(fetch) 获取(fetch)这个操作比较特殊,用它取得的远程仓库新版本不会自动合并到你本地仓库中,新获取的远程仓库版本和你本地仓库版本相当于是两个平行独立的分支,你本地的默认叫做master,远程新获取的叫做fetch_head。 所以用获取方式取得新版远程仓库后还需要一步跟本地master分支合并,即把fetch_head合并到master上。 仍然是在clone的first中改一点东西 然后提交到远程仓库中(步骤省略) 然后本地最初的first工作目录中获取远程仓库内容: 打开test2.txt,你会发现没有内容更新: 我们可以先看一下他们的分支:(这个其实是分支合并的部分内容) 我们现在默认的是master分支: 所以在master分支中test.txt没有更新,切换分支: Fetch_head实际内容有更新的内容: 需要合并,需要切换回master分支,然后把Fetch_head分支合并到master分支上来 注意要选对分支: 内容已经更新了: 6.4. 搭建私有Git服务器 虽然码云可以免费创建Git私服,但是万一他们的工作人员在后台还是能看到的,所以也不是很安全。远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。将自己的代码放在局域网是最安全的。 6.4.1. Git服务器搭建 搭建Git服务器需要准备一台运行Linux的机器,在此我们使用CentOS。以下为安装步骤: 1. 上传git linux版安装包: 用ftp工具: 2. 用CRT连接我的linux虚拟机服务器,解压缩: [root@localhost git-2.5.0]# tar -zxvf ./git-2.5.0.tar.gz 3. 进入解压缩目录: [root@localhost git-2.5.0]# cd ./git-2.5.0 4. 开始安装: 1)安装git依赖的环境: [root@localhost git-2.5.0]# yum -y install curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel gcc cc 2)开始编译安装: [root@localhost git-2.5.0]# autoconf [root@localhost git-2.5.0]# ./configure ··················· [root@localhost git-2.5.0]# make ··················· [root@localhost git-2.5.0]# make install 安装完成后可以查看一下git: [root@localhost git-2.5.0]# git --version git version 2.5.0 添加git用户: [root@localhost git-2.5.0]# adduser -r -s /bin/sh -c 'git version control' -d /home/git git 创建用户目录: [root@localhost git-2.5.0]# mkdir /home/git 设置/home/git文件夹权限: [root@localhost git-2.5.0]# chown git:git /home/git/ 设置密码: [root@localhost git-2.5.0]# passwd git 更改用户 git 的密码 。 新的 密码:123456(git用户的用户名密码都是git) 无效的密码: WAY 过短 无效的密码: 过于简单 重新输入新的 密码:123456 passwd: 所有的身份验证令牌已经成功更新。 切换用户: [root@localhost home]# su git sh-4.1$ 创建git仓库: sh-4.1$ git --bare init /home/git/first 初始化空的 Git 版本库于 /home/git/first/ 注意:如果不使用“--bare”参数,初始化仓库后,提交master分支时报错。这是由于git默认拒绝了push操作,需要.git/config添加如下代码: [receive] denyCurrentBranch = ignore 推荐使用:git --bare init初始化仓库。 查看一下这个空的远程仓库私服内容: sh-4.1$ ls -l 总用量 4 drwxr-xr-x. 7 git git 4096 9月 12 07:33 first sh-4.1$ cd ./first/ sh-4.1$ ls -l 总用量 32 drwxr-xr-x. 2 git git 4096 9月 12 07:33 branches -rw-r--r--. 1 git git 66 9月 12 07:33 config -rw-r--r--. 1 git git 73 9月 12 07:33 description -rw-r--r--. 1 git git 23 9月 12 07:33 HEAD drwxr-xr-x. 2 git git 4096 9月 12 07:33 hooks drwxr-xr-x. 2 git git 4096 9月 12 07:33 info drwxr-xr-x. 4 git git 4096 9月 12 07:33 objects drwxr-xr-x. 4 git git 4096 9月 12 07:33 refs 看不懂啥,没关系,我们下面用私服做一下仓库推送和克隆就知道好不好用了。 6.4.2. 连接Git私服 向Git私服仓库推送本地仓库: 空白处右键: 打开远端URL管理配置: 这个是github的,我们把它删除了,然后重新配置。 删除完成: 从新创建与Git私服的关联origin: ssh://git@192.168.136.129/home/git/first 或者 git@192.168.25.156:first 这里创建与远程私服仓库关联时候也可以使用Git Bash 然后使用命令: $ git remote add origin ssh://git@192.168.25.156/home/git/first 或 $ git remote add origin git@192.168.25.156:first 添加并确定,然后点击推送: 这个时候从linux系统直接查看我们的代码是看不到的: 但我们如果能down下来是不是说明上面已经有这个仓库了, 从私服远程仓库下载: 先创建一个文件夹:cloneForPrivate 克隆: 文件都已经取下来了: 能克隆下来就说明在远程私服仓库中你的工程代码也是存在的。 也可以使用Git Bash,使用命令: git clone ssh://git@192.168.136.133/home/git/first 7. 分支管理 7.1. 创建分支 第一次创建的,git会默认创建一个分支叫master,这个就是作为我们的主分支。 在最初的first工作目录【\git\first】下:空白处右键,用TortoiseGit可以查看当前工作目录对应的分支是什么: 说明当前的分支就是master 为什么有创建新分支的需求呢?比如系统已经上线了,这个上线的版本是不能乱改动的,但系统上线后出先bug是很常见的,所以我们还要继续改代码,这个时候上线时的版本就是我们的master分支,这个不能动,于是我们需要拉出一条新的分支,在这个新分支上面进行修改,每一天的修改内容都提交到这个新的分支上,然后再统一的在某一个合适的时点将新的分支合并到master分支上。这样就保证了master分支的相对稳定。 现在我们想再创建一个新的分支。 最初的本地工作目录【\git\first】,空白处右键:选择创建分支 确定后没发现啥变化,是因为当前工作目录仍然是在master分支上面,可以切换分支: 有一个切换的过程: 通过这个名称可知已经切换到dev1分支了。 在dev1分支上改点东西: 提交到dev1分支本地仓库 再切回master分支,看看同一个文件有没有变化: 没有变化,说明是两个独立的分支。 然后在master分支下编辑文件改点东西: 然后提交到master分支后,再切换会dev1看看同一个文件是否有变化: 发现没有变化。 说明master分支和dev1分支之间没有任何联系,它们之间完全是平行的。 分支可以有很多个,没有限制,但是master就一个,这个始终是我们的主分支,最终你都要把其他分支的东西合并过来。 7.2. 合并分支 我们可以把dev1分支合并到master主分支上去: 我们要保证当前的工作目录是对应的master分支,然后空白处右键,合并: 选择dev1分支,从dev1分支合并: 说明出现冲突了。文件图标显示叹号: 这就需要我们解决冲突: 解决冲突相当于把两个分支中冲突的地方都合并到一起,然后用一些标识符号标明哪些是master分支的,哪些是dev1分支的,然后需要我们手动编辑解决冲突,你想怎么编辑就怎么编辑,编辑完再提交到本地master分支的仓库。 它的文件图标变成红色了,打开看看内容: 编辑它们然后再提交: 编辑完: 提交代码: 会出现一个说明,这个是一个特殊的提交: 如果觉得dev1没有用了可以删除:但是要注意如果当前head指向了你要删除的分支是不能删除的,要先切换回来,然后在删除。 上面提到的冲突只是在相同的地方出现了才叫冲突,比如你在第100行改了代码,她在第三百行改了代码,他们之间就不存在冲突。只有当你们改的代码在一个相同的范围内,这个时候git就不会合并了,所以git只能把这些代码罗列到一起,然后你自己决定怎么修改。 附:分支原理 在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD指针严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。 一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点: 每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。 当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上: 你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化! 不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变: 假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并: 所以Git合并分支也很快!就改改指针,工作区内容也不变! 合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支: 8. Eclipse客户端egit 8.1. 安装egit插件 8.2. egit使用 8.2.1. 用户信息 egit和我们的git是功能相同的软件,使用egit是完全不需要安装git和TortoiseGit的。 egit也需要一些配置,配置用户信息,此信息为提交代码时,提交者的身份认证信息。如果你安装过git这个信息会被egit利用直接读取,如果没有安装过git,可以手填。 8.2.2. 将工程添加到本地仓库 选择我们的本地仓库的工作目录,然后Finish: 这个时候工程已经不在你的workspace下了,已经放到了【\git\first】中了 但这只是开始,你还没有添加到本地仓库,这个和正常操作git一样,先是添加到暂存区,再提交到本地仓库 8.2.3. 添加暂存区 8.2.3.1. 忽略文件 可以把不需要的文件添加到忽略文件中,在egit中也可以做到,和Git的差不多: 被忽略后文件的状态是没有修改的状态:bin是默认就忽略的,.settings是我们手动添加忽略的。 8.2.3.2. 添加到暂存区 忽略完成后就可以把剩下的文件添加到暂存区了: 添加到暂存去完成: 8.2.4. 提交到本地仓库 必须先添加到暂存区域后才能提交代码 提交成功后,工程状态已经变成正常了: 下面的界面清空: 8.2.5. 共享版本库(push到远程仓库) 本地用户提交先提交到本地版本库,如果需要提交到共享版本库,那么就需要push到远程共享版本库。 选择push把当前项目代码push到共享版本库中。 填写远程仓库地址: 点击OK提交成功。 8.2.6. 克隆(从远程仓库下载代码) 从新打开一个eclipse的workspace: 选择git视图: 选择克隆一个git仓库: 指定共享版本库位置,连接共享版本库。 更新代码到本地仓库【C:\mydir\03_workspace\git\clone-egit】 接下来需要把本地仓库项目导入到本地eclipse中进行开发: 如果是web项目,仍然也是 如果导入后发现不是一个web项目: 需要导入web项目必须的元素:一般出现这种情况就是在上传工程的时候忽略了不该忽略的文件造成的,上传web项目只忽略build文件夹下面的classes即可,其他的都上传。 8.2.7. 更新代码 现在有crm1和crm2两个git的工作目录,对应两个人的工作目录,现在crm2这个人改了代码: 提交本地仓库并同步到远程git私服上面: 提交暂存区: 提交本地仓库: 推送到远程git私服 推送成功后,现在需要crm1用户更新代码: 需要新建一个Remote name,指定我们的ssh://192.168.136.133/home/git/crm远程仓库: 已经获取到了: 8.2.8. 解决冲突 crm1用户修改了代码: 改完提交本地仓库并同步到远程git私服: crm2用户修改了代码: 改完提交本地仓库, crm2推送发现推不上去,向下拉取: 可以比较后修改,然后再提交本地仓库并推送到远程Git私服。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档