美文网首页
git介绍及基础操作

git介绍及基础操作

作者: 尛尛大尹 | 来源:发表于2018-09-06 09:43 被阅读0次

    Git简介

    Git[/gIt/]:一个基于C语言开发的开源分布式版本管理系统

    举个例子:一个程序每次修改都要保存原来的版本,时间一长修改次数多了,就会记不清楚每次修改了什么,而且往往一个项目会有多个人修改,这样人为管理起来就会很混乱,这时候就可以用Git来记录每次修改。

    Git、GitHub和Gitlab区别

    • Git是版本控制管理系统。可以在电脑不联网的情况下,在本地使用的版本管理工具。
    • GitHub是在线基于Git代码的托管服务,相当于一个网站。GitHub可以创建免费的代码仓库(repo),如果需要创建私有的代码仓库,则需要用付费账户。
    • Gitlab和Gitlab相似,可以免费创建私人代码仓库。但是GitHub界面非常美观。

    Git和GitHub共同使用来托管自己的代码和笔记,可以在任何有网络的地方拷贝下来自己的代码继续使用

    分布式vs集中式

    • 集中式版本控制系统:代表CVSSVN
      1.必须联网才能工作
      2.版本库集中存放在中央服务器,工作是需要先从中央服务器获取最新的版本,之后再进行工作,工作之后再提交到中央服务器
      3.中央服务器如果损坏则所有人不能工作

    • 分布式版本控制系统
      1.可以在不联网的环境下工作
      2.每个人的电脑都有一个完整的版本库,一个人的版本库坏了再从其他的复制一个即可,安全性比较高
      3.具有强大的分支功能,本地分支功能支持开发者在不同任务之间进行快速切换

    Linux安装Git

    目前,Git可以再Linux,UNIX,Mac,Windows上面运行
    官方网站http://git-scm.com

    • 查看是否安装Git
    > git 如果没有安装Git系统会给与提示
    
    • yum安装
    > yum install git-core
    
    • 源码编译安装
    1.Git官网下载所需要的源码包
    wget http://mirrors.edge.kernel.org/pub/software/scm/git/..
    2.编译安装,依次执行下列命令
    tar -zxf git-*.tar.gz
    cd git-*.tar.gz
    ./config
    make&make install
    

    版本库(repository)

    • 创建版本库,即创建一个新的空目录
    > mkdir first-repo 任意一个可以创建文件的目录
    > pwd 查看目录所在的路径
    /root/app/first-repo
    
    • 初始化仓库,用git init命令把目录变成Git可以管理的仓库
    > cd /root/app/first-repo
    > git init
    > ls -a
    你会发现有一个`.git`目录,这个就是Git用来跟踪管理版本库的,不要随意修改这个目录下的文件,会破坏仓库
    
    > tree .git
         config ------git仓库的配置文件
         objects ------所有被追踪的对象
         refs ------放置状态信息
    
    • git config这个命令可以配置版本库
      git config -e:会打开项目的配置文件(作用域最小,只针对当前项目有效)
      --global全局,配置的文件针对当前用户
      --system系统,配置文件针对了所有用户(作用域最大)

    优先级:(如果三个文件同时配置了某个参数)
    git config > git config --global > git config --system
    作用域越广优先级越低

    > git config --global user.name <username> 配置全局用户名
    > git config --system user.email <email>  配置系统Email
    > git config --list 或者-l查看配置了哪些项目
    > git config (--global/--system) --unset <> 取消某个配置项
    

    eg:

    > git config --list
    user.name=ymd
    user.email=1464525869@qq.com
    core.repositoryformatversion=0
    core.filemode=true
    core.bare=false
    core.logallrefupdates=true
    merge.comflictstyle=diff3
    > git config --unset merge.comflictstyle
    
    • 一次简单的提交
    > touch file1 创建一个新的文件
    > git add file1 没有任何显示则成功,文件添加至暂存区
    > git commit -m "commit file1 " 文件提交至仓库 
                   -m后面添加本次提交的说明,最好是有意义的
    
    1.jpg

    [图片上传中...(3.jpg-7b61eb-1536198146557-0)]

    • Git分为了:
        工作区:Working Directory
        暂存区:Staging Area
        版本库:repository
    

    工作区:就是我们自己创建的或者自己电脑上可以看到的就是工作区,比如上面创建的first-repo文件夹就是一个工作目录

    版本库,就是我们说的仓库(repo)。工作区下面的隐藏文件.git就是Git版本库,Git可以管理这个目录里的所有文件,每一个文件的添加,修改,删除都可以被跟踪,可以在需要的时候还原到任何历史的时刻。
    Git版本库里存储了stage(暂存区),还有Git为我们自动创建的第一个分支master,以及指向master的指针HEAD

    • .gitignore文件
      我们可以创建一个名为.gitignore文件,列出要忽略的文件模式
    > cat .gitignore
    *.[oa]忽略以.o或者.a结尾的文件
    *~ 忽略以~结尾的文件
    

    Git版本管理基础操作

    提交分为了两个步骤:
    1.git add <file1 file2...>:将工作区中相关修改的内容那个提交到暂存区,暂存区就相当于缓存区,可以后期更改里面的内容
    2.git commit -m <message>:将暂存区的内容一次性提交到版本库

    • git status查看当前工作区发生的修改,以及已经被提交到暂存区的修改
      输出结果可以分为三段:
    被提交的修改(changes to be committed):列出将在下次提交中被
                                       纳入版本库中的、被修改的文件
    不会被更新的修改(changed but not updated):列出已经被修改,
                                    但是还没有提交到暂存区中的文件
    未被跟踪的文件(untracked files):列出所有的新增文件
    

    --short选项使得输出更加紧凑

    • git diff比较提交、索引及工作目录
      --color:
      不加参数的 git diff:
    此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也
    就是修改之后还没有暂存起来的变化内容.
    

    git diff --cached 命令:

    已经暂存起来的文件和上次提交时的快照之间的差异,
    show diff of staged changes.
    (Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相
    同的).
    

    git diff HEAD命令:

    比较 woking directory 和上次提交之间所有的改动.
    

    git diff [version tag]命令:

    想看自从某个版本之后都改动了什么
    跟 log 命令一样,diff 也可以加上--stat 参数来简化输出.
    

    git diff [branchA] [branchB]命令:

    它实际上会返回一个由 A 到 B 的 patch,不是我们想要的结果.
    

    git diff [branchA]…[branchB]命令:

    一般我们想要的结果是两个分支分开以后各自的改动都是什么
    实际上它是:git diff $(git merge-base [branchA] [branchB]) 
    [branchB]的结果.
    
    • git log查看提交记录,显示从近到远的提交日志
    [option]:
    \-n   部分输出
    \--oneline 显示概述信息
    \--stat 先是被修改的文件
    \--dirstat 显示包含被修改文件的目录
    \--shortstat 显示项目中有多少文件被修改,新增,删除了多少文件
    \--graph 图形化显示一脚之间的关系
    
    eg:
    > git log -n 3 显示最后三次提交
    > git log --oneline 
    > git log --shortstat --oneline
    > git log --format=fuller 显示更多详细信息
    > git log --graph
    
    • 散列值
      上面我们用git log可以看到每个commit都有一串数字,这就是commit id,又叫做散列值。
      commit id是用SHA1计算出来的一个数值,用十六进制表示。
    commit 9a77f4a693087681ca1845c3eec548f6366c0f91
    Author: ymd <1464525869@qq.com>
    Date:   Tue Aug 14 17:50:22 2018 +0800
    

    git fsck查看版本库的完整性

    • git reset 版本回退
      Git里面有一个HEAD指针,HEAD指针指向master,master指向提交。当我们回退版本时,其实是改变了指针的指向,所以Git版本回退比较快
      Git里面用HEAD表示当前版本,HEAD^表示上一个版本
      HEAD^^表示上上一个版本,数值太大就可以写成HEAD~n,比如HEAD~100
      3.jpg

    如上图所示,third commit是最新一次提交

    eg:回退到上一个版本,即second commit、
    # git reset --hard HEAD^
    回退后再用git log查看,你会发现最新一次提交third commit已经看不
    到了,但是如果我们后悔回退了怎么办?
    如果我们窗口没有没有关掉还可以找到最新提交的commit id,就可
    以回到原third commit版本,可以只取前面的一些数值,只要能够唯一指定即可
    eg:最新一次提交的commit id为9a77f4a693087681ca1845c3eec548f6366c0f91
    # git reset --hard 9a77f 这样就退到原来那个未来的版本了
    (相对于此时的版本second commit,third commit就是未来版本)
    

    HEAD指向的是哪个版本号,当前版本就定位在哪里,同时将工作取得内容恢复到那个版本,所以如果不小心关掉了窗口,查不到未来那个版本commit id,也有办法恢复
    git reflog:记录了每一次命令,以确定要回到未来的版本。

    • 撤销修改
      git checkout -- <file>:如果你在工作区改动了某些文件但是又想要撤销修改,只是针对于特定的文件,则可以用这个命令。--必须要加上,否则就是切换分支
      git reset HEAD <file>:撤销暂存区的文件,放回工作区。HEAD表示最新版本
      如果commit之后只能够撤回原来的版本了
    • 删除文件
      工作区的文件删掉之后,工作区和版本库不一样了,git status就会知道删除了哪些文件
      这时候我们就有两种选择:
      1.彻底删除文件,git rm从版本库中删除该文件,并且用git commit提交
      2.误删了文件想要恢复,git checkout -- <file>
      注意:恢复文件时,只能恢复版本库最新一次提交的结果
      所以,删除之前我们可以预览:
    >  git rm -r -n --cached 文件/文件夹名称
    加上-n,执行命令时,不会删除任何文件,而是展示此命令要删除的文件列表预览
    
    • 储藏
      如果有一个紧急需要处理的问题,当前修改的文件又不想提交,可以用stash命令将这些修改保存在本地,等以后再处理
      stash命令将工作区和暂存区的修改保存在叫做储藏栈(stash)的缓存区
    > git stash 将修改存储到储藏栈
    

    git stash list查看当前栈中储藏了哪些修改内容

    > git stash list
    stash@{0}: WIP on master: 62e3b2c test
    stash@{1}: WIP on master: 62e3b2c test
    stash@{2}: WIP on master: 6a00470 change file2 tiwce in the original
    

    stash pop恢复被储藏的修改

    1.恢复位于栈顶的被储藏修改
    > git stash pop
    2.恢复更早之前的更改
    > git stash pop stash@{2}
    
    • .gitigore忽略非版本控制文件
      一般情况下,对于那些自动生成的文件、由编辑器创建的或者临时备份的文件我们希望git能够忽略,就可以手动创建这个.gitigore文件夹。我们在文件中指定文件的目录和路径,并且可以使用“*”和“$”通配符

    相关文章

      网友评论

          本文标题:git介绍及基础操作

          本文链接:https://www.haomeiwen.com/subject/caczwftx.html