git 练兵场 —— Local

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中。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 因为原文太长超出字数,Lesson 3 就放在另一篇文章里 How to Use Git and GitHub 标...
    赤乐君阅读 5,166评论 1 5
  • 输入 y ,创建 git_hug 目录No githug directory found, do you wish...
    风花花阅读 1,908评论 0 4
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 4,754评论 0 8
  • 以下笔记主要参考gitgot,大致了解git使用和原理。 第一部分我们从个人的视角去研究如何用好Git,并且揭示G...
    carolwhite阅读 2,347评论 0 1
  • 团子不仅有期盼家人团圆、团聚之意,也是我祝愿大家都团团圆圆,阖家欢乐。 乳名:团子囡囡 小名:元女 年龄:2月 身...
    静静有话说阅读 215评论 0 0