git 是开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。我们平时可能经常使用它,但是你真的了解 git 吗?先抛几个问题 git add 发生了什么?git 有哪些暂存区?git pull 与 git fetch 区别?git merge 与 git rebase 区别?git reset 与 get restore 区别?

虽然,我一直在用 git ,像上面这些问题,我就不知道,所以将它们总结下。原文在个人博客

什么是版本控制系统

开篇说了 git 是一个分布式的版本控制系统,那么什么是版本控制系统呢?可以参考 廖雪峰举的例子 Word 文档操作。

拿 Word 文档操作举例,当你想要 删除 某一段落的时候,又怕将来想要 恢复 找不到怎么办?你可能,会保存一个 副本。接着再修改,再保存一个 副本,这样一直持续,将会有好几个 副本。

过了一周,你想找到某一段,可能需要从这些 副本 中,一个一个查找,是不是很麻烦。

这还是你一个人写 Word 的情况,假如,你的同事和你一起编辑这个 Word,为了保证文档同步,你们之间可能需要不停的相互发送传递(通过 U盘,或者 qq 微信 等方式)。总之,很繁琐。

那假如说有这样一个软件,可以记录每次修改,而且还可以和多人共同编辑,是不是很方便。git 就是解决类似上面的问题,方便我们查看每次修改内容,以及同步别人的修改等。

基本操作

git clone

一般来说,通过 git 来进行远程操作的第一步,是通过此命令从远程主机上克隆一个版本库

git fecth

将某个远程主机的更新,全部取回本地

git pull

取回远程主机某个分支的更新,再与本地的指定分支合并

smartgit pull 按钮有个下拉选项,可以选择:

Merge fetched remote changes

Rebase local branch onto fetched changes

git add

添加文件。细分来说,应该是将工作区中的文件差异提交至暂存区。

相当于 smartgit 的 stage

git commit

提交文件。将暂存区中的修改,提交到本地分支。每次提交会产生一个 commit-id,并且会带上你的 username email 等信息。

git push

将本地分支的更新,推送到远程主机

git marge

合并分之,多条线

git rebase

合并某分支到当前分之,变基 衍合,一条线

git branch

创建分支

git branch -d 删除分支

git checkout

git checkout 切换分支

git checkout -b 创建 并 切换 分支。

git checkout -- 放弃更改。(不加 -- 也可以放弃更改)

相当于 smartgit 的 unstage

git reset HEAD

取消添加暂存区

git switch

切换分支,新版本提供的命令。

git switch -c 创建并切换

借一张图

工作区,暂存区,本地仓库,远程仓库

工作区就是我们 克隆 clone 一个项目,这个项目就是 工作区;当执行 git add 时,会将改动添加到某个地方,这个地方就是暂存区;本地仓库,由 .git 目录管理;远程仓库,就是拉取的地址。他们之间的关系如下面两张图所示:

HEAD

HEAD 是 git 内部的一个指针,指向当前版本。这个当前版本包含两个概念 分支 和 提交。 HEAD 负责指向哪条 分支,而 分支 指向某次具体 提交。

默认情况。

创建新分支。Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化。从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。

合并分支。首先切到 master ,然后 将 dev 合并到当前分支。就是直接把 master 指向 dev 的当前提交。git 很懒,这个提交方式 是因为 git 尝试采用 fast-forward (—ff) 这类合并不会创建新的提交。

如果 master 上没有修改,这个时候情况就是这样的。如果 master 上修改,将会采用 No-fast-foward (—no-ff),会创建一个 merge 提交。

删除分支。开发完分之后,可以视情况将其删除。删除dev分支就是把dev指针给删掉

动画演示 如下:

git pull 与 git fetch

git pull 与 git fetch 都可以从远程仓库中拉取最新代码。不同之处在于更新的方式不同。

git fetch

git fetch 方式,是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。最新的更新记录会保存在 .git/FETCH_HEAD 文件中。

git pull

git pull 则是将远程主机的最新内容拉下来后直接合并,这样可能会产生冲突,需要手动解决。git pull = git fetch +git merge。

注意,不一定是 git merge 也可以选择 git rebase,比如,我用的 smartgit:

git merge 与 git rebase

git merge 与 git rebase 都是用来合并分之的。不同之处,在于生成的 log 分叉线不同。

git merge 会把公共分支和你当前的commit 合并在一起,形成一个新的 commit 提交。

git rebase 会把你当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像你从公共分支又重新拉出来这个分支一样。

假设,你有如下分支记录,

假设在 master 分支上的新提交与你正在开发的 feature 相关。需要将新提交合并到你的 feature 分支中,你可以有两个选择:merge 或者 rebase。

git merge 方式

git checkout feature

git merge master

# 或者一条命令。前提是你得在 feature 分支上

git merge feature master

如上图所示,这会在 feature 分支中创建一个新的 merge commit,它将两个分支的历史联系在一起。

使用 merge 是很好的方式,因为它是一种 非破坏性的 操作。现有分支不会以任何方式被更改。这避免了 rebase 操作所产生的潜在缺陷。

缺点是会产生一个额外的提交。

git rebase 方式

git checkout feature

git rebase master

如上图所示,这会将整个 feature 分支移动到 master 分支的顶端,从而有效地整合了所有 master 分支上的提交。但是,与 merge 提交方式不同,rebase 通过为原始分支中的每个提交创建全新的 commits 来 重写 项目历史记录。

rebase 的主要好处是可以获得更清晰的项目历史。

git rebase 黄金法则

git rebase 的黄金法则是 永远不要在公共分支上使用它。

什么是 公共分支呢。我的理解是想 master dev test 这样的分之,或者说是有两个人以上使用的分支,就叫公共分支。

你 rebase master 分支到 feature 分支之上会发生什么:

git reset 与 get revert

git reset 与 get revert 都可用于版本回退,区别在于,一个可以硬重置,不保留记录;一个是覆盖式提交,保留记录。

先假设我们有这样的分支:

git reset

git reset 分为 软重置(git reset --soft ) 和 硬重置(git reset --head )。默认为 软重置,一般在回滚代码的时候,我们用的是 硬重置

git reset --hard

git push -f

git revert

git revert 还原,通过对特定的提交执行还原操作,我们会创建一个包含已还原修改的新提交

git 练习

发现一个很好的了解Git 基本概念和操作的工具,Git Online 。这个网站通过一个个任务让你了解 git,如果不想做题,可以直接加参数 NODEMO Git Online 沙盒模式,来在线验证。

如果,还想通过动图的方式,直观的了解 git 命令是如何工作了,可参考我转载的这篇文章 CS可视化:有用的Git命令

参考链接

git pull 是到工作区还是暂存区_我把git想简单了相关推荐

  1. git pull 是到工作区还是暂存区_每天一Git之简单理解工作区和暂存区

    每天一Git之简单理解工作区和暂存区 1. 工作区与暂存区命令初体验 1.1. 暂存区文件与文件夹管理 [root@number ~]# cd GitDir/git_learning/ [root@n ...

  2. Git使用汇总之工作区、暂存区、版本库

    前言 初次接触git的时候最让人迷惑的无非是这三者的概念和他们之间的关系,搞懂这三个概念和他们之间的关系,可以说你对git了解已经三分熟了. 下面这个图展示了工作区.版本库中的暂存区和版本库之间的关系 ...

  3. Git 的工作区、暂存区、版本库—— Git 学习笔记 15

    Git 的工作区.暂存区.版本库 大家都知道,在 Git 系统中有 "三棵树" 的概念. 注意:"树" 在这里的意思是 "文件集合",而不是 ...

  4. git 理解 节点、工作区、暂存区、版本库

    git树结构: git树结构每个节点都是一个commit的快照,它包含了三个重要概念:节点,HEAD指针,Branch指针 1.节点:git使用commit之后就会生成一个节点,之前的节点成为这个节点 ...

  5. git如何查看缓存区文件内容_详解Git工作区、暂存区、历史记录区以及git reset、git revert、git checkout等撤销命令的区别...

    一.可以将git简单的分为三个区域   1.工作区(working directory)    2.暂缓区(stage index)    3.历史记录区(history)    如图: 其中git ...

  6. git工作区、暂存区和仓库区

    git工作区.暂存区和仓库区 工作区 对于添加.修改.删除文件的操作,都发生在工作区中 暂存区 暂存区指将工作区中的操作完成小阶段的存储,是版本库的一部分 仓库区 仓库区表示个人开发的一个小阶段的完成 ...

  7. Git 工作区、暂存区和版本库

    基本概念 我们先来理解下Git 工作区.暂存区和版本库概念 工作区:就是你在电脑里能看到的目录 暂存区:英文叫stage, 或index.一般存放在 ".git目录下" 下的ind ...

  8. Git复习(九)之理解git工作区和暂存区

    前言 Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 版本库 在工作区目录中有一个.git文件,这个其实不是工作区而是Git的版本库 版本库中包含两个部分,一个是暂存区index/ ...

  9. Git之工作区和暂存区

    工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区 版本库(Repository) 工作区有一个隐藏目录.git,这个不算工作区,而 ...

最新文章

  1. 程序员必备基础:如何安全传输存储用户密码?
  2. matlab the installer cannot read,MATLAB安装 The installer cannot read the mwinstall.dll… | 学步园...
  3. 利用IDEA部署过的Tomcat开发Web Service
  4. FSNotes for Mac(强大的文本编辑器)
  5. mysql 创建索引 终止_技术分享 | 常见索引问题处理
  6. 【英语学习】【Daily English】U09 Fashion L01 Which one do you think suits me better?
  7. 如何避免 $_SERVER[PHP_SELF] 被利用?
  8. IE6之各种不适记录
  9. 日语学习软件推荐——五十音图APP:AI纠正你的日语发音
  10. word忘记密码怎么解除
  11. npm publish 报错 403
  12. 自学python教程免费python教程视频
  13. 网站pc端和手机端视频的处理
  14. 【TUN模式】对QQ或者微信域名、QQ邮箱、微信公众号文章、微信开发者社区相关的网站访问非常慢、图片加载不出来、网页空白的解决方案
  15. 拼多多item_get_app - 根据ID取商品详情原数据
  16. 成都百知教育:做Shopee店铺没有方向,这3大层级必须理清!
  17. HTML+js图片验证码编写
  18. StoryBoard 创建tabBarController
  19. java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to yo
  20. hdu 1114 完全背包

热门文章

  1. 运营商拥抱OpenStack背后:距运营级仍有差距
  2. 小实践之网络打印机的设置(实际操作篇)
  3. 积分风控体系建设包含的四个内容
  4. WordNet发展概况
  5. 使用laravel+Laravel-Roles-Permissions 开发后台权限管理
  6. Servlet之Cookie和Session
  7. 指针变量访问指向变量
  8. Witt向量简介 §3.2.2:Witt环运算封闭性验证
  9. HTML5+app开发学习之打包配置文件介绍篇
  10. 执行 npm install -g grunt-cli 安装grunt发生错误问题