Git从原理到实战

276 阅读8分钟

主要内容介绍

什么是Git?

git是分布式版本控制系统,支持多种协议如https,ssh,通过ssh支持的原生git协议速度快

Git与传统版本控制系统的比较

Git

  • git是用C语言开发的分布式版本控制系统,安全性高,不需要联网,没有中央服务器,有强大的分支管理,Git有点像异地多活.

CVS/SVN

  • CVS/SVN是集中式版本控制系统,pull/push必须要联网
  • 安全性不高,每次都需要连接网络
  • 如果服务器磁盘坏了就无法使用

Git安装

客户端Git安装

点击git-scm.com/download/ 下载与自己操作系统的版本即可,完成安装即可.

服务器端Git安装:

1.安装Git,执行下面命令:

yum install -y git

2.创建git用户

groupadd git  //创建用户组
adduser git  -g git //为Linux添加用户
passwd git; 修改密码

3.创建证书登录 把所有公钥导入到/home/git/.ssh/authorized_keys文件里 4.初始化git仓库 先选定一个目录作为Git仓库 假定/git/repo/ 在/repo目录下面输入命令:

git init --bare test-demo.git

5.修改仓库权限

chown -R git:git test.git

6.禁用shell登录 第二步创建的git账户不允许登录shell,可以通过/etf/passwd文件来完成

 git:x:505:507::/home/git:/bin/bash

修改为:

git:x:505:507::/home/git:/usr/bin/git-shell

7.克隆远程仓库

 git clone git@hostIp:/git/repo/test-demo.git

8.如何提交代码不需要密码

cd /home/git/
mkdir .ssh
touch .ssh/authorized_keys
cp ~/.ssh/id_rsa.pub  ./.ssh/    //将公钥拷贝到/home/git/.ssh目录下面
cat id_rsa.pub >> authorized_keys  //将公钥拷贝到authorized_keys文件中

最后将本地的id_rsa.pub写入authorized_keys文件中 至此已完成服务器搭建!

Git通用设置

当安装完Git以后,可以对全局进行设置,比如设置邮箱,用户名等信息

  • 查询目前git的全局配置
git config --list
  • 可以设置用户名和邮箱等信息
git config --global user.name "Jason0104" //设置用户名
git config --global user.email "Jason0104@163.com" //设置邮箱
  • 设置别名

git的命令很多,有的时候因为单词太长会敲错,所以可以通过设置别名来简化git命令的输入

下面为不同命令分别配置别名:

git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch

这个时候我们可以通过命令:

git s;//实际效果就是git status
git co;//git checkout
git br://git branch

配置Git的时候,加上--global是针对当前用户起作用的,如果不加只针对当前的仓库起作用 那么我们前面配置的文件都放到哪里了? 默认是放在当前用户主目录下的一个隐藏文件 ~/.gitconfig中

vim ~/.gitconfig可以看到配置的别名已经在.gitconfig中:

[user]
        name = Jason0104
        email = "Jason01042@163.com"

//中间内容省略
[alias]
        s = status
        co = checkout
        ci = commit
        br = branch

Git提交代码原理

我们把Git工作区域划分为三个部分:

  • Working Directory(工作目录)
  • Index(也叫Stage区 暂存区):当执行git add命令就会进入到暂存区
  • HEAD(.git Directory):当执行git commit就会到HEAD指向到最近的一次提交

下面我来简单描述一下代码提交的过程:

我们本地代码是在working directory,当本地修改完代码并完成测试要提交到远程仓库 执行git add fileName 这个时候进入stage 执行git commit -m "commit" 进入到HEAD

Git分支

Git分支Git非常重要的一个特性,Git创建一个分支很快,除了增加一个指针外,修改HEAD的指向,工作区的文件都没有任何变化 Git分支的创建 删除都是通过指针来完成的 下面我们来看一下具体分支操作命令:

从当前分支创建一个新分支dev

git checkout -b newFeature;

从当前分支切换到新分支

git checkout newFeature;

还原当前分支修改的文件

git checkout -- fileName;

查看本地有哪些分支

git branch

删除本地分支

git branch -d newFeature;

查看本地和包括远程所有的分支:

git branch -a;

修改远程分支的名称

git branch -m old_branchName new_branchName

Git命令介绍

  • 常用的操作命令
  • tag命令
  • 日志相关命令

常用的操作命令

初始化git仓库

git init

从远程仓库拉取代码:

git clone git@github/test.git

将本地项目与远程仓库关联

git remote add origin git@github/test.git

如果本地同时有两个远程仓库,想删除一个远程仓库: 1.通过远程命令查看远程仓库

git remote -v

得到下面两个远程仓库

origin  git@github.com:Jason0104/java-tech-tutorial-.git (fetch)
origin  git@github.com:Jason0104/java-tech-tutorial-.git (push)
gorigin  git@gitee.com:Jason0104/java-tech-tutorial-.git (fetch)
gorigin  git@gitee.com:Jason0104/java-tech-tutorial-.git (push)

2.删除其中一个远程仓库gorigin,可以通过下面的命令即可完成远程仓库的删除

git remote rm gorigin

3.还有一种方式可以修改

cd .git
vim config

修改该文件内容:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[remote "origin"]
        url = git@github.com:Jason0104/java-tech-tutorial-.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

获取所有远程分支

git fetch

查看远程仓库信息

git remote -v

将本地所有文件添加到Stage区

git add .  //当前目录的所有文件
git add *  //所有文件

把暂存区的内容提交到当前分支,这个命令执行完以后HEAD指针就会指向本次提交的commitId,但是不会同步到远程仓库

git commit -m "commit message"

提交到远程仓库

git push -u origin master;//第一次提交加参数-u
git push origin master; //将代码提交到远程仓库

从远程仓库拉取代码

git pull origin master

查看本地目录状态

git status

Git文件状态

当我们使用git status命令时,会看到几种类型的状态

  • Untracked:未添加到版本控制系统中
  • Unmodified:修改文件
  • Modified:已经修改过
  • unstage: 文件未提交到远程仓库
  • staged: 文件提交到远程仓库

比较两个分支的代码差异

git diff oldBranch newBranch

关于代码回退

通过前面的介绍我们都知道HEAD指向的是当前最新分支代码

我们在提交代码的时候都会看到一串"e475afc93c2",这个就是commitId commitId是用SHA进行加密的,用于区分每一次提交的唯一性

如果我们已经把代码提交了,但是又想回到上一次提交的代码的版本

git reset --hard e475afc93c2;//指定回退到某个一个版本,e475afc93c2为commitId
git reset --hard HEAD^;//回退到上一个版本

把暂存区的修改撤销掉,重新放回工作区

git reset HEAD fileName

另外一种可以通过

git reset --soft commitId;//指定退回到某个版本

很多时候我们有一个场景,当前分支是master,想从远程仓库拉取master与本地文件的修改有冲突 这个时候需要先把本地的内容修改隐藏掉

隐藏本地修改文件

git stash

当同步完远程仓库以后需要显示本地文件

git stash pop

如果要在master分支合并dev分支代码

git merge dev //Fast-forward 表示快进模式

tag命令

tag有点milestone的概念,当项目开发到一个版本的时候,需要记录里程杯,比如我开发项目到V1.0,开发V2.0的 时候会打一个tag,标签功能有点类似分支

查看所有标签

git tag

查看具体标签信息

git show v1.0

新建一个标签

git tag v1.0

添加指定标签信息

git tag -a v1.0 -m "add"

推送本地标签

git push origin v1.0

推送本地全部未推送的本地标签

git push origin --tags

删除标签

git tag -d v1.0

日志相关命令

关于日志可以很好的查看提交历史,以便确定回退到哪个版本

查看提交历史

git log

查看某个作者的提交历史

git log --author=Jason0104

美化日志格式

git log --pretty=oneline

以图形化显示日志

git log --graph

用于记录你的每一次命令

git reflog

想了解更多git log的使用可以通过下面命令了解

git log --help

很多时候我们会发现虽然添加了.gitignore文件但是还是没有生效,这是因为缓存导致,通过下面的命令来清除git缓存

git rm -r --cache .

客户端工具介绍

常用的Git客户端图形化工具很多: