Git入门1

  • Git <==
    • 分布式版本管理系统 VS 集中式版本控制工具
    • Git命令
    • Git分支
    • Idea 集成Git
  • Github
    • push
    • pull
    • clone
    • SSH免密登录
    • Idea集成Github
  • Gitlab

Git

Git概述

  • Git:免费开源的分布版本控制系统。
  • 优点:占地面积小,性能极快,免费开源,有廉价的本地库、方便的暂存区以及分支。
  • 版本控制:记录文件内容变化,方便查阅特定版本修订情况。

集中式版本控制工具 VS 分布式版本控制系统

集中式版本控制系统

  • 集中化的版本控制系统:SVN\CVS。
  • 特点:
    • 有单一的集中控制服务器,保存所有文件修订版本。
    • 客户端连接到服务器,取出最新文件或者提交更新。
  • 缺点:
    • 如果中央服务器挂了,大家都没法工作。

分布式版本控制系统

  • 每台电脑都可以进行本地的版本控制,即使远程库挂了,只不过没法推送罢了。
  • 每个客户端保存的也都是完整的项目(包含历史记录,更加安全)
  • Git的历史吹水
    • Linus本人手动合并代码来更新Linux
    • 商业软件BitKeeper人道主义免费授权,但是要求不能被破解。
    • 05年有人破解了,收回使用权。Linus用C语言两周开发了Git。
    • 08年GitHub上线,jQuery、Ruby、PHP都将代码放到GitHub上开源

Git工作区域

工作区:代码存放的磁盘位置。-->git add 暂存区 -->git commit 本地库,存储历史版本。(生成版本后就删不掉了)-->git push 推送到远程库

代码托管重心--远程库

  • 局域网:gitlab
  • 互联网:GitHub、gitee

git常用命令

{% folding blue, Git常用命令 %}

  • 设置用户签名:
    • git config --global user.name 用户名
    • git config --global user.email 邮箱
  • 初始化本地库:git init
  • 查看本地库状态:git status
  • 添加到暂存区:git add 文件名
  • 提交到本地库:git commit -m "日志信息" 文件名
  • 查看历史记录:git reflog
  • 版本穿梭:git reset --hard 版本号

{% endfolding %}

设置用户签名

签名作用:区分不同操作者身份。在每个版本的提交者信息可以看到。
git首次安装必须设置一下用户签名。这里的用户前面和GitHub上没有关系。

初始化本地库

查看隐藏文件:ll -a

演示git status

未添加的提示信息:

On branch master
No commits yet
Untracked files: 未被追踪的文件,在工作区
  (use "git add <file>..." to include in what will be committed)
        cpp/
nothing added to commit but untracked files present (use "git add" to track) 

执行git add cpp/ 后: 添加到暂存区

On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

执行git commit -m "C++刷题第一版" /cpp后:提交到本地库

On branch master
nothing to commit, working tree clean

历史版本和版本穿梭

  • 查看版本信息:git reflog 查看版本信息、版本号、指针

  • 查看详细信息:git log 查看提交者和提交时间

  • 穿越版本,复制版本号后:git reset --hard 版本号

    • 这时候查看文件内容,就会发现内容发生变化。
  • git切换版本,底层其实是移动HEAD指针。

    • HEAD->MASTER->FIRST
    • 每次移动都是改动MASTER

Git分支

分支理解
使用分支:程序员将自己工作从主线上分离开来,开发自己分支的时候不会影响主线。
分支可以简单理解为副本,底层实际上是指针引用。

主线分支1.0 --》颜色分支改动后合并到主线 --》主线分支1.1
游戏分支经历4个版本后合并到主线 --》主线分支1.2

  • 分支好处:
    • 同时并行推进多个功能开发,提高开发效率。
    • 某个分支开发失败,对其它分支不会有影响。

{% folding blue, Git分支命令 %}

  • 创建分支
    • git branch 分支名
  • 查看分支
    • git branch -v
  • 切换分支
    • git checkout 分支名
  • 把指定分支合并到当前分支
    • git merge 分支名
    • 在master上执行merge hot-fix 就是把hot-fix融到master上
    • 正常合并:hot分支 基于master分支没改动 的基础上修改并merge。
    • 冲突合并:合并分支的时候,在同一个文件的同一个位置有两套完全不同的修改。git无法决定使用哪一个,必须人为决定新代码的内容。

{% endfolding %}

演示冲突合并

  • 冲突后merge时:
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
状态:
 (master|MERGING)
  • 修改文件,vim hello.txt 人工增删 并且删掉特殊符号
  • add到暂存区
  • commit,注意不能带文件名!因为有两个分支
  • 注意:只会修改master分支,不会修改hot-fix

移动分支的本质

master、hot-fix都是指向具体版本记录的指针。
当前所在的指针其实由HEAD决定,创建分支就是多创建一个指针。
切换分支的本质就是移动HEAD指针。