美文网首页
git 基础 学习下

git 基础 学习下

作者: 步履不停的Suunny | 来源:发表于2018-08-03 17:07 被阅读0次

    虽然用git 很久,但是仅仅是常用的命令记得清楚,其他的命令不常用也渐渐忘了。 今天开始整理一下。

    关于版本控制

    版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

    git 由Linux开源社区创建。

    git特点

    也是初期设定的目标:

    • 速度
    • 简单的设计
    • 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
    • 完全分布式
    • 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

    自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统(参见 Git 分支)。

    git基础

    直接记录快照,而非差异比较

    Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。

    image.png

    Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流。

    image.png

    关于快照,英文中的描述:
    Every time you commit, or save the state of your project in Git, it basically takes a picture of what all your files look like at that moment and stores a reference to that snapshot.
    翻译过来理解:
    每次你提交或者要在git中保存项目的状态时,git仅仅是制作快照(像拍照一样记录所有文件在那个时刻的样子),并保存指向这个快照的引用

    注意快照的描述:

    takes a picture of what all your files look like at that moment

    在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。

    本地磁盘有完整的项目历史,没有网络时,几乎可以进行任何操作,而且速度非常快 。

    Git 保证完整性

    Git 中所有数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。若你在传送过程中丢失信息或损坏文件,Git 就能发现。
    Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希),这是一个由 40 个十六进制字符(0-9 和 a-f)组成字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:

    24b9da6552252987aa493b52f8696cd6d3b00373

    Git 一般只添加数据

    你执行的 Git 操作,几乎只往 Git 数据库中增加数据,很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。未提交更新时有可能丢失或弄乱修改的内容;但是一旦你提交快照到 Git 中,就难以再丢失数据

    三种状态

    Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。

    基本的 Git 工作流程如下:

    • 在工作目录中修改文件。 --已修改状态
    • 暂存文件,将文件的快照放入暂存区域。 --已暂存
    • 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。 --已提交

    安装git

    linux:
    $ sudo apt-get install git

    参考git安装文档

    初次运行 Git 前的配置

    Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

    1. /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
    
    2. ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。
    
    3. 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。
    

    每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量

    当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。

    git config --global user.name "John Doe" git config --global user.email johndoe@example.com

    文本编辑器

    Git 会使用操作系统默认的文本编辑器,通常是 Vim

    检查配置信息

    $ git config --list
    core.symlinks=false
    core.autocrlf=true
    core.fscache=true
    color.diff=auto
    color.status=auto
    ....
    

    查看用户名:

    $ git config user.name
    yuqingfang
    

    获取帮助

    若你使用 Git 时需要获取帮助,有三种方法可以找到 Git 命令的使用手册:

    $ git help <verb>
    $ git <verb> --help
    $ man git-<verb>
    

    例如,要想获得 config 命令的手册,执行

    $ git help config
    

    最基本的知识

    获取 Git 仓库

    在现有目录中初始化仓库

    $git init
    

    克隆现有的仓库

    $ git clone https://github.com/libgit2/libgit2
    
    $ git clone https://github.com/libgit2/libgit2 mylibgit
    这将执行与上一个命令相同的操作,不过在本地创建的仓库名字变为 mylibgit。
    

    检查当前文件状态

    无修改 无提交

    $ git status
    On branch master
    nothing to commit, working directory clean
    

    已修改 未提交

    $ echo 'My Project' > README
    $ git status
    On branch master
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
        README
    
    nothing added to commit but untracked files present (use "git add" to track)
    

    执行git add

    $ git add README
    此时再运行 git status 命令,会看到 README 文件已被跟踪,并处于暂存状态:
    
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        new file:   README
    

    git add 后再修改

    暂存已修改文件
    现在我们来修改一个已被跟踪的文件。 如果你修改了一个名为 CONTRIBUTING.md 的已被跟踪的文件,然后运行 git status 命令,会看到下面内容:
    
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        new file:   README
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   CONTRIBUTING.md
    

    再git add

    $ git add CONTRIBUTING.md
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        new file:   README
        modified:   CONTRIBUTING.md
    

    ... 可以继续尝试

    查看修改

    $ git diff
    

    提交更新

    $git commit -m " "
    


    参考连接

    移除文件

    仅仅从工作目录中删除文件

    $ rm PROJECTS.md
    $ git status  
    On branch master
    Your branch is up-to-date with 'origin/master'.
    Changes not staged for commit:
     (use "git add/rm <file>..." to update what will be committed)
     (use "git checkout -- <file>..." to discard changes in working directory)
    
        deleted:    PROJECTS.md
    
    no changes added to commit (use "git add" and/or "git commit -a")
    

    然后再运行 git rm 记录此次移除文件的操作,下一次提交时,该文件就不再纳入版本管理了:

    $ git rm PROJECTS.md
    rm 'PROJECTS.md'
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        deleted:    PROJECTS.md
    

    另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中,使用 --cached 选项。 如不小心把日子提交到git仓库:

    $ git rm --cached README
    

    查看提交历史

    $git log
    commit ca82a6dff817ec66f44342007202690a93763949
    Author: Scott Chacon <schacon@gee-mail.com>
    Date:   Mon Mar 17 21:52:11 2008 -0700
    
        changed the version number
    

    一个常用的选项是 -p,用来显示每次提交的内容差异。 你也可以加上 -2 来仅显示最近两次提交:

    $ git log -p -2
    

    如果你想看到每次提交的简略的统计信息,你可以使用 --stat 选项:

    $ git log --stat
    

    git 撤销操作

    在任何一个阶段,你都有可能想要撤消某些操作

    取消暂存的文件

    使用 git reset HEAD <file>... 来取消暂存

    $ git add *
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        renamed:    README.md -> README
        modified:   CONTRIBUTING.md
    

    下面使用git reset HEAD <file> 来取消暂存

     $ git reset HEAD CONTRIBUTING.md
    Unstaged changes after reset:
    M   CONTRIBUTING.md
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        renamed:    README.md -> README
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   CONTRIBUTING.md
    
    撤消对文件的修改
    $git checkout -- [file]
    

    需要知道 git checkout -- [file] 是一个危险的命令,对那个文件做的任何修改都会消失 ,你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要那个文件了,否则不要使用这个命令。

    git 打标签

    列出标签
    $git tag
    
    创建标签

    最简单的方式是当你在运行 tag 命令时指定 -a 选项,-m 添加标签信息

    $git tag -a v1.4 -m 'my version 1.4'
    $ git tag
    v0.1
    v1.3
    v1.4   <—— 已添加
    

    通过使用 git show 命令可以看到标签信息与对应的提交信息

    $ git show v1.4
    
    共享标签, 推送标签到仓库

    运行 git push origin [tagname]。

     $ git push origin v1.5
    

    如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令:

    $ git push origin --tags
    
    检出标签

    可以使用 git checkout -b [branchname] [tagname] 在特定的标签上创建一个新分支:

      $ git checkout -b version2 v2.0.0
    

    相关文章

      网友评论

          本文标题:git 基础 学习下

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