Git基础知识

65 阅读6分钟

Git基础知识

集中式对比分布式

GIT:分布式版本控制系统

  • 1.版本控制系统

    • 开发中我们把每一次的修改都有效的进行记录(记录成一个版本),后期如果需要回退到原有的有个版本或者是用当前的和某一个版本进行比较等,都可以有效的进行管理
      • 常用的版本控制系统:SVN(集中式) / GIT(分布式)
  • 2.分布式版本管理系统的特点

  • 3.Linux团队开发的git,所以git中的命令大部分都是linux命令

集中式对比分布式

集中式对比分布式.png

常用的Linux命令

WINDOWS操作系统:DOS窗口和DOS命令 LINUX服务器操作系统:LINUX命令 (MAC的终端使用的也是LINUX命令)

    ls -l/-a:查看当前目录结构(-a是可以看见所有的:包含隐藏的)
    cd xxx[路径地址]:进入到执行的文件夹中(进入的路径地址,可以粘贴到对应的操作命令窗口中)
      cd /:根目录
      cd ./:当前目录
      cd ../:上级目录

    clear:清屏

    mkdir:创建文件夹

    touch:创建空的文件

    vi:向文件中插入或者管理一些内容
      i=>进入到插入模式
      ESC + :WQ ,退出内容的插入模式,把刚才编辑的内容进行保存

    echo:向指定的文件中输入内容

    cat:查看文件中的内容

    cp:拷贝

    rm:删除文件  -r(递归删除)-f(强制删除),一旦删除无法还原

特殊注意:linux的部分命令和window doc命令类似,但是并不是相同的命令哦(linux和windows是不同的操作系统), git bash here中使用的是linux命令

基础工作流程

GIT的常规流程.png

1.每一个GIT仓库都有三个区: 工作区:写代码 暂存区:临时存放每一次修改的代码,但是并没有生成历史版本 历史区:存放所有历史版本的地方(提交到历史区就会生成历史版本)

2.把暂存区的某一个文件删除(提交到暂存区的内容不好,我们可以删除) gitrmcachedxxx.xxgit rm --cached xxx.xx git rm --cached . -r 删除暂存区中所有提交的

如果在删除过程中,发现从暂存区删除的文件,在工作区已经被修改了,只有加上 -f 才能强制从暂存区把内容删除掉

3.提交到暂存区一份,把工作区内容改了,但是改的东西不好,想把暂存区上次提交的内容撤回到工作区(覆盖工作区新写的内容) $ git checkout xxx.xx

暂存区内容没有消失,只是把工作去最新修改的信息给覆盖了,让工作区和暂存区保持一致

基础配置命令

如果是第一次使用git,生成历史版本的时候,需要提供身份认证

只需要在本地GIT全局环境下配置一些信息即可
$ git config -l
$ git config --global user.name 'xxx'
$ git config --global user.eamil 'xxx'

创建仓库

$ git init
  • .git文件存储当前git仓库的所有信息,不可以删除

  • 没有任何信息提交之前,当前仓库不具备任何的分支

    工作区到暂存区

    $ git add xxx  把指定的文件提交到暂存区
    $ git add .  包含修改和增加的,但是不包含删除的
    $ git add -u  包含修改和删除的,但是不包含新增的
    $ git add -A  同时具备 . 和 -u 特征
    $ git status  查看文件状态
    $ git rm --cached . -r  从暂存区撤销
    

    真实项目中,并不是所有的文件都和项目有关系(例如:.idea是WS生成的配置文件夹和项目没关系),也不是所有的文件都提交(例如:node_modules中的内容太大了,也不需要提交)

    想要把某些文件忽略提交,项目根目录增加 .gitignors

    .gitignore =>GIT提交的忽略文件

    # dependencies
    /node_modules
    
    # testing
    /coverage
    
    # production
    /build
    
    # misc
    .DS_Store
    .env.local
    .env.development.local
    .env.test.local
    .env.production.local
    
    npm-debug.log*
    yarn-debug.log*
    yarn-error.log*
    
    .idea
    

    暂存区到历史区

    $ git commit 提交到历史区
    $ git commit -m'xxx'  提交到历史区
    $ git log  查看提交记录
    $ git reflog 查看所有的历史记录(包括历史区回滚后)
    

    代码回滚操作

    $ git checkout .  把暂存区内容回滚到工作区(一但回滚,工作区内容无法恢复)
    $ git reset HEAD .  把当前暂存区的内容回滚到上一个暂存区,目的是为了把上一个暂存区内容回滚到工作区
    $ git reset --hard 版本号  在历史区中回退到某一个版本(强制把暂存区和工作区都变成回退后的版本)
    $ history > xxx.txt  把历史操作步骤输出
    

    注意:gitresetHEAD.把最近暂存区中的内容删除掉,紧接着执行 git reset HEAD . 把最近暂存区中的内容删除掉,紧接着执行 git checkout . 把上一个暂存区内容撤回工作区

团队协作开发

每个人是一个单独的本地仓库,有一个中央仓库,用来汇总所有开发者的编码信息(中央仓库一般由LEADER创建,而且是最先创建)

1.基础流程操作 1)首先创建中央仓库:可以基于gitHub/codding来创建(最好不要创建空仓库,因为空仓库中没有任何分支,只有提交一次历史信息才会生成MASTER分支) github.com/

把开发者都列入仓库的开发群组中,这样每一个开发者用自己的gitHub账号,都有权限操作这个仓库了(当然不这样做也可以,所有开发者用统一的一个账号也可以,为了防止不知道是谁提交的,我们需要让每一个客户端在本地的GIT全局配置中,设置和gitHub相同的用户名和邮箱 $ git config --global user.name 'xxx' ...)

2)创建客户端本地仓库(一个开发者就是一个单独仓库),还需要让本地的仓库和远程仓库保持关联,这样才可以实现后续的信息同步

$ git init    =>创建本地仓库
$ git remote add origin “远程仓库GIT地址”   =>让本地仓库和远程仓库保持连接
$ git remote -v    =>查看连接信息(origin是连接的名称,一般都用这个名字,当然自己可以随便设置)
$ git remote rm origin     =>移除本地仓库和远程仓库的链接
$ git remote update origin   =>更新链接通道

有更简单的方式:只要把远程仓库克隆到本地,就相当于创建本地仓库,而且自动建立了链接,并且把远程仓库中的内容也同步到了本地

$ git clone “远程仓库地址” “本地仓库文件夹名字(不写默认是仓库名字)”
把远程仓库克隆到本地(本地自动和远程建立连接,自动把远程中的信息同步到本地了,本地也是一个单独的仓库:建议远程仓库不要是空的,至少有一个master分支)

3)各自和中央服务器同步信息

$ git pull origin master  把远程仓库MASTER中的信息同步到本地仓库MASTER$ git push origin master  把本地仓库MASTER中的信息同步到远程仓库MASTER中(需要使用gitHub的用户密码来进行权限校验:一般都是组长在远程仓库中把组员的账号都放到小组中,这样组员用自己的账号也有权限操作仓库了,最好在本地的GIT配置中把用户名和邮箱修改为和gitHub账号相同的信息)
(每一次PUSH之前最好都PULL一下:如果有冲突在本地处理一下冲突,然后再推送)
  如果有冲突:
   1.进入到了编辑框模式,i->ESC->:wq 即可
   2.自己会把两份代码都保存在本地文件中,自己手动去选择要哪一个,改完后重新提交即可

团队协作.png

无分支管理模式

所有人使用的都是master分支,每天上班的第一件事, 以及每天提交自己代码的时候,第一件事情就是先拉取

$ git pull origin master
$ git add . / git commit -m'' / git push origin master

冲突合并:

  • 文件有冲突,但是不是同一个文件同一行代码

    • 不是同一行代码冲突:在提示的冲突命令行中同意即可
    ESC :wq (按下ENTER键即可)
           然后提交
    
  • 同一个文件,相同行代码冲突

    • 尝试合并失败,我们需要手动把代码进行合并,然后重新提交

单独分支管理模式

1、每天第一件事是把远程master内容拉取到本地master上(提交之前也是),每个人在自己本地仓库中,先进行分支创建和切换

$ git branch 查看当前存在的分支  
  * master 星代表当前在哪个分支上
$ git branch dev 创建一个叫做dev的分支 (创建分支完成,会把本地的master分支中的内容同步到dev分支上)  
$ git checkout dev 切换到dev分支上
$ git checkout -b dev  创建分支并且切换到指定分支下(可以把本地master中的历史信息同步到新创建的分支中)

2、正常的开发和提交,但是所有的操作都是在自己的分支上

3、把自己本地分支中的内容,合并到自己本地master分支上

  • 在切换分支的时候,有一部分信息并没有提交成为历史版本,为了防止信息的丢失,我们需要先使用stash保存,然后在基于stash pop还原
$ git stash 暂存文件(分支有更改,不能直接切换分支,需要把修改的内容暂存)
先切换到master的分支上
$ git stash pop 还原暂时存储的内容
$ git merge dev 把dev分支的历史信息合并到当前分支下 (有冲突按照之前的规则修改)

4、删除本地创建的分支

  • 下一次重新创建分支时候可以让分支和MASTER统一
  • 远程仓库中不记录任何的分支信息,防止冲突
 $ git branch -D dev 删除dev分支(删除的时候需要先切换到其它分支才可以删除)

5、将本地master分支中的内容提交到远程仓库中

使用问题处理

$ git push origin master
fatal: unable to access 'https://github.com/yangzekaiiii/xiaomiyoupin_react.git/': OpenSSL SSL_read: Connection was reset, errno 10054

$ git config --global http.sslVerify "false"
$ git push origin master
fatal: unable to access 'https://github.com/yangzekaiiii/xiaomiyoupin_react.git/': Failed to connect to github.com port 443 after 21069 ms: Timed out