git学习笔记系列

  • 关于安装

Windows下安装git,使用时如果别人提交的代码时unix style,尽量安装时选择 git学习笔记系列原因就是左图中写的内容,如果忘记直接默认下一步了,那么惨了,你拉下来的代码运行时将报非常非常多的eslint错误,集中在LF被转换成了CRLF(Windows的换行方式),

CRLF->Windows-style
LF->Unix Style
CR->Mac Style

  • 是什么?

什么是版本控制?我为什么要关心它呢?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。在本书所展示的例子中,我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任何类型的文件进行版本控制。

  • 特点?

Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。

在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。用 Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程仓库。

时刻保持数据完整性:

在保存到 Git 之前,所有数据都要使用 SHA-1 算法进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。Git 的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。

  • 文件的三种状态?

已修改(modified)表示修改了某个文件,但还没有提交保存;

已暂存(staged)表示把已修改的文件放在下次提交时要保存的清单中。

已提交(committed)表示该文件已经被安全地保存在本地数据库中了;

git学习笔记系列

每个项目都有一个 Git 目录(译注:如果 git clone 出来的话,就是其中 .git 的目录;如果 git clone --bare 的话,新建的目录本身就是 Git 目录。),它是 Git 用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。

  • 工作流程?
  1. 在工作目录中修改某些文件。
  2. 对修改后的文件进行快照,然后保存到暂存区域。
  3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。
  • 常用指令?

高频:①git clone xx.git  ?alias表示从仓库拉取代码到本地,一般就自动生成xx目录,如果写了alias 名字,那么目录名字就是alias

检查当前文件状态 git status / git diff(是显示还没有暂存起来的改动,而不是这次工作和上次提交之间的差异。)

跟踪新文件 git add

暂存已经修改的文件 git add

忽略那些不需要纳入git的管理 

高频:git commit 提交更新

注意点:

每次准备提交前,先用 git status 看下,是不是都已暂存起来了,然后再运行提交命令 git commit

或者简单粗暴:只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤

移除文件:git rm

移动文件:git mv

查看提交历史:(常用:)①后->git log 将会看到什么时间什么author提交了修改(git log后可以追加参数做详细的提交记录查看)

撤销操作:

修改最后一次提交 git commit --amend

取消已经暂存的文件  git reset HEAD xxx 

取消对文件的修改 建议不要用

远程仓库的使用:(待完善)

打标签:(待完善)

技巧和窍门:(待完善)

  • 什么是git分支?

乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。正是因为它,将 Git 从版本控制系统家族里区分出来。Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快。

在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。git学习笔记系列

  • 分支指令:

查看所有分支 git branch ,然后会显示出分支清单,*表示当前所在分支

建立了一个新的分支 git branch testing

Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。它是一个指向你正在工作中的本地分支的指针(译注:将 HEAD 想象为当前分支的别名。)。运行 git branch 命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去,所以在这个例子中,我们依然还在 master 分支里工作。

git学习笔记系列

切换其他分支:git checkout testing 此时

git学习笔记系列

新建并切换到新建指针:git checkout -b iss53相当于$ git branch iss53

                                                                          $ git checkout iss53

合并分支  git checkout master(回到master分支)

                   git merge hotfix(和hotfix合并)

删除分支  git branch -d hotfix

远程分支:远程分支(remote branch)是对远程仓库中的分支的索引。它们是一些无法移动的本地分支;只有在 Git 进行网络交互时才会更新。远程分支就像是书签,提醒着你上次连接远程仓库时上面各分支的位置。

注意:一次 Git 克隆会建立你自己的本地分支 master 和远程分支 origin/master,并且将它们都指向 origin 上的 master 分支。

具体内容:

建立好仓库后如何将自己的仓库和远程仓库相连并且上传代码:

git提交到远程仓库github上时,出现 “failed to push some refs to”解决方案!!

References:

CRLF和 LF的区别及转换 (整理)

git