当我们在工作的时候,通过很多次迭代对当前文档工作进行优化.这个过程是一个反复修改的过程,我们需要回到之前的某次修改.这个时候我们就希望有一个工具能够把每次修改的状态记录下来.
linux内核开发小组在开发和维护linux的时候,需要有大量的功能,补丁开发.最开始的时候linux内核开发小组是和bitKeeper合作实现版本控制的.
2005年合作到期,BitKeeper收回了使用权限,然后linux决定自己开发一个版本控制系统,需要有一下需求:
- 速度
2.大量分支
3.设计简单
4.完全分布式
5.有能力支持linux这样的大型系统.
然后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
文件来将不需要的文件过滤掉. 其中书写规范如下:
开头的行会不起作用,长作为日志来适用
- 使用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 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 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中去.
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能够合并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
从缓存区中回复到当前工作空间中国.其中需要核对一下对应的分支,如果回复的分支和存储时的分支不一致的话可能会导致错乱.