zhk2369 发表于 2018-9-17 06:10:09

一个很流行的版本控制系统Git学习笔记

  什么是Git  
  Git是一种非常流行的分布式版本控制系统,它和其他版本控制系统的主要差别在于Git只关心文件数据的整体是否发生变化,而大多数版本其他系统只关心文件内容的具体差异,这类系统(CVS,Subversion,Perforce,Bazaar 等等)
  每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容
  Git另一个比较好的地方在于绝大多数操作都可以在本地执行,而每个本地都可以从服务器获取一份完整的仓库代码
  而且在没网时仍然可以修改和使用大部分命令,在方便时再跟服务器进行同步,这样可以更好的实现多人联合编程
  另外个人感觉Git系统的强大在于它创建了一个个类似于快照的东西
  记忆我们每一次的提交并且可以在未来的任何时候回到这里,对于大型项目的管理非常有效
  最原始的版本控制是纯手工的版本控制:修改文件,保存文件副本。有时候偷懒省事,保存副本时命名比较随意
  时间长了就不知道哪个是新的,哪个是老的了,即使知道新旧,可能也不知道每个版本是什么内容
  相对上一版作了什么修改了,当几个版本过去后,很可能就是下面这个老土的样子了:

  
  Git特点
  分布式相比于集中式的最大区别在于开发者可以提交到本地
  每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库
  直接记录快照,而非差异比较 : Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中
  近乎所有操作都是本地执行 :在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网
  时刻保持数据完整性 :在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算
  并将此结果作为数据的唯一标识和索引
  多数操作仅添加数据 :常用的 Git 操作大多仅仅是把数据添加到数据库
  开发流程示意图:

  1、基本概念
  Stage:暂存区,缓存区
  Repository:仓库(本地仓库).git目录
  Remote:远程仓库
  Track: 将一个新文件加入到git
  Unstage:取消放入暂存区
  Git存储原理
  Git 保存的不是文件差异或者变化量,而只是一系列文件快照。
  快照管理:(微型文件系统,文件指纹验证是否变化,不便的直接链接)

  三种区域

  所有数据存放在本地.git目录,可以直接拷贝。
  2、基本操作
  
  2.1、仓库创建
  Git init
  2.2、仓库复制
  Git cloneurl
  只会复制master下来
  Git cloneurl dir
  指定文件夹
  git clone https://github.com/libgit2/libgit2 mylibgit
  2.3、文件管理
  2.3.1、添加文件到暂存区
  Git add *
  Git add file
  Git add dir
  2.3.2、删除文件到暂存区
  Git rm
  2.3.3、修改文件名(移动)到暂存区
  Git mv
  2.3.4、提交暂存区到仓库
  Git commit –m “注释”

  2.3.5、撤销修改文件
  修改的文件可以在git status观察到
  如果撤销修改
  可以采用git checkout -- file的方式撤销
  撤销所有
  git checkout-- *
  2.3.6      撤销暂存区数据
  
  
  2.4、分支管理
  查看分支:git branch
  创建分支:git branch
  切换分支:git checkout
  创建+切换分支:git checkout -b
  合并某分支到当前分支:git merge
  默认使用fast-forward模式

  可以禁用,合并时会生成一个新的commit
  git merge --no-ff -m "merge " dev
  删除分支:git branch -d

  远程分支下载:git checkout -borigin/
  合并冲突:
  当merge出现冲突的时候,git会提醒

  需要手动修改后进行提交
  Git add
  Git commit
  2.5、版本管理
  每个提交都是一个版本,git提供了一些方便的命令供我们使用。
  2.5.1、查看日志
  Git log
  当前分支的commit历史
  有用的配置
  log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%Creset' --abbrev-commit

  Git reflog
  显示引用变化历史,相当于head变化

  2.5.2、版本回退:
  一个git reset --hard HEAD^
  俩git reset --hard HEAD^^
  多个git reset --hard HEAD~数字
  回退到指定版本
  git reset --hard commit_id
  commitid可以从reflog或者log中查看
  --hard表示丢弃暂存区的东西
  --soft – 暂存区和工作目录都不会被改变,改变都放在暂存区
  --mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响,改变不会放在暂存区。
  --hard – 缓存区和工作目录都同步到你指定的提交
  Git revert
  reset是指将当前head的内容重置,不会留任何痕迹。
  revert是撤销某一次提交,但是这次撤销也会作为一次提交进行保存
  假设当前有3个commit,git log如下:
  commit3:add test3.c
  commit2:add test2.c
  commit1:add test1.c
  执行 git revert HEAD~1之后,会提示提交信息,提交后gitlog如下:
  commit4:Reverts “test2.c”
  commit3:test3.c
  commit2:test2.c
  commit1:test1.c
  执行完后,test2.c被删除了,运行git status,无任何变化。
  执行 git reset HEAD~1之后,再次看git log,如下:
  commit2:test2.c
  commit1:test1.c
  执行完后,commit3被删除了
  但是test3.c还在本地缓存区,运行gitstatus,可以看见提示test3.c可以用git add包含该文件。
  若执行git reset --soft HEAD~1,log为:
  commit2:test2.c
  commit1:test1.c
  执行完后,test3.c也被删除了,查看gitstatus,提示可以commit以提交test3.c,test3.c在暂存区。
  若执行git reset --hard HEAD~1,log为:
  commit2:test2.c
  commit1:test1.c
  执行完后,test3.c也被删除了,查看gitstatus,无任何变化。
  2.6、标签管理
  2.6.1、打标签
  相当于给某个提交取一个好记住的名字,例如v1.0.0
  git tag v1.0.0
  2.6.2、显示所有标签
  git tag
  2.6.3、显示标签信息
  Git show tagname
  2.6.4、标签管理
  命令git push origin 可以推送一个本地标签;
  命令git push origin --tags可以推送全部未推送过的本地标签;
  命令git tag -d 可以删除一个本地标签;
  命令git push origin :refs/tags/可以删除一个远程标签。
  2.7、远程管理
  一般都要和两部分人提供
  2.7.1、git clone
  从远程主机克隆一个版本库
  git clone

  2.7.2、git remote
  为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
  列出所有主机:git remote
  带网址列出主机:git remote –v
  clone版本库的时候,所使用的远程主机自动被Git命名为origin
  如果想用其他的主机名,需要用git clone命令的-o选项指定。
  git clone -o jQuery https://github.com/jquery/jquery.git
  git remote show命令加上主机名,可以查看该主机的详细信息。
  git remote show
  git remote add命令用于添加远程主机。
  git remote add
  git remote rm命令用于删除远程主机。
  git remote rm
  git remote rename命令用于远程主机的改名。
  git remote rename
  2.7.3、git fetch
  将某个远程主机的更新,全部取回本地。
  如果只想取回特定分支的更新,可以指定分支名。
  git fetch
  所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取
  比如origin主机的master,就要用origin/master读取。
  git branch–r,可以用来查看远程分支,
  -a选项查看所有分支。
  可以采用git checkout / 切换到该分支
  但是一般用git checkout -b newBrach /
  意思是在/ 的基础上,创建一个新分支。
  也可以使用merge,合并远程分支。
  2.7.4、git pull
  取回远程主机某个分支的更新,再与本地的指定分支合并。
  git pull:
  等同于先做git fetch,再做git merge
  2.7.5、git push
  命令用于将本地分支的更新,推送到远程主机。
  git push   :
  省略远程分支名,表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名)
  如果该远程分支不存在,则会被新建。省略本地分支名,则表示删除指定的远程分支
  如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
  如果本地版本低,那么会报错,可以--force强制push,--tags表示也推送tags.
  git push --force origin
  2.7.6、将本地库推到远程端
  git push origin master
  2.8、自定义Git
  2.8.1、自定义命令
  可以利用git config命令来给命令取别名。
  例如
  git config --global alias.co csheckout
  git config --global alias.ci commit
  git config --global alias.br branch
  git config --global alias.unstage 'reset HEAD'
  其中,global表示针对当前用户所有仓库都起作用
  如果不加,表示只对当前仓库有用,每个仓库的Git配置文件都放在.git/config文件中:
  当前用户的config存放在用户主目录下的一个隐藏文件.gitconfig中:
  2.8.2、忽略文件
  为了防止没用的文件被提醒untracked,可以在git仓库主目录下添加.gitignore文件
  (本身要放到版本库里面),该文件可以配置git要忽略哪些文件,不添加到仓库中。

  如果发现不能添加文件,可以采用
  git check-ignore -v file检查被哪个规则忽略了

页: [1]
查看完整版本: 一个很流行的版本控制系统Git学习笔记