美文网首页
git 练兵场 —— Local

git 练兵场 —— Local

作者: 慧鑫coming | 来源:发表于2019-05-28 18:30 被阅读0次

    Author: huixincoming
    Email:huixincoming@163.com
    Vendor Recommend:vx luckymengling

    很久没发文了,都配不上日更达人这个勋章了:-D,之前就是为了这个勋章坚持了一个月,现在是擦亮勋章的时候了!

    git vs svn

    git比svn好的3个点,快,分布式,有完整的历史

    gitconfig global配置,使用前配置

    • git config --global user.name 'huixin'
    • git config --global user.emal 'huixincoming@163.com'
    • cat ~/.gitconfig
    ...
    [user]
      name = huixin
      email = huixincoming@163.com
    ...
    

    初始化代码仓库本地

    • git init testgit,或者先创建testgit,在进入testgit,执行git init
    • cd testgit && find .git
      branches: repository分支的情况
      config: 是一个local config,对于每个repository来讲都有个本地的config,如果在local config配置user和email那么当前repository会使用local config
      description: 描述文件
      HEAD: 指针
      hooks: 是event hooks,我们可以写一些脚本,让它在commit之前先运行这些脚本,pre-commit、pre-push等等,是shell脚本,编辑pre-commit,在运行git commit时,会先运行pre-commit脚本
      objects: 描述存储的文件对象
      ref: 描述引用信息
      所有对repository的变更,都会通过.git下的文件做一个记录

    添加文件检查状态

    • git add filename ..., 将本地变化存储到index,也可以添加多个文件名字,或者用*添加所有变化,但不包括隐藏文件
    • git status 检查状态
    • find .git
        发现比之前多了index,repository的变化保存到了index(这是git比svn快的原因);提交版本的时候只会把这个变化提交上去
      objects 文件夹下也会比之前多了东西,最终所有代码仓库里的文件都是通过objects做存储的,它要标识出有哪些文件。

    commit将变化提交到版本管理系统

    • git commit -m 'balabala' 说明本次提交,也可以 git commit 进入文件进行编辑
      输出说明:
      第一行
      1 master,提交是在哪个分支,默认是master分支
      2 root-commit, 本次提交是在哪一次提交的基础上提交的,因为是初次提交,所以是root-commit
      3 哈希值,本次提交代号,一个唯一标识
      4 本次提交的描述
      第二行
      文件变化总览
      第三行
      操作简要
    • git log 查看提交历史
    • 配置local .git/config,这样再次提交就会使用本repository的config配置
      [user]
        name = XXX
        email = xxx@xxx.com

    ignoring files

    代码的产物不应放在源码管理系统里面(repository)

    1. vim .git/info/exclude 可将不想包含到源码的文件写到里面,可以使用通配符(*代表所有,但不包含隐藏文件;*.py[cod]意思是不包含*.pyc,*.pyd,*.pyo)。存在问题会有多人合作同时开发项目,这个设置只在本地生效,无法共享
    2. vim .gitignore 本身是源代码仓库的文件,对任何开发者都生效;git add \* 不会添加 . 开头的文件 , git add . 会添加当前路径下所有变更的文件
    3. 对已经add的文件添加到 .gitignore,可通过 git rm --cached filename,将添加进本地仓库的文件remove

    撤销提交命令

    • git reset --hard HEAD~ 回退到上一个版本, 不保留本地修改
    • git reset --soft HEAD~ 回退到上一个版本,但是保留本次提交的本地修改,相当于撤销了上一次git commit,保留了上一次git add,这个回退给你重新修改commit的机会
    • git reset HEAD~ 回退到上一个版本,保留本次提交的本地修改,但是没有add进本地库,相当于上一次的git commit, git add 都被撤销,此时可以git diff查看修改。
      如果想与上一次commit的描述相同的话,快捷的方式 可以在commit的时候的使用 git commit -c ORIG_HEAD(只有使用了reset后才会有ORIG_HEAD),会直接把之前那次head的commit message带过来
    • git commit --amend 向上一次的提交添加遗漏,相当于将遗漏文件 append到上一次commit
      先执行 git add 将想要append的文件提交到本地repository
      然后执行 git commit --amend 将遗漏添加到上一次commit,同时也可以修改上一次的描述

    Local Repository,Staging Area and Working Directory

    • LocalRepository:代码提交(commit)到本地仓库形成的历史
    • WorkingDirectory:工作目录,本地通过文件浏览能够看到的所有东西
    • StagingArea:当我们要在WorkingDirectory做一些改变的时候,会与LocalRepository有一些不同,我们想把这些不同提交到LocalRepository形成一次新的commit的时候,我们如何决定哪些内容想通过git commit 提交,我们需要把想要提交的内容通过git add命令添加到StagingArea里面,当我们运行git commit命令的时候只会把我们添加到StagingArea中的不同(diff),commit到LocalRepository里面。
    • 通过git log会看到历史的提交,
    • git log --oneline只会看到每次提交的哈希值,以及这次提交commit的message,方便我们查找<commit-id>

    撤销命令详述

    git reset
    • 如图,当我们把LocalRepository的指针指到第一次提交之后,我们之前的2次提交怎么处理?
        可以通过git reset命令行的一些参数,实现对这2次提交的不同处理
    • git reset <commit-id>, 回滚到指定的那次提交,保存了修改的文件,但撤销了指定commit-id前的所有git add和git commit。即将LocalRepository的指针指导了第一次提交,然后将后2次提交的内容保存到了WorkDirectory,并没有加入到StagingArea。此时可以使用diff,也可以进行二次修改。
    • git reset <commit-id>~2,回滚到指定提交,再往前数2次的那次提交
    • 配合git log --online可以方便到查找历史版本
    • git reset --mixed <commit-id | reference>,和git reset <commit sha1|reference> 一样的。是保守的、安全的回滚。会将指定版本后所有的提交都保存到WorkingDirectory。给我们第二次修改的机会。推荐
    • git reset --hard <commit-id | reference>,激进的回滚。回滚到指定版本,并将指定版本后所有的提交都drop掉。在本地的WorkingDirectory中也看不见了。不推荐
    • git reset --soft <commit-id| reference>,介于 hard 和 mixed 之间的回滚。会将指定版本后所有的提交都保存到WorkingDirectory并加入到StagingArea中。

    相关文章

      网友评论

          本文标题:git 练兵场 —— Local

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