git 练兵场 —— Local

Author: huixincoming
Email:[email protected]
Vendor Recommend:vx luckymengling

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

git vs svn

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

gitconfig global配置,使用前配置

  • git config --global user.name 'huixin'
  • git config --global user.emal '[email protected]'
  • cat ~/.gitconfig
...
[user]
  name = huixin
  email = [email protected]
...

初始化代码仓库本地

  • 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 = [email protected]

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,方便我们查找

撤销命令详述

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

你可能感兴趣的:(git 练兵场 —— Local)