Git的使用

Git工具是一个比较好用的版本控制工具,之前只是简单的听说,最近打算系统的学习一下,在这里做一下笔记。
Git是一个免费的、开源的分布式版本控制系统。可以快速高效的处理从小型导大型的项目。也就是说,每个版本不用我们自己进行备份。svn(集中化版本控制系统)也是一个版本控制系统。

  • 版本控制系统:可以让项目回退到过去某个时间点。一些文件内部的细节变化也能看到,并且可以查询是谁修改了的导致的问题的出现。总之就是好!!!
  • 集中化版本控制系统:svn、cvs、perforce等。
    优点:特点就是有一个中央服务器,所有的东西上传到这个中央服务器上,并且别人更新以后可以下载。
    缺点:存在单点故障问题、需要联网。
    缺点:每次存储的是这个版本和上个版本之间的差异,因此回滚的话,需要一个版本一个版本的回滚。
  • 分布式版本控制系统:git、bitkeeper等。客户端并不只是提取最新的文件快照,而且把代码仓库完整(所有版本)的镜像下来,所以每个客户端其实都是一个服务器。保存的是这个版本与之前所有版本的索引。由于git的算法较好,所以保存的内容只是大一点点。还可以设置一个远程仓库(GitHub等),供协同开发。
  • git的本地结构:工作区(写代码的地方)、暂存区(打算提交但是还没有提交,做一个临时存储的区域)、本地库(每个历史版本的信息)。命令:
    git add:工作区提交到暂存区。
    git commit:暂存区提交到本地库。
  • 代码托管中心:帮助维护远程库。本地库与远程库的交互方式分为两种:
    • 团队内部协作步骤:
    1. 项目经理创建项目到本地库
    2. push到远程库
    3. 程序员clone到本地库
    4. 程序员push到远程库
    5. 项目经理pull到本地库
    • 跨团队协作步骤:
    1. A公司项目经理创建项目到本地库
    2. push到远程库
    3. B公司通过fork操作,复制A项目的远程库中的内容,形成一个新的远程库,供B公司的人用
    4. B公司程序员clone远程库到本地库
    5. B公司程序员push本地库到远程库
    6. B公司的远程库通过pull request进行申请,A公司审核同意,进行一个marge操作
    7. A公司的人pull到本地库
  • 托管中心种类:局域网环境下:可以搭建GitLab服务器作为代码托管中心;外网环境:可以由GitHub或者Gitee作为代码托管中心

下面说一下本地库的一些操作:

  • 初始化本地库:创建本地仓库的存放目录 -> 右键打开终端(Git Base Here) -> 切换到创建的目录下(cd E:/GitRepository) -> 执行git init命令即可进行初始化。在目录下GitRepository生成了一个.get的目录及包含的内容(.开始的文件可能是隐藏的,需要自己手动取消他的隐藏才能看到)。

  • git常用命令:git中的命令是linux的命令。可以终端页面右键,选择options可以设置字体和编码格式,选择utf-8。

    • git config user.name:查看用户名
    • git config user.email:查看邮箱
    • git config --global user.name “xxx”:设置用户名
    • git config --global user.email “xxx”:设置邮箱

    下面的命令必须在git仓库中才能执行。

    • git add filename:添加文件(将文件提交到暂存区。例如,在仓库目录下创建demo.txt文件,执行git add demo.txt命令,将文件放到暂存区)。
    • 注意,上面两个命令是将文件放到本地仓库中的。其中,不在仓库文件夹下的文件,git不进行管理;直接在仓库目录下创建文件,git也不管理。必须执行上面的两条命令才可以将内容提交到本地库
      • 注意,上面两个命令是将文件放到本地仓库中的。其中,不在仓库文件夹下的文件,git不进行管理;直接在仓库目录下创建文件,git也不管理。必须执行上面的两条命令才可以将内容提交到本地库。
    • git status:查看工作区和暂存区的状态。如果提示nothing to commit,则表示已经都提交到了本地库;如果提示untracked files…则表示还有文件没有add(没有放到暂存区),并且会显示文件名;如果提示changes to be committed…则表示文件没有commit(没有放到本地库),并且也会显示文件名。修改文件之后,再次查看状态,提示Changes not staged for commit…表示修改之后没有add(修改之后的没有提交到暂存区);add之后提示changes to be committed…表示没有commit;commit之后就是nothing to commit表示所有的都已经提交了。
    • git log:可以查看提交的信息,包括谁提交的、提交的时间、提交的文件、文件的注释等信息,由近到远进行展示。并且信息还有一个16进制保存的东西(commit),可以理解为上面提到的所保存的索引或者键值对(key就是索引,value就是历史记录对应的具体的内容)。如内容太多左下角显示一个冒号,则用空格进入下一页,b表示上一页,显示到最后一页的时候,左下角显示END,摁q表示退出。其他日志展示方式如下:
      • git log:有分页的效果。
      • git log --pretty=oneline:在一行上将日志展示出来(每个日志显示一行,没有了登记者等内容。但是commit和注释还是完整的)。
      • git log --online:也是在一行上显示,但是显示的比上面的方法还要简洁(相比上面的方法,commit的内容只显示了七个字符)。
      • git log reflog:跟git log --online的内容类似,但是多了一个HEAD@{X},其中X表示回滚到这一行的版本需要多少步。
    • git reset --参数 索引:前进或者后退历史版本,这里的索引使用通过git log reflog获取的那部分索引(7位)就可以。在终端中选中的内容就直接执行了复制操作。
      • hard参数:要求本地库指针移动的同时重置暂存区、重置工作区(工作区也就是文件中显示的内容)。(常用)
      • mixed参数:本地库指针移动的同时重置暂存区,但是不重置工作区。
      • soft参数:本地库指针移动,但是暂存区和工作区都不重置。
      • 索引:想要查看当前的在哪,我们可以使用HEAD即可,就是重复当前的回滚操作。
    • rm -rf filename;git add;git commit:删除的是工作区的文件;删除暂存区;删除本地库。这样就完成了全部的删除,并且commit也可以添加注释。但是并没又真正的删除,还可以通过git reset命令到回滚回来。哪怕是add以后就后悔了,想回滚,也可以通过git reset。
    • git diff:查看工作区和暂存区的全部文件的区别。通过查询结果的红色(-文件内容)和绿的(+文件内容)可以对比出不同。git是按照行为单位进行管理数据,操作是先删除,后添加。
    • git diff filename:查看指定文件工作区和暂存区的区别。
    • git diff 索引 filename:查看工作区(索引)和本地库的文件区别。
  • 分支:在版本控制中,使用多分支同时推进多个任务(多个功能)。多个分支之间可以并行开发,相互之间不影响,最终多个分支合并到主分支上。

    • 查看分支:git branch -v。前面带*的分支,表示当前所在的分支。
    • 创建分支:git branch 新分支的名字。注意:刚创建的分支的索引号与当前所在分支的版本号(索引)是一样的,但是修改之后就不一样了(各分支开发互不影响)。
    • 切换分支:git checkout 分支名。切换分支以后,接下来就再这个分支上进行一些操作。注意,如果没有切换了以后,直接区盘符内查看文件,文件也会变成对应分支应该有的内容。
    • 分支合并:git merge 分支名。在A分支上就是将其他分支(也就是这里分支名对应的分支)合并到A上。
      • 冲突:在A分支上执行git merge B,如果A和B分支都对某部分代码修改,则会出现重复的问题,无法自动合并,会提示错误。并且命令行中末端会显示(A|B)表示目前是合并状态。然后打开文件(可以到盘符内打开,也可以cat filename打开)可以看到冲突的内容。
      • 解决冲突:在盘符中人为决定所保留的部分,注意,在文件里面有一些git给产生的符号,也删除掉,例如:等号,左右尖括号等。然后在add和commit,注意:这时候commit后面不能带文件名。commit之后,末端会显示(A),表示不是合并状态了。

到此,本地库的操作基本结束了。下面学习团队协作的时候,可以使用GitHub或者Gitee作为代码托管中心。
    首先创建本地库和远程库。远程库的地址格式:https://gitee.com/用户名/仓库名.git。git可以通过别名在本地将gitee的地址进行保存。

  • git remote -v:查看远程地址有没有别名,会有两条一个后面带fetch、另外一个带push,分别表示从地址上取回和推送数据。
  • git remote add 别名 远程库的地址:给一个远程库添加别名。
  • git push 别名 分支:推送数据到远程仓库,第一个需要输入远程仓库的账号密码。如果不使用别名,可以直接使用远程库的地址。这里如果是其他人push的时候,需要先加入团队。管理员发出邀请,复制邀请链接给普通用户,普通用户登录以后在浏览器中粘贴邀请链接,点击接收即可。
  • git clone 远程库地址:克隆远程库的内容,注意克隆完成以后需要进入文件夹,cd 仓库名。也是进行了初始化,并且会自动创建别名,别名为origin。
  • 清楚git的缓存(如果在一台电脑上登陆过远程库以后,换另外一个文件夹,照样可以随便push,不需要验证了。这样可能不安全,可以通过清楚缓存来解决。):在windows中搜索管理你的凭据,找到在普通凭据中找到远程库对应的凭据进行删除。
  • git pull 别名 分支:远程库数据拉取操作。其实是拉取(这个拉取跟上面的不一样这个可以理解为读)操作(fetch)和合并操作(merge)的一个结合。如果分开的话操作就是下面的1和3。
    1. git fetch 别名 分支:单纯的拉取(读)数据,单独执行这个命令,并没有改变工作区的内容,其实是下载到了本地库。
    2. git checkout 别名/分支:切换到远程库下载到本地库的数据中,进而查看其内部数据。
    3. git merge 别名/分支:远程库和本地库进行合并。注意如果执行完上面的命令(你已经到了本地库中的远程库的分支),记得切换回本地的分支。
    4. –allow-unrelated-histories:分支后面再携带这个参数,表示告诉git允许不相关历史合并。用来解决两个仓库有不同的开始点的情况(例如本地创建了项目并且git管理了,与远程已有的项目进行合并的时候就用得到),但是冲突问题还是需要人工解决。执行后还需要对本次操作进行一个注释,可以写一下为什么拉取两个仓库到一个仓库之类的(i进行插入内容,esc之后:wq表示保存退出)。
  • 解决冲突问题:如果推送(提交到远程端)有问题,则需要下载下来,解决冲突以后再提交。
    • 拉取之后会出现冲突的情况,如上面的本地冲突命令行中末端会显示(A|B)。这时候我们可以去工作区查看冲突的情况,并且人为解决。
    • 解决冲突以后,先add和commit。注意这时候commit还是不能带文件名,因为现在还是解决冲突的时候,不用带文件名。
    • 然后再push一下就可以了。

到此,团队内的协作基本结束,下面是跨团队合作:
        首先团队A需要先创建远程库,然后将远程库的地址给团队B。B团队登录自己的远程仓库以后,浏览器中粘贴地址。右上方有一个fork,点击即可将项目fork到自己(如果项目是私有的,那么B团队fork的一个人要加入到这个项目中)的账号中。fork之后,B团队的这个项目名下面会有forked from 团队A用户的名字。
        然后团队B的人可以clone到本地进行编辑,注意这时候克隆的需要是团队B在远程仓库中的地址,编辑和提交的操作跟上面的团队内部协作是一样的,下面说最终的两个团队之间进行merge。
        B团队的人进行pull request(在远程仓库中进行的),然后A公司的人进行审核(在远程仓库中的pull request里面可以看到B团队提交的请求,并且可以相互留言进行交流。在files changed中可以查看他的内容)之后进行merge。

到此团队间的协作完成,下面进行一些内容补充:
    上面用的远程库的地址都是http的地址,在我们实际开发中,我们一般用ssh的地址。

  • ssh免密登录:(缺点:只能针对一个远程账号)
    1. cd ~:进入到用户的主目录中。在任何目录下,我们都可以打开git的终端,然后执行此命令即可。或者进入用户的目录下,然后打开终端。
    2. ssh-keygen -t rsa -C 邮箱:生成密钥。邮箱为本用户的git的邮箱,然后要进行三次选择,直接三次回车选择默认的值即可,然后就生成了一个密钥。注意,这里的C必须大写。这时候在C盘user/当前用户的目录下就有一个.ssh的文件了,里面有两个文件。有一个是id_rsa.pub。
    3. 将id_rsa.pub的内容进行复制,登录远程仓库,在个人账号中有一个设置,找到ssh keys,然后将内容复制进去,标题随便起,然后添加即可。
    4. 这样就免密登录了。

下面进行idea软件和git的结合:

  • idea集成git:file -> settings -> version control -> git,在path to git executable中选择git的安装路径,找到安装文件夹下的bin下的git.exe文件进行选择即可。
  • 项目跟git关联(git的初始化,初始化本地库):在idea的导航栏中选择git -> vcs(或者直接是导航栏中的vcs)-> import into version control -> create git repository,然后在路径中选择项目名(表示整个项目都是git进行托管,也可以选择项目中的一部分)。这时候在盘符中可以看到项目内部多了一个.git的文件。接下来创建的文件,idea都会提示是否进行add操作。
  • 项目(文件)add:在项目或者文件上右键-> git -> add,即可将项目或者文件添加到暂存区。
  • 项目(文件)commit:在项目上右键-> git -> commit,在commit message中添加注释(本次提交的啥),即可将项目或者文件添加到暂存区。在底部的version control或者git中的console中可以查看,里面的命令基本就是我们在git终端中执行的命令;在底部的version control或者git中的log中可以查看提交的日志,跟终端的查看提交日志一样的效果,双击提交的版本可以查看到索引提交的人等信息。
  • 编辑代码:如果代码左侧(打断点的地方)有颜色,则表示与本地库不一致的内容。再次提交则会让你进行选择合并等操作。
  • 项目(文件)提交到远程库:在项目上右键-> git -> repository -> push,然后点击define remote来输入远程库的地址。输入远程库的用户名和密码,然后push即可。我们一般先pull,查看是否有冲突,然后再push。
  • 项目(文件)commit和push结合:在项目上右键-> git -> commit,在commit message中添加注释以后不选择commit,而是点击commit右边的三角形选择commit and push即可。但是不推荐,因为我们一般是先pull解决冲突,然后push。
  • 项目(文件)pull:在项目上右键-> git -> pull,然后选择分支即可拉取。
  • 项目clone:第一次新建选择get from vcs,然后输入远程库地址,在下面选择保存到本地的路径即可。或者file -> new -> project from version control,然后输入远程库地址,在下面选择保存到本地的路径即可。
  • 冲突问题:
    • 如果发生冲突,则远程库是拒绝push的,需要在提示框中选择merge进行合并。
    • 可以选择accept yours使用你的版本,也可以选择accept theirs选择远程库的,也可以选择merge将两者进行合并。具体合并的时候,也是idea会给一个界面,让你自己选择如何合并,谁在前谁在后,中间的位置是合并之前的,也就是不冲突的部分。
    • 然后再进行push操作即可。
  • 如何避免冲突:
    • 避免在一个文件中写代码。
    • 在push之前,先pull。(推荐)

到此,git的学习结束了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值