zoukankan      html  css  js  c++  java
  • 1、Git

    引言

    单人开发时,可用于项目的进行版本管理,利于开发进度控制
    多人开发时,可用于版本管理,和多人协同控制

    介绍

    Git 分布式版本控制系统,开源

    安装(省略)

    官方下载,安装

    安装后的设置

    #打开cmd,输入git,有打印日志信息则安装成功
    git
    #设置全局配置,设置用户名和邮箱,提交版本时会用到
    git config --global user.name "用户名"
    git config --global user.email "邮箱"
    #查看配置信息
    git config -l |
    #查看当前git版本
    git --version
    

    概念图

    名词概述

    版本库:工作区中有一个隐藏目录.git 用于管理git以及同级目录下的文件,.git不属于工作区
    工作区:目录中除了.git目录不是工区,其余的都是工作区,用于存放要提交的文件
    暂存区: 版本库中包含一个临时区域,保存下一步要提交的文件
    分支: 版本库中包含若干分支,提交的文件存储在分支中

    本地仓库

    对应的就是一个目录,输入git init 该目录下会生成一个.git文件夹,该文件夹就是版本库,文件夹以外的区域就是工作区

    E:
    epository1>git init
    Initialized empty Git repository in E:/repository1/.git/
    

    效果如下:

    创建一个空文件于仓库下:

    #查看本地仓库的状态
    E:
    epository1>git status
    On branch master
    
    No commits yet
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
            file1.txt
    
    nothing added to commit but untracked files present (use "git add" to track)
    
    当前仓库没有任何提交,并且提示file1.txt这个文件没有跟踪,也就是没有对该文件加入暂存区或没有存放于分支下;
    

    将文件存放到暂存区中

    #添加到暂存区
    E:
    epository1>git add .
    #查看状态
    E:
    epository1>git status
    On branch master
    
    No commits yet
    
    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
            new file:   file1.txt
    

    这时已经将工作区下的所有文件存放到暂存区中,.代表将工作区中的所有文件

    将暂存区中的文件提交到分支下

    E:
    epository1>git commit -m "a new file"
    [master (root-commit) 0fefd19] a new file
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 file1.txt
    

    每次将暂存区中的文件提交到分支下就相当于该项目的一个版本a new file则是对这个提交的版本进行描述,例如“新创建的项目”,“添加了校验功能”等,该描述是必填的

    远程仓库

    当一个项目由多人协同完成时,每个人会负责不同的模块对其进行开发,并对各自完成的部分代码进行共享,合并代码最终成为一个完整的项目,此时就需要远程仓库。

    远程仓库存放在服务器上,在服务器上建立远程仓库,开发人员可以从该远程仓库上进行clone,pull,push操作,对项目的版本进行管理。

    服务器有:GitHub、Gitee等,以下用Gitee举例;

    Gitee操作

    首先需要注册Gitee账号,然后登陆;

    创建仓库

    仓库名称(必填)

    点击提交,一个空的远程仓库建好了,如下:

    本地仓库连接远程仓库

    通过远程仓库地址进行连接

    #添加一个远程仓库地址
    E:
    epository1>git remote add origin https://gitee.com/lin/blog.git
    #查看关联地址
    E:
    epository1>git remote -v
    origin  https://gitee.com/lin/blog.git (fetch)
    origin  https://gitee.com/lin/blog.git (push)
    #将本地内容存放到远程仓库中去
    E:
    epository1>git push origin master
    Enumerating objects: 3, done.
    Counting objects: 100% (3/3), done.
    Writing objects: 100% (3/3), 209 bytes | 52.00 KiB/s, done.
    Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
    remote: Powered by GITEE.COM [GNK-5.0]
    To https://gitee.com/linzekai/blog.git
     * [new branch]      master -> master
    

    初次提交需要输入远程仓库的用户名和密码

    完成后,查看Gitee,文件已经上传到了远程仓库中

    克隆远程仓库

    当中途加入某个开发小组时,可以从远程仓库上直接将当前的项目版本克隆下来,进行开发;
    新建一个文件夹,用于存放克隆下类的项目文件

    点击克隆,赋值网址

    #从远程仓库克隆文件
    E:
    epository2>git clone https://gitee.com/linzekai/blog.git
    

    从远程仓库中拉取

    #拉取远端的数据库分支
    git pull origin master
    

    多人协同开发之间的共享过程

    通过两个仓库模拟多人协同开发

    repository1,修改file1文件的内容,以及创建一个新的文件并提交到远程仓库

    C:UsersAdministratorDesktop
    epository1>git add .
    
    C:UsersAdministratorDesktop
    epository1>git commit -m "second edit"
    [master d202a0a] second edit
     2 files changed, 1 insertion(+)
     create mode 100644 file2.txt
    
    C:UsersAdministratorDesktop
    epository1>git push origin master
    Enumerating objects: 5, done.
    Counting objects: 100% (5/5), done.
    Delta compression using up to 4 threads
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (3/3), 280 bytes | 280.00 KiB/s, done.
    Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
    remote: Powered by GITEE.COM [GNK-5.0]
    To https://gitee.com/linzekai/blog.git
       d3b6f0d..d202a0a  master -> master
    

    repository2从远程仓库中拉取新的版本

    
    C:UsersAdministratorDesktop
    epository2log>git pull origin master
    remote: Enumerating objects: 5, done.
    remote: Counting objects: 100% (5/5), done.
    remote: Compressing objects: 100% (2/2), done.
    remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
    Unpacking objects: 100% (3/3), 260 bytes | 11.00 KiB/s, done.
    From https://gitee.com/linzekai/blog
     * branch            master     -> FETCH_HEAD
       d3b6f0d..d202a0a  master     -> origin/master
    Updating d3b6f0d..d202a0a
    Fast-forward
     file1.txt | 1 +
     file2.txt | 0
     2 files changed, 1 insertion(+)
     create mode 100644 file2.txt
    

    多人协同开发时,写好的代码git push上传到远程仓库;需要代码的git pull拉取代码即可

    命令 作用
    git remote add 便是名(origin)远程地址 本地关联远程仓库
    git push 标识名 master 将本地仓库内容上传到远程仓库
    git pull 标识名 master 从远程仓库下载内容到本地仓库
    git clone 远程地址 将远程仓库复制到本地,并自动形成一个本地仓库

    分支

    • 是每个版本的存储位置,是一条时间线,当执行git commit形成版本时,每个版本会依次存储在分支的提交点上;
    • 分支由多个提交点组成,分支上有一个指针,指向最新的提交点

    git的内部优化

    分支命令

    查看当前仓库的分支

    # 仓库默认只有master分支,执行git commit 时默认在master分支上保存版本
    C:UsersAdministratorDesktop
    epository2log>git branch
    * master
    

    实际上,远程仓库的master分支一般不是用于版本的记录,而是用于存储正式的版本;而版本记录一般新建一个分支用于存储记录,当确认新分支的版本没有问题时,才会将该分支上的版本添加到master分支上;

    分支的创建

    #分支的创建
    C:UsersAdministratorDesktop
    epository2log>git branch development
    #查看分支
    C:UsersAdministratorDesktop
    epository2log>git branch
      development
    * master     ### 当前分支为master
    
    ### 切换分支为development
    C:UsersAdministratorDesktop
    epository2log>git checkout development
    Switched to branch 'development'
    
    C:UsersAdministratorDesktop
    epository2log>git branch
    * development     ### 当前分支为development
      master
    

    在工作创建file3新文件(当前分支为development)

    C:UsersAdministratorDesktop
    epository2log>git add .
    ### 将所有文件存入暂存区development分支下的新提交点
    C:UsersAdministratorDesktop
    epository2log>git commit -m "insert file3"
    [development f51eed6] insert file3
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 file3.txt
    

    此时在将分支切回master分支

    C:UsersAdministratorDesktop
    epository2log>git checkout master
    Switched to branch 'master'
    Your branch is up to date with 'origin/master'.
    

    此时的工作区变成了只有两个文件

    因为

    每个分支都有一个指针,创建一个分支,首先是创建一个指针,而且新分支的指针会和当前分支指向同一个提交点。
    新分支包含的提交点就是从第一个提交点到分支指针指向的提交点。

    分支提交日志

    通过提交日志可以看到分支中提交点的详细情况

    ### master分支
    C:UsersAdministratorDesktop
    epository2log>git log --oneline
    d202a0a (HEAD -> master, origin/master, origin/HEAD) second edit
    d3b6f0d a new file
    
    ### 切换到development分支
    C:UsersAdministratorDesktop
    epository2log>git checkout development
    Switched to branch 'development'
    
    ### development分支
    C:UsersAdministratorDesktop
    epository2log>git log --oneline
    f51eed6 (HEAD -> development) insert file3
    d202a0a (origin/master, origin/HEAD, master) second edit
    d3b6f0d a new file
    
    ### git log 可以看到详细的日志信息
    C:UsersAdministratorDesktop
    epository2log>git log
    commit f51eed6d3a1e3fbc0544c225765376606fd1aa53 (HEAD -> development)
    Author: lzk <lzk15217292146@163.com>
    Date:   Sun Aug 9 13:21:28 2020 +0800
    
        insert file3
    
    commit d202a0afc3bd9f1d4f67501022de848427b35213 (origin/master, origin/HEAD, master)
    Author: lzk <lzk15217292146@163.com>
    Date:   Sun Aug 9 10:39:56 2020 +0800
    
        second edit
    
    commit d3b6f0d521952d8236b60d39b0415387223bcb22
    Author: lzk <lzk15217292146@163.com>
    Date:   Sun Aug 9 10:23:37 2020 +0800
    
        a new file
    

    分支合并

    将一个分支上的内容存放到另一个分支上

    当前分支是这样的

    #切换到master分支
    C:UsersAdministratorDesktop
    epository2log>git checkout master
    Switched to branch 'master'
    Your branch is up to date with 'origin/master'.
    ### 将分支development的内容合并到master分支上
    C:UsersAdministratorDesktop
    epository2log>git merge development
    Updating d202a0a..f51eed6
    Fast-forward            ### 快速合并
     file3.txt | 0
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 file3.txt
    

    此时,master分支也有了file3文件

    合并之后变成这样,快速合并仅仅只是将master指针移动到development指针的同一个提交点上。因为master分支最新的提交点包含在development分支中,并且没有做任何改动。

    如果当master分支和development之间有了不同了提交点,此时git会将共同拥有的提交点和各自新创建的提交点进行合并;

    当前两个分支都拥有相同的提交点

    C:UsersAdministratorDesktop
    epository2log>git branch
      development
    * master
    
    C:UsersAdministratorDesktop
    epository2log>git log --oneline
    f51eed6 (HEAD -> master, development) insert file3
    d202a0a (origin/master, origin/HEAD) second edit
    d3b6f0d a new file
    
    C:UsersAdministratorDesktop
    epository2log>git checkout development
    Switched to branch 'development'
    
    C:UsersAdministratorDesktop
    epository2log>git log --oneline
    f51eed6 (HEAD -> development, master) insert file3
    d202a0a (origin/master, origin/HEAD) second edit
    d3b6f0d a new file
    

    此时,在master分支上对文件file1进行了修改,并再次交

    ### 切换到mster分支
    C:UsersAdministratorDesktop
    epository2log>git checkout master
    Switched to branch 'master'
    Your branch is ahead of 'origin/master' by 1 commit.
      (use "git push" to publish your local commits)
    ### 添加到暂存区
    C:UsersAdministratorDesktop
    epository2log>git add .
    ### 添加到分支
    C:UsersAdministratorDesktop
    epository2log>git commit -m "update file1"
    [master 7596808] update file1
     1 file changed, 2 insertions(+), 1 deletion(-)
    

    切换到development分支上,对file2进行编辑并提交

    ### 切换分支
    C:UsersAdministratorDesktop
    epository2log>git checkout development
    Switched to branch 'development'
    ### 添加到暂存区
    C:UsersAdministratorDesktop
    epository2log>git add .
    ### 添加到分支
    C:UsersAdministratorDesktop
    epository2log>git commit -m "update file2"
    [development c4dc950] update file2
     1 file changed, 1 insertion(+)
    

    此时变成了这样

    当我们想将development分支合并到master分支上,如下操作

    C:UsersAdministratorDesktop
    epository2log>git checkout master
    Switched to branch 'master'
    Your branch is ahead of 'origin/master' by 2 commits.
      (use "git push" to publish your local commits)
    
    C:UsersAdministratorDesktop
    epository2log>git merge development
    Merge made by the 'recursive' strategy.
     file2.txt | 1 +
     1 file changed, 1 insertion(+)
    

    此时是这样的

    由两个分支共同的节点以及两个分支各自的新节点进行合并形成一个新的master分支提交点;
    合并只是将development分支和并到master分支上,但是development分支本身没有变化

    通过git log --oneline --graph命令可以简单的描述合并的过程

    C:UsersAdministratorDesktop
    epository2log>git log --oneline --graph
    *   4645eca (HEAD -> master) Merge branch 'development'
    |
    | * c4dc950 (development) update file2
    * | 7596808 update file1
    |/
    * f51eed6 insert file3
    * d202a0a (origin/master, origin/HEAD) second edit
    * d3b6f0d a new file
    

    分支合并的冲突问题

    当master修改的是file1文件,而development也修改的是file1文件,这事将两个分支合并会导致合并冲突问题

    C:UsersAdministratorDesktop
    epository2log>git branch
      development
    * master
    
    C:UsersAdministratorDesktop
    epository2log>git add .
    
    C:UsersAdministratorDesktop
    epository2log>git commit -m "modify file1"
    [master 35b05e8] modify file1
     1 file changed, 1 insertion(+), 2 deletions(-)
    

    C:UsersAdministratorDesktop
    epository2log>git checkout development
    Switched to branch 'development'
    C:UsersAdministratorDesktop
    epository2log>git add .
    C:UsersAdministratorDesktop
    epository2log>git commit -m "modify file1 column"
    [development 4f518a1] modify file1 column
     1 file changed, 1 insertion(+), 1 deletion(-)
    

    将development分支合并到master分支

    C:UsersAdministratorDesktop
    epository2log>git checkout master
    Switched to branch 'master'
    Your branch is ahead of 'origin/master' by 5 commits.
      (use "git push" to publish your local commits)
    
    C:UsersAdministratorDesktop
    epository2log>git merge development
    Auto-merging file1.txt
    CONFLICT (content): Merge conflict in file1.txt  ###file1.txt放生了合并冲突问题
    Automatic merge failed; fix conflicts and then commit the result. ### 自动合并失败
    

    此时,打开文件,发现git将发生冲突的内容都显示出来

    此时可以考虑留下哪一方的内容,然后再次进行提交

    C:UsersAdministratorDesktop
    epository2log>git add .
    
    C:UsersAdministratorDesktop
    epository2log>git commit -m "modify file1"
    [master 77f91a8] modify file1
    
  • 相关阅读:
    f2fs源码解析(五) node管理结构梳理
    没有什么好神秘的: wait_on_page_bit
    write_back 浅浅分析
    f2fs解析(六)
    转载软件需求文档标准格式
    转载 如何设计一个优秀的数据库
    转载 MySQL创建表的语句 示例
    equals和==的区别 (Java基础)
    转载 【Linux】Linux中常用操作命令
    windows 注册表
  • 原文地址:https://www.cnblogs.com/Ryuichi/p/13443658.html
Copyright © 2011-2022 走看看