爱喝冬瓜汤的萝卜

导航

git的一些简单知识

git

起步

为什么要使用版本控制

当我们在工作的时候,通过很多次迭代对当前文档工作进行优化.这个过程是一个反复修改的过程,我们需要回到之前的某次修改.这个时候我们就希望有一个工具能够把每次修改的状态记录下来.

版本控制系统

  • 本地版本控制系统
    一种实现方式是是使用复制文件的方式,当到某个时间点的时候,需要做一个版本记录的时候,全量复制当前的文件夹,并做额外的命名标记时间和修改人信息.
  • 集中式的版本管理系统(CVCS)
    我们希望太多人同时协作完成工作,这个时候有一个集中管理服务器,保存了所有的文件,以及文件的副本.协同工作的人通过客户端连接到服务器,进行文件的管理和实现.
  • 分布式版本管理系统(DVCS)
    分布式版本管理系统不仅仅存放了服务器端最新的文件版本快照,而是将元短服务器的所有的分支信息都映射到了本地.后期即使服务器发生了故障,也能够通过某个副本回复过来.
    分布式版本管理系统也能够同时和多个服务器仓库进行交互协作.这样就能够和多个小组的人进行协作了.

git历史

linux内核开发小组在开发和维护linux的时候,需要有大量的功能,补丁开发.最开始的时候linux内核开发小组是和bitKeeper合作实现版本控制的.
2005年合作到期,BitKeeper收回了使用权限,然后linux决定自己开发一个版本控制系统,需要有一下需求:

  1. 速度
    2.大量分支
    3.设计简单
    4.完全分布式
    5.有能力支持linux这样的大型系统.

然后git就出现了.

git基础

git记录的是快照,而不是差异比较.

git的版本每个版本都是记录了当前版本中文件修改的信息,为了减少记录文件的大小,只会将修改的文件版本记录下来,而没有修改的部分会指向之前的版本.

git基本都在本地修改

git的修改都是在本地实现的.即使在没有网络的情况下也能够完全工作,同时在有网络的时候将修改推送到远端.

git保证完整性

git使用了文件校验和来最终当前文件的变更情况来保证数据完整性

git一般值添加,不修改

git对于数据的删除和修改等操作都是添加,用后面的版本覆盖之前的版本,而不是修改之前的内容.除非有特殊操作.

git的三种状态

提交状态 ; 修改状态 ; 暂存状态

git 基础

git基础中包括配置并初始化仓库,开始或停止跟踪文件,暂存或提交更改.配置git忽略某些文件,如何迅速而简单的撤销某些错误操作,如何查询项目的历史版本和不同提交之间的差异,如果向远端仓库推送或者拉去文件.

git仓库

git仓库的方式有两种:一种是自己创建一个git仓库,还有一个种是从远端clone一个仓库下来.

  • 初始化仓库

    git init

    执行完成后,会在当前文件夹中创建一个.git的影长文件夹 表示是一个仓库.

  • clone远端仓库

    git clone https://github.com/rabbitmq/rabbitmq-server.git local-rabbitmq-server

    这行命令的语义是:rabbitMq-server仓库中的内容clone到当前文件夹的local-rabbitmq-server目录中

记录文件的状态

文件的状态有未追踪(??),缓存(A),已修改(M),未修改.

  • 查看文件的状态

    git status

    能够返回当前文件的修改状态

    git status -s

    能够返回简单的文件的状态
    其中在文件名的左边会有标识.
    对应的主功能太入标题中标记出来.A,??,M这些标记.

  • 跟踪文件状态
    git status -s 命令返回??文件名的时候,这种表示文件新创建,且没有被追踪.

    git add fileName

    使用 add命令将未追踪命令的文件编程 缓存的文件.状态 由 ??变成 A.

  • 将修改文修改为暂存状态

    git add filemname

    这里将 修改状态 改为暂存状态的使用的命令和 跟踪的命令相同.

    忽略文件.

    在当当前文件夹中可能会有一些文件不希望被文件追踪,也不作git status中显示.例如编译的中间文件,或者日志文件等.这个时候适用.gitignore文件来将不需要的文件过滤掉. 其中书写规范如下:

    1. 开头的行会不起作用,长作为日志来适用

    2. 使用glob模式匹配.*表示零个一个字符;?表示匹配一个字符;[abc]表示匹配abc中的任意一个字符,[a-z]表示匹配az中的任意一个字符;**表示任意深度的目录
      3.以/开头避免递归
      4.以/结尾指定某个目录.
      5.以!开头表示逆反,不作屏蔽

查看当前文件夹和暂存区的差异

查看还没有add的文件的内容

git diff

git diff 当前文件夹中还未提交文件的差异.

git diff --staged

git diff --staged 表示当前已经在暂存区中存放的内容

提交修改

将当前暂存区的文件内容提交到提交区中.

git commit -m "commit message"

如果当前文件夹中有未提交的内容,一般需要 add +commit的命令.可以合并为一条

git commit -am "coimmit message"

删除文件

删除文件,同时删除对一个的记录.本地的记录会被遗弃删除

git rm filepath

删除日志,但是不删除本机文件.当前文件变成为最终状态

git rm --cached filepath

移动文件

git mv sourcePath toPath

这条指令相当于三条

mv sourcePath toPath
git rm sourcePath
git add toPath

查看修改日志

git log -p --stat

git 查看日志中包括多种参数,具体如下:

-p 按补丁格式显示每个更新之间的差异。
--stat 显示每次更新的文件修改统计信息。
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph 显示 ASCII 图形表示的分支合并历史。
--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline short,full,fuller 和 format(后跟指定格式)。

git log添加其他限制条件

可以添加限制最近几周的,
也可以添加到什么时间为止的等.

修改提交信息

git commit 的时候,觉得文件提交的不太行.这个时候希望做一些修改,但是只能修改最近的一条.
git commit --amend

这样能够上一条提交记录.

放弃当前某个文件的修改

git checkout -- fileName

如果 fileName=.的时候,会清空整个空间.
这个指令是需要慎重的指令.

远端仓库

  • 查看远端仓库

git remote -v

查看当前本地仓库关联的所有远端仓库的名称和地址

  • 将本地仓库和远端仓库关联

git remote add shortName url

将本地长裤和远端仓库关联起来.

  • 从远端长裤拉数据

git fetch shortName

从远端仓库中,上一次fetch后的所有提交的内容都拉取到本地起来.

  • 推送到远端分支

git push shortName branch-name

将本地的修改推送到远端

  • 查看远端仓库的信息

git remote show shortName

这样能看到远端仓库更多的信息.

  • 远端仓库重命名

    git remote rename source_short_name to_short_name

    修改远端仓库的短名称

  • 远端仓库删除

    git remote rm shortName

    删除远端仓库,表示当前贡献者将不会在贡献代码了.

git的标签

标签是用来对某一次提交的副本做一个特殊的标记,表示重要.

  • 查看所有标签

git tag

这个命令能够显示出所有标签.
如果想要对标签进行筛选过滤 可以加上 -l添加

git tag -l 'info'

  • 创建标签
    标签类型有两种,一种是轻量标签,一种是附属标签.轻量标签没有太多信息,而附属标签中会包括很多信息.
    创建轻量标签和附属标签的区别是:附属标签命令中 -a
    也可以对历史提交创建tag

    git tag tagname : 轻量级tag
    git tag tagname -a -m "tagInfo" 附属标签.
    git tag tagname -n -m 'tagInfo' logId 根据历史的提交记录发送消息

  • 标签提交到远端
    将当前的标签提交到远端的仓库中.

    git push origin tagName // 将某个标签推送到远端
    git push origin --tags //将所有标签推送到远端

  • 删除远端分支
    删除远端分支

git tag -d tagname

分支

几乎所有的VCS系统都支持分支,分支能够让我们的工作和主分支分离出来,当工作测地完成,然后合并到主分支上去.
git的分支的实现非常高效,每次的修改值需要消耗很轻量资源,git的分支是其杀手级特性.

分支简介:

  git的每一次提交commit都会生成一个提交对象.这个提交对象中会记录:修改的文件,修改人的信息,以及指向其前置提交对象的指针列表.
  分支是一个指向提交对象的特殊指针,当提交的时候,分支名会指向最新提交的那个提交对象.且分支指针在提交操作的时候,自动向前移动.

分支创建

git branch branchName

  表示创建了一个新分支名,分支名指向了当前分支名指向的提交节点.同时Head已让指向了当前分支,并不变化.
  git中创建一个新分支,并不会将源分支copy一遍,而是只是创建一个新的指向缘由分支指针的文件,并向其中添加一个校验和.所以速度非常快.所以git鼓励人们创建新的分支.

分支切换

git checkout branchName

  切换到一个新的分支,head指向了新分支指向的提交对象,同时在老分支的暂存区和未提交的部分不变,如果这个时候我们进行提交的的话,会提交到新分支上去.老分支的分支名不会指向新的提交.
  我们在暂存区中有内容,如果我们在切换的时候,源分支和目的分支指向了相同提交对象,这个时候是能够切换的,如果指向了不同的提交对象,这个时候切换会被拒绝.

删除分支

  当一个分支使用完毕,且有master分支指向了旧的分支.这个时候需要删除分支

git branch -d branchName

创建并切换分支

将 创建和切换分支合并起来的一条命令

git checkout -b branchname

  当前命令表示从当前分支切换出一条新的分支,同时head指向新的分支.

合并分支

   将另外一个分支合并到当前分支.其中标识从共同的祖先节点开始,到两个分支指向的提交对象的路径上的所有的快照版本合并在一起,生成一个新的提交对象.这个系统作为当前分支指向的新的提交对象.

git merge otherBranchName
  

合并冲突

   当合并的两个branch指向的快照副本有有对相同行做了修改的时候,这个时候没有办法自动合并.就会报出冲突.我们需要解决这个冲突.
解决冲突的方式一定需要使用图形化工具来帮助解决从图.

分支管理

  每一个分支都是一个指向某个提价对象的指针,有的时候我们想看一下当前仓库中有多少分支,同时又多少合并到了master中,有多少没有合并到master分支.对于合并了的分支,我们可以删除.

git branch //列出当前仓库中所有的分支
git branch -v //显示分支同时,显示最后一次提交信息
git branch --mreged //显示所有已经合并到master的分支,同时可以删除这些分支
git branch --no-merged //显示所有还没有合并到master分支

远端分支

  • 查看所有分支
      

git branch -a

   查看当前仓库中的所有分支,其中会有一些remote/branchName表示远端仓库的分支,并没有和本地关联.

  • 拉取数据

git fetch shortName

   我们适用 git fetch 命令将远端仓库上一次fetch后到当前所有的提交副本都获取下来.

  • 推送

git push shortName branchname

   将本地的修改推送到远端分支上去.这个过程中,我们最好先将远端分支copy下来,然后讲 remote/branch merge进当前分支中并解冲突.然后将本地的修改推动到远端,并合并进remote/branch中去.

  • 分支跟踪(track remote branch)
       当实现分支跟踪的时候,当适用git pull 就能够自动知道应该去远端的哪个分支去抓取,并合并到本地分支.

git checkout -b branchName remote/branch 生成一个本地分支和远端分支关联起来

git checkout --track remote/branchname

   这里会在本地生成一个 branchName的关联分支

  • 跟踪已有分支

git branch -u remote/branchName

  适用 git branch -u 将当前的分支和远端的分支关联起来.

  • 查看跟踪分支

git branch -vv

   查看当前仓库中,本地分支和远端分支关联关系.

  • 删除远端分支

    git push origin --delete bracnName

变基(rebase)

   当我们希望将两个版本合并起来,同时又不希望看到其中的变更历史的时候,这个时候,我们就使用rebase
   rebase命令一定不要使用在当前仓库已经有了其他副本的情况下.就是没有写作的情况下适用.否则会出现冲突,解决起来非常麻烦

rebase能够合并commit对象.同时也能调整各个分支的commit对象.

内容缓存

当我们在工作区中工作了一般,需要切换出去,干其他的事情,这些内容也没有到commit的实现,这个时候,我们需要做的事情是将当前的工作区的内容暂时存起来,然后切换到其他分支去干活

  • 缓存

git stash save "stashinfo"

将工作区和暂存区的内容缓存到缓冲区中.

  • 查看缓冲区内容

    git stash list

示例如下stash@{0}: On master: dev 分支的 stash以冒号分隔,其中第一个为index,第二个为分支,第三个为之前存储的时候的saveinfo.后面在获取某一个指定stash的时候会使用到

  • 回复 缓存内容

git stash pop stash@{rank} --index

从缓存区中回复到当前工作空间中国.其中需要核对一下对应的分支,如果回复的分支和存储时的分支不一致的话可能会导致错乱.

posted on 2022-06-02 21:54  爱喝冬瓜汤的萝卜  阅读(53)  评论(0编辑  收藏  举报