Git 常用操作
安装git
- 我们只需要在官网下载一路安装即可
配置用户信息
- 我们需要配置一个用户名和邮箱用于区分不同的提交者
- git config –gloabl user.name “username”
- git config –gloabl user.email “useremail”
- 其中的gloabl可以 改为 local和system 区别为 作用范围不同
- 在一个仓库下如果设置了local ,会使用local的用户名于邮箱二不是gloabl
创建仓库
- git init geek
- 这样便创建了一个名为geek的仓库
添加文件之commit
- 在默认创建好的仓库下面是没有文件的,如果我们需要想其中添加文件需要遵循以下步骤
- 首先我们可以之间将文件或者文件夹直接拷贝到当前仓库的目录下
- 然后使用git add filename将文件提交到暂存区
- 之后使用git commit -m’变更信息描述’来完成最终的提交
- 在此之间我们可以使用 git status来查看当前的状态
- 在使用git commit 之后我们可以使用git log命令来查看我们的commit所提交的变化
git log 常用参数
- git log –all 可以查看多个分支的commit
- git log –graph 可以用图示的方法查看
- git log –oneline 以简洁的方式 来进行显示
git branch
git branch可用于显示当前的分支
常见的参数有-v 可以更见的详细显示信息
git branch test 创建一个 名为test的分支
git branch - D test 可以删除test的分支
给文件重命名的简单方法
- 当我们 提到 重命名可能 会有人想到 直接修改文件名的方法
- 但是 当我们 修改完文件名之后使用git status会发现还需要执行git add 和git rm
- 由此 我们可以直接使用git mv命令即可
gitk
- gitk可以让我们以图形界面的方式显示当前的分支结构
- 也可以使用gitk –all来显示所有的分支情况
.git下的重要内容
- 首先便是HEAD文件,当我们使用cat命令对文件进行查看的时候,会显示一个指向信息
- 当我们的分支发生改变的时候,该文件也会发生改变
- 另外一个重要的文件便是config文件,其中会记录一些配置信息
- 如果我们设置了local的用户信息也会在其中显示
- 当我们在cat 查看HEAD文件的时候,我们会发现指向refs的这个文件夹,我们可以来进入这个文件夹来看一下
- 当我们进入refs文件夹之后进入heads文件夹,会发现有master和temp两个文件,这对应着我的两个分支
- 这里我们不妨来使用一个新的命令git cat-file - t 哈希值
- 我们使用cat 命令查看master之后会得到一个很长的哈希值
- 当我们使用git cat-file -t 哈希值之后就会发现这个文件类型是一个commit
- 当我们将-t 选项改为-p选项之后就会看到其中所指向的内容其中所含有的信息便是
- 包含作者信息和commit信息以及那次commit时当时的文件的指向
- 事实上我们不难发现我们时用cat 查看的值 与我们使用git log时最新的一次commit 的内容时相同的
- 因此我们每一次的commit都会有一个特定的哈希值,他们都会包含不同的内容,当然其中也会包含一些相同的内容
- 所以我们master文件中存放的就是一个指针,指向我们最新的commit
- 如果我们使用了tag在refs文件夹下也会有tags文件tag文件也会有一个哈希值,他所指向的对象也是commit
- 另外一个比较重要的文件便是object
- git中的文件便会 存放在其中
- 当我们想要使用git cat-file -t时需要将文件夹的名字添加到哈希值的前面
详解commit tree blob
- commit中有一个tree,parent ,author,committer和commit说明
- commit中所包含的tree中就包含了当时commit时的文件快照
- 而在commit的tree中又会含有tree和blob,blob则是我们的文件
- 我们可以简单的将tree理解为一个文件夹
- 在git中blob与文件名没有关系,如果文件内容相同会作为一个blob
分离头指针
引言: 相信我们在了解的refs文件夹下之后我们就会明白 当我们使用git checkout 分支名 我们所切换到的就是当前分支
的最新一次的commit 如果我们使用git checkout 切换到以前的commit 这样就叫做分离头指针
- 在此状态的下 我们没有基于任何的分支 如果我们切换到master当前所作的便被清除掉
- 当我们只是想进行尝试性的变更 可以考虑使用分离头指针
- 当我们在分离头指针下做了变更之后,而且生成了commit若此时我们切换了分支
- 会提示我们的commit没有加入到分支
- 我们在此时就需要使用git branch fix 哈希值 :来保留 在分离头指针下的commit
HEAD和branch
关于创建新的分支
- 可以使用git checkout -b 新分支名 基于到分支或commit
- 这样我们就会创建完分支然后切换到分支
- 而且后面我们可以写某一个commit
HEAD的指代
- HEAD最终都是指向的某一个commit
- 当HEAD指向某个分支的时候,本质上就是指向当前分支最新一次的提交
- 当我们使用git diff 来比较差异的时候
- 我们可以使用git diff HEAD HEAD^来简化我们的操作其中HEAD^所代表的便是HEAD的父亲
删除分支
- 直接使用git branch -D 分支名
修改最新commit的message
- git commit –amend
- 这样在弹出的界面中我们就可以直接进行 修改然后进行保存
修改老旧的message
- 我们需要使用git rebase -i commit
- 需要注意的一点便是我们需要选择需要修改的commit前面的一个commit作为命令
- 进入交互式的界面之后将pick改为reward之后保存退出
- 这时候在弹出的界面进行修改即可
将连续的commit整理成一个
- 如果想要完成这个功能,我们依旧需要使用gitrebase
- git rebase -i commit :其中的commit 要选择前面一个
- 在进入界面之后我们选择最新的那一个为pick
- 将需要合成的commit的pick改为s
- 之后我们又会进入修改massage的界面
- 之后我们保存退出即可
将间隔的commit融合在一起
- 这里我们依旧要使用git rebase -i commit
- 需要注意的以点便是,如果我们需要对最早的commit进行修改
- 我们需要在进入rebase之后手动的将最早的commit添加上去,写在最上面
- 需要注意的便是 ,我们 因该吧需要融合的commit给放在一起
- 保留上面的一个将需要融合的pick 改为s
- 然后保存退出
- 如果时不连续的,可能 需要我执行git rebase –contiune
比较暂存区和HEAD所含文件的差异
- 但我们进行文件变更之后,然后我们使用git add file
- 此时我们来查看当前的状态:git status
- git diff–cached来检查暂存区和HEAD文件的差异此时并没有生成commit
- 此时我们可以使用git diff –cached来查看后来的变更
- 之后在没有问题之后我们就可以进行提交