玩转Git(一)

一、Git综述

1、VCS出现前的状况

  1. 用目录拷贝区别不同版本
  2. 公共文件容易被覆盖
  3. 成员沟通成本很高,代码集成效率低下
image

2、集中式VCS(SVN)

  1. 有集中的版本管理服务器
  2. 具备文件版本管理和分支管理能力
  3. 集成效率有明显地提高
  4. 客户端必须时刻和服务器相连
image

3、分布式VCS(Git、Github、Gitlab)

  1. 服务端和客户端都有完整的版本库
  2. 脱离服务端、客户端照样可以管理版本
  3. 查看历史和版本比较等多数操作,都不需要访问服务器,比集中式VCS更能提高版本管理效率
分布式版本控制系统

4、Git的特点

  1. 最优的存储能力
  2. 非凡的性能
  3. 开源的
  4. 很容易做备份
  5. 支持离线操作
  6. 很容易定制工作流程

二、安装Git

1、Git官方文档地址:

https://git-scm.com/book/zh/v2

2、macOS 平台 Git 下载地址:

https://git-scm.com/download/mac

3、Windows 平台 Git 下载地址:

https://git-scm.com/download/win

4、Linux 平台 Git 下载地址:

https://git-scm.com/download/linux

5、检查安装结果

$ git --version ## 通过执行该命令,看git是否返回版本信息

三、使用Git之前需要做的最小配置

1、配置user信息

  1. 配置user.name和user.email
$ git config --global user.name 'your_name'
$ git config --global user.email 'your_email@domain.com'
  1. git config命令的三个作用域
    缺省等同于local
$ git config --local ## local只对某个仓库有效
$ git config --global ## global对当前用户所有仓库有效
$ git config --system ## system对系统所有登录的用户有效
  1. 查看config配置,加--list
$ git config --list
$ git config --list --global
$ git config --list --system
$ git config --list --local
  1. 清除config配置,加--unset
$ git config --unset --global user.name
$ git config --unset --system user.name
$ git config --unset --local user.name

local、global、system的优先级:
local>global>system

四、创建Git仓库、Git基本命令

1、两种方式

  1. 用Git之前,已经存在项目代码
$ cd 项目代码所在的文件夹
$ git init
  1. 用Git之前,还不存在项目代码
$ cd 某个文件夹
$ git init your_project_name ## 会在当前路径下创建与项目名同名的文件夹
$ cd your_project

2、向Git仓库中添加文件

$ git add file_name ## file_name表示你的文件的名字
$ git add file_name1 file_name2 file_name3 ## 添加多个文件
$ git add -u ## 添加全部文件
$ git add . ## 添加该目录下的全部文件

3、Git仓库中工作区、暂存区、版本历史的关系

image

4、在Git仓库中给文件重命名

  1. 麻烦的方式
$ mv old_file_name new_file_name ## 第一步,修改文件名
$ git add new_file_name ## 第二步,将修改后的文件,添加到Git中
$ git rm old_file_name ## 第三步,移除掉旧的文件
  1. 简单的方式
$ git mv old_file_name new_file_name ## 通过git mv命令,直接将文件名修改

5、查看Git仓库的日志

  1. 查看详细日志
$ git log
$ git log --graph ## 图形化显示
$ git log branch_name ## 查看branch_name分支的日志
  1. 查看简洁日志
$ git log --oneline
$ git log --oneline branch_name ## 查看branch_name分支的日志
$ git log --oneline --all
$ git log --oneline --graph
  1. 查看最近几次的日志
$ git log -n4 ## n4表示查看最近4次的日志
$ git log --oneline -n4

6、git cat-file命令

$ git cat-file -t hash_id ## 查看该hash_id属于什么类型
$ git cat-file -p hash_id ## 查看该hash_id下的内容

7、Git中核心对象commit、tree、blob的关系

image

8、Git的分离头指针

分离头指针的应用场景:如果临时想基于某个commit做变更,试试新方案是否可行,就可以采用分离头指针的方式。测试后发现新方案不成熟,直接reset回其他分支即可。省却了建、删分支的麻烦了。

当创建一个分离头指针的时候,在切换分支时,记得将分离头挂到一个分支上,不然基于分离头提交的commit容易丢失

$ git branch branch_name commit_id

9、HEAD和Branch的关系

HEAD可以指向Branch的最新一次的提交,也可以指向Branch的某次提交(分离头状态)

  1. 一个节点,可以包含多个子节点(checkout 出多个分支)
  2. 一个节点可以有多个父节点(多个分支合并)
  3. ~和都是父节点,区别是跟随数字时候,2 是第二个父节点,而~2是父节点的父节点
  4. ~和^可以组合使用,例如 HEAD~2^2
$ git checkout -b branch_name commit_id ## 基于commit_id所在的提交,新建一个分支

10、删除分支

$ git branch -d branch_name
$ git branch -D branch_name

使用-d 在删除前Git会判断在该分支上开发的功能是否被merge到其它分支。如果没有,不能删除。如果merge到其它分支,但之后又在其上做了开发,使用-d还是不能删除。-D会强制删除。

11、提交命令

$ git commit -m '' ## 将缓存区的内容提交

12、修改commit的message

$ git commit --amend ## 修改最近一次commit的message
$ git rebase -i commit_id ## 该commit_id是我们要修改的那个commit的父commit,或者说是我们要修改的那个commit的上一个commit的id

<b>注:修改commit的message只限于在没有push远程仓库之前,如果已经push到了远程仓库,那么禁止修改message</b>

13、将几个连续commit整理成一个commit

$ git rebase -i 开始commit [结束commit]

在执行这个命令时,
如果没有指定 结束commit,那么结束commit 默认为当前分支最新的 commit,那么rebase 结束后会自动更新当前分支指向的 commit,
如果指定了结束 commit,而且结束 commit不是当前分支最新的 commit,那么rebase 后会有生成一个 游离的 head,,而且当前分支指向的commit 不会更新

14、暂存区和HEAD所含文件的差异

$ git diff --cached

15、工作区和暂存区所含文件的差异

$ git diff

16、暂存区恢复成和HEAD一样

$ git reset HEAD  ## 恢复所有文件
$ git reset HEAD -- file_name1 file_name2 ## 恢复指定文件

17、工作区恢复成暂存区一样

$ git checkout
$ git checkout -- file_name

18、消除最近几次提交

$ git reset --hard commit_id

19、查看分支

$ git branch
$ git branch -a
$ git branch -v
$ git branch -av
$ git branch -vv

20、删除文件

$ git rm filename ## 删除工作区中的文件
$ git rm --f filename ## 强制删除工作区中的文件
$ git rm -r --f .  ## 删除工作区中的所有文件
$ git rm --cached filename ## 删除暂存区中的文件
$ git rm --cached . ## 删除暂存区中的所有文件

21.stash命令

  1. 将现在工作区的内容存进stash
$ git stash stash_name
  1. 将stash中的内容放回工作区
$ git stash apply  ## apply这种方式,即使将内容放回工作区后,也不会删除stash中的内容
$ git stash pop  ## pop这种方式,是将内容放回工作区后,同时也将stash中的内容删除

22.clone命令

  1. 克隆一个裸仓库(裸仓库对代码平台的意义很大)
    裸仓库就是只有.git 没有work、tree的仓库
$ git clone --bare path name ## path表示要克隆的仓库的路径,name表示克隆下来的新仓库的名字
  1. 克隆一个带工作空间的仓库
$ git clone url
  1. 仓库分为本地仓库、本地远程仓库和远程仓库
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容