很多版本控制器眼花缭乱,Snv,Git 等,我们下面来说一下Git的远程协作开发的常用步骤

1、先说一下Git我们如何切换分支,首先切换分支时候要保证我们的代码是最新的,要先更新我们本地代码git remote update(也就是把远程的分支上别人提交的新代码下载到你的本地,当然你运行完可以看到你的工作空间的目录文件或许已经改变),运行git  rebase orign/远程本身,然后运行Git checkout 分支名称

     总结一下就是三部,git remote update    -- >  git  rebase orign/远程本身  -- >   git checkout 分支名称 

     (值得注意的,这两个词命令有很多用法,这里只说这两种,若不够自己的需求可以去深入研究版本控制的逻辑与原理,虽然你并不一定能搞明白)

2、在说一下提交代码,当我们有些功能在本地编辑完成了,我们需要提交到远端,要进行一下几部的操作

      git remote update

      git add . (注意这个点,. 是提交你所有修改的文件《包括了你修改的地方与新建的文件,当然还有另外两种用法,这里只说一种》)

      git commit -m "提交的说明信息" (这一步可以和上一步合并,add是把你的改动放到暂存区,commit是把你的修改提交到本地仓库,具体概念这里不深究)

      git rebase origin/分支号  (注意斜杠这是和远程的分支合并,把你本地仓库的代码与远程分支合并,当然这一步有时候会产生冲突,冲突需要一行一行来解决,eclipse与idea会有自己的图形界面来操作《左边是你的代码。中间是上一个版本的代码,右边是别人提交的与你冲突的代码》,用到了merge等操作。具体,rebase这一步是否和remote update冗余。这里可以思考一下)

       git push origin 分支号   当然如果在上一步产生了冲突在解决完冲突后需要运行 git rebase --continue,之后再进行此步骤。

3、如果我们在操作过程中遇到了一些错误,Git会给出解决命令,按照操作一般可以解决问题,当然在新手的情况下可能盲人按摩,瞎摸一通而错。

4、如果我们在修改时不知修改了那些文件,可以运行git  status 来查看,标红的即是所改文件。

5、当然上面的一切我们需要申请账号,并且clone项目,见下端:

     

第五步:git授权与clone工程

5.1、首先需要向公司申请git账号

5.2、在你想要存放工程的目录下打开git命令窗口(右键,Git Bash Here)

      账号申请完成后需要在本地执行git相关命令,如下

   

git config --global user.name "wb-*****"
git config --global user.email "*****@163.com"
ssh-keygen -t rsa -C "*****@163.com"

如图:

 

gitlab 存在合并冲突 解决冲突 本地合并 gitlab合并冲突怎么解决_用户名

5.3、执行完以上命令后会生成如下两个文件,打开XXX.pub文件。将内容拷贝一下。粘贴到下图中指定位置(看不清楚的话可以放大图片)

 

gitlab 存在合并冲突 解决冲突 本地合并 gitlab合并冲突怎么解决_Git_02

gitlab 存在合并冲突 解决冲突 本地合并 gitlab合并冲突怎么解决_Git_03

5.4、将生成的秘钥粘贴应用后,在本地执行如下命令

git clone http路径

如果ssh克隆不好使,就是用http克隆

 

gitlab 存在合并冲突 解决冲突 本地合并 gitlab合并冲突怎么解决_远程仓库_04

6、如果办公电脑不可抗力出现损坏。更换电脑时

你可能会发现新的git如论什么操作都需要输入用户名密码,这时候需要打开cmd命令(注意不是git命令), 设置用户名与密码,

$ git config --global user.name "Your Name" ,$ git config --global user.email "your_email@example.com" ,

设置完后可以查看一下git的配置,会发现已经持久化账号和密码,再重新再项目文件打开git窗口,发现已经不需要输入username与email了

7、有时候用户名密码在更新代码或提交代码时需要频繁合并,我们需要持久化一下用户名密码,命令如下:

   git config --global credential.helper store

-(如果本地的修改没有add到缓存,而且像还原回之前的样子,那么只需要 git checkout .  可以将本地代码还原到上个版本)

8、我们可以将多次提交commit合并成一次,我们在提交代码时,一个需求有可能提交了N多次,而且都是比较小的改动,

这时候可以用git rebase -i HEAD^^^^^命令来融合多个提交(^代表了有多少个commit),进入编辑模式,我们要改的第一行我们用pick命令,

相邻下面几行用s命令,保存退出后再次进入编辑模式,保留第一行的提交说明,下面几行去掉就OK(为了美化git提交记录不择手段)

      当然这些操作班组最基本的需求是没问题,但是大家有时候可能会苦恼一个版本控制器为何如此错综,但是事实就是这样,可能国内的情况很一下掌握版本控制的本质细节原理,但是其确实值得深究,毕竟广大码农现在不可能离开它。

下面是git目录接口及作用:

.git文件夹目录结构

1 、hooks文件夹:

    这个目录存放一些shell脚本,可以设置特定的git命令后触发相应的脚本;

    在搭建gitweb系统或其他git托管系统会经常用到hook script。
2、info文件夹:

     包含git仓库的一些信息
3 、logs文件夹:

     保存所有更改的引用记录,继续打开logs文件夹,有refs文件夹和HEAD文件

    请看下图中
(1)HEAD文件

        主要记录每次的变更操作,所有类型的变更都会记录的哦,

         git reflog命令查询出的列表就是HEAD中存储的列表

(2)继续打开refs文件夹,可以看到heads文件夹、remotes文件夹和stash文件

    I : stash文件存储的是所有你使用git stash命令暂存的记录,是一个列表。使用git stash list时,查询出的列表就是从stash中取出来的。

    II:heads文件里面存储的是一系列的本地分支的对象,每个对象的文件名就是本地的一个分支名,使用git branch查看本地分支命令时,查询出的所有本地分支就是取的heads文件夹下所有文件的名称。

    III:remotes文件夹里存储的是远端的一系列分支的对象,每个对象的文件名称就是远端的一个分支名称,使用git branch -a查看远端分支命令时,查询出的所有本地分支就是取的remotes文件夹下所有文件的名称。

4、objects文件夹

该目录存放所有的Git对象,对象的SHA1哈希值(一共40位)的前两位是文件夹名称,后38位作为存在相应文件夹下对象的文件名。

比如0b这个文件夹,它里面有一系列git对象(也就是文件),里面所有文件的38位的名称加上0b,就组成原来的40位的哈希值了。

更近一步说,我们每次提交新文件到git上时,这时会根据该文件内容计算生成一个40位的哈希值,假如生成的是0c7bcc3f8f1c5311d06e3067f7f7dddecb8668fe,这个文件的存储方式就是先截取0c作为文件夹名称,然后后面的38位7bcc3f8f1c5311d06e3067f7f7dddecb8668fe作为文件名称,存储在0c文件夹下。

如果这时你又提交了一个文件或者修改了一个文件碰巧又生成一个以0c开通的哈希值,那么这个时候就会直接截取该哈希值的后38位作为该次生成的git对象的文件名,存储在原来已经存在的0c文件夹下。

5、refs文件夹

(1)heads文件夹

        该文件夹存储的是所有的本地分支文件,每一个本地分支文件中,存储的是一个哈希值,每一次commit都是生成一个对应的哈希值,然后用这次新生成的哈希值,替换掉原来这个分支文件中的哈希值。

如下三张图,红色的代表新提交的三个文件,然后

    
(2)stash文件

        该文件夹是使用git stash命令时,会将生成的git对象的哈希值存储到stash文件里,更进一步说stash文件中,就存了一个40位的哈希值。对应的git对象在objects文件夹里。使用git stash pop时,会先去stash文件中,找到该哈希值(或者也可以认为是指针),然后到对应的objects文件夹下,查找对应的git对象,将其中的数据取出来,转换成我们能看懂的代码

        I、继续打开tags文件夹

            当使用git tag v1.0给当前分支,打上标签时,就会在tags文件夹下,生成对应文件,文件里存储的是当前分支所对应的哈希值,以后就可以使用v1.0这个标签来代替分支名称,通常发布稳定的线上版本时,使用这种做法。方便以后查询,因为使用标签容易记,更简洁。

6、COMMIT_EDITMSG文件提交的是最近一次提交的描述信息
7、 config:这个是GIt仓库的配置文件
8、 description:仓库的描述信息,主要给gitweb等git托管系统使用
9、 index:这个文件就是我们前面提到的暂存区(stage),是一个二进制文件
10、HEAD文件里面只存储了当前分支的关联

11、记住账号密码 git config --local credential.helper store

12、比如说交接工作时候换了电脑,同事的git账号信息和你的信息会有冲突,需要切换成你的信息,可以用以下命令,git config --global user.name "YOURUSERNAME" git config --global user.email "YOUREMAIL",(查看git config user.name git config user.email),有时候保存了用户名与邮箱,生成了私钥,还是无法操作项目,

gitlab 存在合并冲突 解决冲突 本地合并 gitlab合并冲突怎么解决_远程仓库_05

那么重新克隆项目 git clone https://用户名@rdc.hand-china.com/gitlab/项目.git

克隆时候加上自己的用户名就OK了,注意此操作相当于将代码fork了一份(切了个分支,拷贝了一份),在更新代码时候会发现更不下来,应为这个克隆下来的分支与主干没有关系,可以用下面方法解决,删除电脑中原用户的凭证

gitlab 存在合并冲突 解决冲突 本地合并 gitlab合并冲突怎么解决_远程仓库_06

13、SVN是集中式版本控制系统

所有版本都是存储在中央仓库中,想要回滚或者查看某个版本,需要联网才可以,上线出bug回滚不好搞

gitlab 存在合并冲突 解决冲突 本地合并 gitlab合并冲突怎么解决_git_07

14、zhufeng

### GIT版本管理工具
#### 1.为什么要使用版本管理工具
- 历史版本备份:能够进行有效的备份和还原到历史的某个备份版本
- 团队协作开发:解决团队协作开发中的合并和冲突处理
- ...

常用的版本控制工具
- git:分布式版本管理工具(>=90%)
- svn:集成式版本管理工具

#### 2.安装GIT
操作系统
- windows  微软
- mac(os) 苹果
- linux 服务器端
- ...

GIT是linux创始人研发的工具,所以GIT中的操作大部分都是linux操作命令
- https://git-scm.com GIT官网中提供的安装包,本身就把linux的模拟环境和git集成打包在一起了,只要按照这个安装完成,非linux系统中也能正常的基于linux命令操作git了

#### 3.GIT分布式版本管理系统  VS  SVN集中式版本管理系统
作业:git 和 svn 的区别

#### 电脑扫盲
1. 启动windows操作命令(DOS命令)
> win + R   => 出现运行窗口 => 在窗口中输入 cmd  => 打开DOS窗口  (在默认的目录中打开)

2. 配置电脑的系统环境变量
> 在某些命令不能使用的情况下,我们基于系统环境变量的配置,可以使用命令


=====================
初次安装使用GIT,需要在本地配置一下GIT的基本信息(操作GIT的用户信息)
```
查看本地的GIT全局配置
$ git config -l  (字母L)
   =>user.name
   =>user.email
   =>如果信息特别多的情况下,我们看不全,一路ENTER键,知道END为止;再次输入 :wq  保存退出查看即可;

配置一下用户名和邮箱(建议用户名和邮箱跟GIT-HUB中注册的账号保持一致)
https://github.com
$ git config --global user.name 'xxx'
$ git config --global user.email 'xxx'

查看是否配置成功
$ git config --global user.name或者user.email,只要能有信息,说明配置成功,否则配置失败,重新配置一下(这个步骤很重要,后期提交都历史区的时候,需要知道谁提交的,此处必须注明本地的用户信息)
```

========================
$ git init  创建仓库
$ git status  查看文件的状态
  =>红色 代表当前文件处于工作区,还没有提交到暂存区
  =>绿色 代表当前文件处于暂存区,还没有提交到历史区
$ git add <file>  把指定的文件从工作区提交到暂存区
  => $ git add .  或者  $ git add -A 把所有工作区最新修改的文件,都提交到暂存区
$ git commit -m'备注信息'    (-m和备注信息之间没有空格的)  把暂存区中的信息提交到历史区,生成一个历史版本
  => $ git log 查看本地历史版本信息
  => $ git reflog 在log的基础上增加历史回滚的信息
$ git reset --hard 版本号 (选取版本号的前7位即可)  回滚到指定的历史版本(把指定历史版本中的信息,替换工作区内容)

$ git rm --cached <file> 删除传递到暂存区中的信息(只是从暂存区移除了,工作区还是有的,这个操作很少用)

========================
团队协作开发中,为了实现代码的相互共享,我们需要建立中央服务器(中央仓库)
=>每个开发者都把代码同步到中央仓库中
=>也随时从中央仓库拉取最新的代码
=>问题:分支、合并代码、冲突处理

真实项目中,中央仓库都是公司自己内部的服务器创建的(内网访问),也有公司是基于开源的平台创建中央仓库(私有化的仓库,指定参与者)
=>github 权威
=>gitee 码云
=>coding
=>...

https://github.com/

1.在GITHUB中创建中央仓库
https://github.com/zhouxiaotian/20200317.git  我的仓库GIT地址 (用户名/仓库名.git)

2.把本地仓库中的信息同步(推送和拉取)到中央远程仓库上
 A:和远程仓库建立连接
   $ git remote -v  查看本地仓库和哪些远程仓库保持联系
   $ git remote add 连接名字(一般都叫做origin) 远程仓库地址    和远程仓库保持连接
   $ git remote remove 连接名字

 B:把本地仓库中的信息同步到(推送到)远程仓库
   =>推送的信息是本地“历史区”中的信息(包括所有版本信息),所以推送之前,需要先把工作区中的信息增加到历史区才可以  $ git add -A  然后  $ git commit -m''
   $ git push origin(关联时候取的名字) master
	  => 在弹出的用户名密码框中,分别输入 github 的账号和密码
	  => 有的电脑第一次输入成功后会保存下来,下一次就无需重新输入了
   
   $ git pull origin master
      => 推送之前最好先拉取远程仓库中的信息

-----------
$ git clone 远程仓库地址  别名    把远程仓库克隆到本地
   -> 创建一个文件夹“起的别名”
   -> git init  本地创建一个仓库
   -> git remote add origin 地址   和克隆的远程仓库默认关联
   -> git pull origin master  把现有远程仓库中的信息拉取到本地

=========================================
作业:
1. git 和 svn 的区别
2. 本地建立一个仓库,把“git 和 svn 的区别”的答案新建一个文档整理好,提交成为一个历史版本;然后自己随便创建一个小的页面,在提交成为历史版本;....
3. 建立git-hub远程仓库,把本地仓库中的信息同步到远程仓库上
交作业,在群里,发自己的仓库地址到群里 (@周老师),截止今晚12点之前
例如这样的地址:https://github.com/zhouxiaotian/20200317

--------
1. 回去在把免费课的东西好好的复习一下,明天开始继续深入,讲解变量提升和闭包作用域
http://www.javascriptpeixun.cn/course/751  从第2章第2节开始快速预览

2. 我们以后的讲义都上传到GIT上(我会建立一个GIT仓库,地址给你们,你们需要克隆到本地,以后基于 $ git pull 不断更新讲义即可)

15、首次上传项目

我们本地新建好了SpringBoot项目,但是如果首次上传gitlib应该怎么做呢,我们需要先在公司的gitlib中新建一个自己的project或者group/project,然后需要将本地的项目库初始化然后绑定提交到远程(命令如下),

touch README.md
git init
git add .
git commit -m “xxxxxxxxx”
git remote add origin https://xxx/xxx.git  //此处如果域名不好使试试ip
git push -u origin master
16、push与pull都失败
有时候我们合并完代码时候push时候提示报错,然后需要运行pull拉一下,pull的时候也报错,
那么pull如果是如下报错refusing to merge unrelated histories则需要运行如下命令,$ git pull --allow-unrelated-histories,之后应该就可以push了,但是如果有文件重命名应该会存在两个文件,手动处理一下,然后push。
有时候我们想忽略某代码的提交:
我们可以把像忽略的文件或者目录写到.gitigore里面就可以了,对于从来没有提交过的新文件确实是这样的,但是如果文件已经提交并且push过了,那么你加到.gitignore里面也不行,需要把本地缓存清一下才行,命令如下:
git rm --cached devServer.json
 然后在项目的.gitignore文件中加上devServer.json
 git commit -m "注释"git push origin 分支名称

之后再修改devServer.json就会发现不会在提交列表了