• 分布式版本控制系统Git的使用最全最细;


    1.什么是Git

    后续内容会更新在个人站点: https.malusspectabilis.top

    Git是一个分布式的版本控制软件,Git在每个用户都有一个完整的服务器,然后有一个中央服务器,用户可以将代码提交到本地,没有网络也可以提交到本地,然后在有网络的时候提交到中央服务器,这样就方便了开发者,而相比SVS和SVN都是集中式的版本控制系统,工作的时候需要先从中央服务器获取作新的代码,改完后需要提交,如果是一个很大的文件则需要足够快的网络才能完成提交。而使用分布式的版本控制系统,每个用户都是一个完整的版本库,即使没有中央服务器也可以提交代码或者回滚,最终再把改好的代码提交至中央服务器进行合并即可。

    • 软件,类似于qq、office等安装到电脑才能使用的工具。
    • 版本控制,类似于毕业论文,视频剪辑等需要反复修改和保留原历史数据;
    • 分布式
    1. 文件夹拷贝
    2. 本地版本控制
    3. 集中式版本控制
    4. 分布式版本控制

    2.为什么要做版本控制?

    版本控制就是管理更新的历史记录,它为我们提供了一些在软件开发过程中必不可少的功能,例如记录一款软件添加或更新源代码的过程,回滚到特定阶段,恢复误删除的文件等。
    集中型与分散型

    2.1集中型

    1.以subversion为代表的集中型,将仓库集中存放在服务器之中,所以只存在一个仓库,这就是为什么这种版本管理系统被称为集中型。
    2.集中型将所有数据集中存放在服务器当中,有便于管理的有点,但是一旦开发者所处的环境不能连接服务器,就无法获取最新的源代码,开发也就无法进行,服务器宕机时也是同样的道理,而且万一服务器故障导致数据消失,恐怕开发者就再也见不到最新的源代码了。
    image

    2.2分散型

    1.分散型拥有多个仓库,相对而言稍显复杂,不过,由于本地的开发环境中就有仓库,所以开发者不必连接远程仓库就可以进行开发。
    2.图中只显示了一般的使用流程,实际上,所有仓库之间都可以进行push和pull,即使不通过git,开发A也可以向开发B的仓库进行push或pull。
    image

    3.安装Git

    安装Git软件有很多方式:

    3.1Windows系统

    https://git-scm.com/download/win
    

    3.2Linux系统

    https://git-scm.com/download/linux
    

    3.3MacOS系统

    https://git-scm.com/download/mac
    

    4.Git的使用

    4.1git init初始化仓库

    要想使用Git进行版本管理,必须先初始化仓库。Git是使用git init命令进行初始化的;
    1.进入要管理的文件夹
    2.执行初始化命令

    sh-3.2# mkdir apps
    sh-3.2# cd apps/
    # 这个时候这个目录初始化完成,可以进行工作;
    sh-3.2# git init
    Initialized empty Git repository in /private/etc/apps/.git/
    

    如果初始化成功,执行了git init命令的目录下就会生成.git目录,这个.git目录存放着管理当前目录内容所需的仓库数据。
    在git中,我们将这个目录的内容称为"附属于该仓库的工作树"。文件的编辑等操作在工作树中进行,然后记录到仓库,以此管理文件的历史快照。如果想将文件恢复到原先的状态,可以从仓库中调取之前的快照,在工作树中打开。开发者可以通过这种方式获取以往的文件。

    sh-3.2# ls -l
    total 0
    drwxr-xr-x  9 root  wheel  288  8 26 17:48 .git
    

    4.2git status查看仓库的状态

    git status命令用于显示Git仓库的状态。
    工作树和仓库在被操作的过程中,状态会不断发生变化,在git操作过程中常使用git status命令查看当前状态,

    sh-3.2# cat haitang.txt 
    haitang
    
    # 新增的文件和修改过的人间都是红色的,这里显示新增了一个文件的状态是未追踪状态,使用git add来对其进行管理
    sh-3.2# git status
    On branch master
    
    No commits yet
    
    Untracked files:
      (use "git add ..." to include in what will be committed)
    	haitang.txt
    
    nothing added to commit but untracked files present (use "git add" to track)
    

    4.3git add向暂存区中添加文件

    如果只是使用git仓库的工作树创建了文件,那么该文件并不会被记入git仓库的版本管理对象当中,因此使用git status命令查看的时候它会显示在untracked file当中。
    要想让文件成为git仓库的管理对象,就需要使用git add命令将其加入暂存区(Stage或者Index)中。暂存区是提交之前的一个临时区域。

    sh-3.2# git add haitang.txt 
    # 这个时候这个文件由红色变成了绿色。
    sh-3.2# git status
    On branch master
    
    No commits yet
    
    Changes to be committed:
      (use "git rm --cached ..." to unstage)
    	new file:   haitang.txt
    

    4.4配置个人信息与代码高亮

    说明是谁在使用和配置代码高亮

    sh-3.2# git config --global user.email "haitang@qq.com"
    sh-3.2# git config --global user.name "haitang"
    sh-3.2# git config --global color.ui auto
    sh-3.2# vim ~/.gitconfig 
    [color]
       ui = auto
    

    4.5git commit保存仓库的历史记录;

    git commit命令可以将当前暂存区中的文件实际保存到仓库的历史记录中,通过这些记录,我们就可以在工作树中复原文件。

    使用commit提交。"里面为描述信息"
    sh-3.2# git commit -m "海棠one"
    [master (root-commit) 61dbe71] 海棠one
     1 file changed, 1 insertion(+)
     create mode 100644 haitang.txt
     
    当前工作树处于最新状态,结果显示没有更改。
    sh-3.2# git status
    On branch master
    Your branch is up to date with 'origin/master'.
    
    nothing to commit, working tree clean
    

    4.6git log查看提交日志

    git log命令可以查看以往仓库中提交的日志,包括可以查看什么人在什么时候进行了提交或合并。以及操作前后有怎样的差别。

    sh-3.2# git log
    commit 61dbe71f56fc1176d6f158fef61572b3515db841 (HEAD -> master)
    Author: haitang <haitang@qq.com>
    Date:   Fri Aug 26 17:58:50 2022 +0800
    
        海棠one
    

    4.6.1只显示提交信息的第一行

    sh-3.2# git log --pretty=short
    commit 9c303e7ddce7fbe83506f8f4847fe1df56e8b57a (HEAD -> master, origin/master, origin/HEAD)
    Author: haitang <haitang@qq.com>
    
        haitang three
    
    commit ea353ffe4c1b2b75942cd57421f97c74df894342
    Author: haitang <haitang@qq.com>
    
        dev 第一次提交
    
    commit 65a13999930ce95cd59fc09e1423ab20dcc402c6
    Author: haitang <haitang@qq.com>
    
        haitang two
    
    commit 61dbe71f56fc1176d6f158fef61572b3515db841
    Author: haitang <haitang@qq.com>
    
        海棠one
    

    4.6.2只显示指定目录、文件的日志

    sh-3.2# git log 61dbe71f56fc1176d6f158fef61572b3515db841
    commit 61dbe71f56fc1176d6f158fef61572b3515db841
    Author: haitang <haitang@qq.com>
    Date:   Fri Aug 26 17:58:50 2022 +0800
    
        海棠one
    

    4.7git reset回滚到历史版本

    添加一行执行add执行回滚操作。

    sh-3.2# echo "海棠two" >> haitang.txt
    
    对这个文件进行追踪
    sh-3.2# git add .
    
    再次提交至本地版本库
    sh-3.2# git commit -m  "haitang two"
    [master 65a1399] haitang two
     1 file changed, 1 insertion(+)
    
    查看日志
    sh-3.2# git log
    commit 65a13999930ce95cd59fc09e1423ab20dcc402c6 (HEAD -> master)
    Author: haitang <haitang@qq.com>
    Date:   Fri Aug 26 18:03:28 2022 +0800
    
        haitang two
    
    commit 61dbe71f56fc1176d6f158fef61572b3515db841
    Author: haitang <haitang@qq.com>
    Date:   Fri Aug 26 17:58:50 2022 +0800
    
        海棠one
    
    进行回滚, 回滚方式为 git reset --hard 版本号 这个版本号不用全部写完,7位即可
    sh-3.2# git reset --hard 61dbe71
    HEAD is now at 61dbe71 海棠one
    
    验证是回滚完成
    sh-3.2# cat haitang.txt 
    haitang
    

    4.8升级

    可以通过reglog查看历史全部的记录

    sh-3.2# git reflog
    61dbe71 (HEAD -> master) HEAD@{0}: reset: moving to 61dbe71
    65a1399 HEAD@{1}: commit: haitang two
    61dbe71 (HEAD -> master) HEAD@{2}: commit (initial): 海棠one
    
    要想回到haitangtwo执行git rest --hard 版本号即可;
    sh-3.2# git reset --hard 65a1399
    HEAD is now at 65a1399 haitang two
    
    sh-3.2# cat haitang.txt 
    haitang
    海棠two
    

    4.9克隆项目到本地

    sh-3.2# git clone git@gitee.com:good-news/apps.git
    Cloning into 'apps'...
    remote: Enumerating objects: 12, done.
    remote: Counting objects: 100% (12/12), done.
    remote: Compressing objects: 100% (6/6), done.
    remote: Total 12 (delta 0), reused 0 (delta 0), pack-reused 0
    Receiving objects: 100% (12/12), done.
    sh-3.2# 
    

    4.10git remote add添加远程仓库

    列出所有当前配置的远程设备

    sh-3.2# git remote -v
    origin	git@gitee.com:good-news/apps.git (fetch)
    origin	git@gitee.com:good-news/apps.git (push)
    
    # 显示这个仓库的详细信息
    sh-3.2# git remote show origin
    * remote origin
      Fetch URL: git@gitee.com:good-news/apps.git
      Push  URL: git@gitee.com:good-news/apps.git
      HEAD branch: master
      Remote branch:
        master tracked
      Local branch configured for 'git pull':
        master merges with remote master
      Local ref configured for 'git push':
        master pushes to master (up to date)
    
    # 添加一个远程仓库到本地
    sh-3.2# git remote add origin git@gitee.com:good-news/iqiyi.git
    

    4.11 以图表的形式查看分支

    =sh-3.2# git log --graph
    * commit 9c303e7ddce7fbe83506f8f4847fe1df56e8b57a (HEAD -> master, origin/master, origin/HEAD)
    | Author: haitang <haitang@qq.com>
    | Date:   Fri Aug 26 18:44:16 2022 +0800
    | 
    |     haitang three
    | 
    * commit ea353ffe4c1b2b75942cd57421f97c74df894342
    | Author: haitang <haitang@qq.com>
    | Date:   Fri Aug 26 18:26:18 2022 +0800
    | 
    |     dev 第一次提交
    | 
    * commit 65a13999930ce95cd59fc09e1423ab20dcc402c6
    | Author: haitang <haitang@qq.com>
    | Date:   Fri Aug 26 18:03:28 2022 +0800
    | 
    |     haitang two
    | 
    * commit 61dbe71f56fc1176d6f158fef61572b3515db841
      Author: haitang <haitang@qq.com>
      Date:   Fri Aug 26 17:58:50 2022 +0800
      
          海棠one
    

    5.Git分支命令

    5.1git branch显示分支

    git branch命令可以将分支名列表显示,同时也可以确认当前所在分支。
    可以看到master分支左侧 有"*"表示这是当前所在的分支,也就是说,正在master分支下进行开发,结果中没有显示其他分支名,表示本地仓库只存在一个master一个分支。

    sh-3.2# git branch 
    * master
    

    5.2git checkout创建分支

    git branch xx分支名

    sh-3.2# git branch dev
    可以看到创建的dev分支
    sh-3.2# git branch 
      dev
    * master
    

    git checkout -b创建分支

    sh-3.2# git checkout -b dev
    Switched to a new branch 'dev'
    
    可以看到的是创建并切换到了dev分支。git branch xx分支名效果等同。
    sh-3.2# git branch
    * dev
      master
    

    5.3切换分支

    显示已经切换为dev分支

    sh-3.2# git checkout dev
    Switched to branch 'dev'
    
    可通过branch来查看在哪个分支,可以看见dev分支前面有一个*
    sh-3.2# git branch 
    * dev
      master
    

    5.4代码合并

    在dev分支上创建文件并提交
    sh-3.2# touch dev.txt && echo "hello git" > dev.txt
    sh-3.2# git add .
    sh-3.2# git commit -m "dev 第一次提交"
    [dev ea353ff] dev 第一次提交
     1 file changed, 1 insertion(+)
     create mode 100644 dev.txt
     
    切换分支
    sh-3.2# git checkout master
    Switched to branch 'master'
    
    在master分支上合并dev分支上的代码;
    sh-3.2# git merge dev
    Updating 65a1399..ea353ff
    Fast-forward
     dev.txt | 1 +
     1 file changed, 1 insertion(+)
     create mode 100644 dev.txt
     
    没有合并之前,在master分支上是看不见dev分支上的代码;
     sh-3.2# cat dev.txt 
    hello git
    

    5.5删除分支

    git branch -d 分支名

    sh-3.2# git branch -d dev
    Deleted branch dev (was ea353ff).
    
    删除了可以看见就剩下一个分支
    sh-3.2# git branch
    * master
    

    5.6git commit --amend修改提交信息

    要修改上一条的提交信息,可以使用git commit --amend明亮。执行命令编辑器就会启动。

    sh-3.2# git commit --amend
    [dev 3dd1290] hha2020.9.1
     Date: Thu Sep 1 20:36:31 2022 +0800
     1 file changed, 1 insertion(+)
     create mode 100644 file.txt
    

    6.将代码托管至远程服务器

    github: https://github.com/
    gitlab: 需在服务器上部署;
    gitee:https://gitee.com/
    选择gitee来测试

    6.1创建一个仓库

    image

    6.2会生成一个仓库信息

    image

    添加仓库,注意我们配置的是SSH类型
    sh-3.2# git remote add origin git@gitee.com:good-news/apps.git
    

    6.3本地push代码至远程仓库

    我们为什么能上传代码到远程仓库呢?因为我们把公钥放在了gitee,我现在把公钥拿掉,验证是否能push

    sh-3.2# git push origin master
    Enumerating objects: 9, done.
    Counting objects: 100% (9/9), done.
    Delta compression using up to 16 threads
    Compressing objects: 100% (4/4), done.
    Writing objects: 100% (9/9), 699 bytes | 699.00 KiB/s, done.
    Total 9 (delta 0), reused 0 (delta 0)
    remote: Powered by GITEE.COM [GNK-6.4]
    To gitee.com:good-news/apps.git
     * [new branch]      master -> master
    

    6.4无密钥验证是否能push代码

    6.4.1 编辑第三次提交
    sh-3.2# echo "haitang three"  >>haitang.txt
    6.4.2 追踪文件
    sh-3.2# git add .
    上传至本地版本库
    sh-3.2# git commit -m "haitang three"
    [master 9c303e7] haitang three
     1 file changed, 1 insertion(+)
     
    6.4.3 这里看到是不能上传的,因为把公钥拿掉了。
    sh-3.2# git push origin master
    git@gitee.com: Permission denied (publickey).
    fatal: Could not read from remote repository.
    

    6.5配置SSH上下传代码;

    拿到本地的公钥上传至gitee个人账户下
    sh-3.2# cat /var/root/.ssh/id_rsa.pub 
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDZRnFbJGoALs8wMC+EJS7Yewdre8XDaheQNW6U0gmf30mZvzIspqbr5uIVnIwQaT5usYgy2EGjJ2xLRrxfwE2I8UKDyeothIM6zeQxW9Ah+tXeIgWSbX83esMRx/PxysGp4IIykW8+C5Lt3/aUWD7ABHYU2Di4aSj/71+76z877/wrgPYaWvAarU+ZRBzV7oYyXeLLy7lLuxZkFyfyArjzL7pDslOTj+fGcfAUyeOdUjyWhL+7CtvaY/fyXU/hkw9k770XNKQh4QYjZztS/FhJnwOi8OcS2j7kLJDAiaJYKKpCamAec7/f2e16f+HWCz41Wc4DFfJvlyo1/x6ADLnMmPoFoZrKLYOOxlKlCu9/SAomMOCf0qxyl
    

    image

    6.6测试再次上传代码

    这次上传是没有问题的

    sh-3.2# git push origin master
    Enumerating objects: 5, done.
    Counting objects: 100% (5/5), done.
    Delta compression using up to 16 threads
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (3/3), 292 bytes | 292.00 KiB/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    remote: Powered by GITEE.COM [GNK-6.4]
    To gitee.com:good-news/apps.git
       ea353ff..9c303e7  master -> master
    
  • 相关阅读:
    FLowUs:一款优秀强大、好看的文件协作软件
    go语言基本操作---六
    光环:元宇宙概念及生态发展现状与研判——张子良
    MySQL安装
    HTML、CSS学习笔记小结
    Windows 安装,配置Tomcat
    3GPP R18冻结,哪些信息值得关注?
    FreeBASIC通过Delphi7 DLL调用MS SOAP使用VB6 Webservice
    ArrayList与LinkedList性能分析
    JVM 参数及调优
  • 原文地址:https://www.cnblogs.com/xunweidezui/p/16628413.html