GIT的使用

git的学习

初次接触git,对git的使用进行简单梳理。


Git简介

Git是目前世界上最先进的分布式版本控系统。
那么什么是版本控制系统呢???
比如说我们现在写一个学生管理系统,当我们每完成一个功能时,可以说当前的代码的bug率很低,
现在不应该时继续去完成其它功能,而是将当前项目做备份,以免自己在后续的功能增加中修改了
之前的代码后发生的错误,如果没有备份,修改起来比较繁琐,这会极大的影响开发效率。





说到版本控制系统这里就得稍微介绍下SVN

每个开发者可以直接连接服务器,然后在本地修改,最好commit到SVN服务器上。这样造成的问题就
是,通常本地只是缓存一个小版本,版本的历史信息都在服务器上,一旦离开服务器本地就不能够追
踪代码版本。并且当项目过于庞大时会显得更加杂乱。

可以看到分布式的结构,我们的本地可以pull下完成的版本库,并且可以制定一个leader端,可以很
方便的提供给大家交换修改,当然因为每个人都有完整的库,因此任意两个人都可以进行修改,断网时
也会存在历史版本在个人终端中。


git的安装

  1. Git官网下载
  2. 一路next就行。
  3. win+r
    1
    git --version
    提示版本号则安装完成
  4. github注册账号,并新建一个repository
  5. 将本地git和github连接起来
    桌面右击Git Bash Here
    1
    ssh-keygen
    按3下回车,进入C:\Users\Piller4F\.ssh记事本打开id_rsa.pub复制,打开自己的github

    复制即可

git的基本操作

创建版本库

  1. 创建一个代码库
    找一个合适的地方建立文件夹
    1
    2
    3
    mkdir FirstPractice
    cd FirstpPractic
    pwd
  2. 使用git init命令将该目录变为Git管理的仓库
    1
    git init
    此时Git仓库为一个空的仓库,你会发现生成了一个.git的目录,这个目录就是Git来跟踪管理版本库。
  3. 我们编辑一些文件例如main.cpp内容如下。
    1
    2
    3
    4
    5
    6
    #include <iostream>
    using namespace std;
    int main () {
    cout<<"hello world"<<endl;
    return 0;
    }
  4. 使用git add命令,将文件加入仓库。
    1
    git add main.cpp
  5. 使用git commit命令,将文件提交到仓库,-m后面输入的是本次commit提交的说明,虽然不是必须的,但是有了备注之后更加方便其它人寻找改动记录。
    1
    git commit -m "first initial"
    那么为什么我们需要添加两次到仓库呢,其实使用add命令时会将文件发送到一个暂存区的地方,暂存区可以多次被添加文件,使用commit后会将暂存区所有的文件都导入到版本库中,后续会说道这样做的优点。
  6. 我们现在修改main.cpp中的代码。用git中的vim直接进行操作。将main.cpp改为如下:
    1
    2
    3
    4
    5
    6
    7
    #include <iostream>
    using namespace std;
    int main () {
    cout<<"First modify"<<endl;
    cout<<"hello world"<<endl;
    return 0;
    }
  7. 然后运行git status看看结果:
    1
    git status
  8. 发现有红色标记main.cpp被修改了。红色是表明没有被提交,我们使用git diff看看修改了什么:
    1
    git diff
  9. 然后我们通过刚才的方法先addcommit
    1
    2
    git add main.cpp
    git commit -m "add First modify"

    Git的版本控制功能—回退

  • 版本1:
    1
    2
    3
    4
    5
    6
    #include <iostream>
    using namespace std;
    int main () {
    cout<<"hello world"<<endl;
    return 0;
    }
  • 版本2:
    1
    2
    3
    4
    5
    6
    7
    #include <iostream>
    using namespace std;
    int main () {
    cout<<"First modify"<<endl;
    cout<<"hello world"<<endl;
    return 0;
    }
    我们在实际工作中看不出来那个版本修改了什么,但在Git中,我们使用git log命令查看:
    1
    git log
    1
    2
    3
    4
    5
    6
    7
    8
    commit 52ad3a63045092cefd1e6eb8ef3e5ac2d84649f6 (HEAD -> master)
    Author: Shi Guoqiang <piller4f@163.com>
    Date: Fri Jun 12 21:28:10 2020 +0800
    add First modify
    commit cfb32fbb5d91b5b767fc94095f87c6e5ce123dc4
    Author: Shi Guoqiang <piller4f@163.com>
    Date: Fri Jun 12 21:18:42 2020 +0800
    first initial
    可以看到第一次我们first inital第二次是add First modify
    信息较多,因此我们可以使用
    1
    git log --pretty=oneline
    1
    2
    52ad3a63045092cefd1e6eb8ef3e5ac2d84649f6 (HEAD -> master) add First modify
    cfb32fbb5d91b5b767fc94095f87c6e5ce123dc4 first initial
    可以看到前面那么一串的是commit的版本号。那当我们需要回退到上一个版本怎么做呢???
    1
    2
    git reset --hard HEAD^
    HEAD is now at cfb32fb first initial
    可以看到其中cfb32fb不就是我们第一次版本的版本号的前几个字符。然后打开我们的main.cpp发现变为如下:
    1
    2
    3
    4
    5
    6
    #include <iostream>
    using namespace std;
    int main () {
    cout<<"hello world"<<endl;
    return 0;
    }
    使用git log看看本地版本库状态。
    1
    2
    3
    4
    commit cfb32fbb5d91b5b767fc94095f87c6e5ce123dc4 (HEAD -> master)
    Author: Shi Guoqiang <piller4f@163.com>
    Date: Fri Jun 12 21:18:42 2020 +0800
    first initial
    那么现在我想后悔了,准备恢复回去怎么办???使用git reflog
    1
    2
    3
    cfb32fb (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
    52ad3a6 HEAD@{1}: commit: add First modify
    cfb32fb (HEAD -> master) HEAD@{2}: commit (initial): first initial
    可以看到我们add First modify版本号52ad3a6使用git reset
    1
    2
    git reset --hard 52ad3a6
    HEAD is now at 52ad3a6 add First modify
    这里涉及到一个概念HARD它其实是一个指针,用于定位当前版本,因此只要有commit_id我就可以到任何版本。

    工作区和暂存区的概念

  • 工作区
    我们的FirstPrectice就是我们的工作区
  • 版本库
    工作区中又一个目录.git这个是我们Git的版本库。其中最重要的stage(暂存区),以及Git为我们自动创建的一个分支master和一个指针HEAD
    我们知道git在添加文件时有两步骤:
    第一步使用git add将文件添加入暂存区。
    第二步使用git commit将暂存区中的所有文件提交到当前分支。
    因此将需要修改所有文件放入暂存区,然后一次性的将所有的修改提交到当前分支。

    撤销修改

    我们将main.cpp修改为如下
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    using namespace std;
    int main () {
    cout<<"你个麻瓜!!!"<<endl;
    cout<<"First modify"<<endl;
    cout<<"hello world"<<endl;
    return 0;
    }
    可以看到不知道怎么回事心情不好,暴躁的写了一句“你个麻瓜”。当然如果你把这个交了,估计会被头头问话了。因此这是我想撤销我的修改。
    使用
    1
    git checkout --main.cpp
    此时你发现ok了,你在工作区中的修改被恢复。
    那现在问题又来了,我将main.cppadd了,现在在暂存区里面。
    使用git reset HEAD filename将当前暂存区清除,此时在和之前一样删除就可以了。
    1
    2
    git reset HEAD main.cpp
    git checkout -- main.cpp

    删除文件

    当我们讲一个文件提交进版本库,为了保证工作区和版本库中的一致性,不可以直接在工作区删除文件同样需要使用git命令,并提交版本库。
    先添加
    1
    2
    git add file.md
    git commit -m "add file.md"
    再删除
    1
    2
    git rm file.md
    git commit -m "rm file.md"

    部署远程仓库

    在Git安装的时候已经配置了SSH加密,并建立了gitbub仓库,这里不再赘述。
    将github上了仓库和本地仓库做关联。
    1
    git remote add origin https://github.com/Piller4F/FirstPractice.git
    把本地内容推送到远程库上:
    1
    git push origin master
    这时候可能会出现错误
    1
    error:failed to push some refs to......
    由于github在建立代码库时选择生成了README.md导致远程库不一致。
    1
    git pull -rebase origin master
    这里就将远程库和本地库进行了统一
    1
    git push origin master
    将代码推到远程库

    从远程库进行克隆

    找一个自己心仪的文件夹
    1
    git clone https://github.com/Piller4F/FirstPractice.git

    创建与合并

    在Git中master为主分支,而HEAD指向master表明,HEAD指向的是目前正操作的对象。而当我们创建一个新的分支的时
    候例如devGit则新建了一个指针叫dev再把HEAD指向dev上,因此目前的操作对象就成了dev这个路线。到了合并的时
    候,只需要将master指向的dev就完成了合并。合并完成后,我们还可以删除dev分支。
    1
    git checkout -b dev
    checkout```命令加上```-b```表示创建并切换,等同于:
    1
    2
    3
    ```
    git branch dev
    git checkout dev
    然后查看当前分支情况。
    1
    git branch
    我们可以看到,当前分支前面会标有一个*号,然后我们来修改main.cpp
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    using namespace std;
    int main () {
    cout<<"First modify"<<endl;
    cout<<"Dev branch modify"<<endl;
    cout<<"hello world"<<endl;
    return 0;
    }
    然后添加并提交
    1
    2
    git add main.cpp
    git commit -m "Dev branch modify"
    现在我们可以切换回master分支,将dev合并到master分支上:
    1
    2
    git checkout master
    git merge dev

    分支的删除

    删除dev分支
    1
    git branch -d dev
    目前就只剩下master唯一的一个分支了,切换分支还有一种方法就是git switch命令
    1
    2
    git branch dev
    git switch dev

    创建标签

    标签对于开发者来说非常实用
    1
    2
    git switch master
    git tag v1.0
    如果我现在需要给之前版本加标签呢?
    1
    2
    git log --pretty=oneline --abbrev-commit
    git tag v0.9 de7ada0
    显示标签信息
    1
    git show v1.0
    还可以加入带有说明的标签
    1
    git tag -a v0.1 -m  "First" b5691ef

    标签的操作

    如果需要删除标签
    1
    git tag -d v0.1
    如要推送某个标签的远程
    1
    git push origin v1.0
    一次性推送全部本地标签
    1
    git push origin --tags
    如果要远程标签,则应该先本地删除
    1
    git tag -d v0.9
    然后从远程删除
    1
    git push origin :refs/tags/v0.9
文章作者: Piller4F
文章链接: http://yoursite.com/2020/07/04/Git%E7%9A%84%E4%BD%BF%E7%94%A8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Piller4F