目录
- Git下载与安装
- 设置Git
- Git的用户设置
- 使用Git
- 新增初始Repository
- 将文件交给Git管控(将文件加入暂存区)
- 查看Git文件记录
- 查找commit记录
- 更改提交commit的记录
- 撤销提交commit
- 将某些文件取消Git版控
- Git中删除或更改文件名
- Git查看某个文件的某一行代码是谁写的
- .git目录中有什么?
- Git资源回收机制
- Git什么时候会自动触发资源回收机制
- Git使用分支
- Git 查看、切换分支
- 切换分支发生了什么
- Git更改分支名和删除分支
- Git合并分支:
- A合并B 和 B合并A有什么不同?
- 标签
- 标签和分支的联系和区别?
- Git远程连接Github
- 将内容Push到GitHub
- Pull下载更新
- 多人开发时,一定一定要遵循**“先拉后推”**的顺序,先pull在本地解决冲突,然后在push上去。
- 从服务器上去的Repository
- PullRequest
Git下载与安装
windows操作系统下载Git,官方下载链接 git官网下载:
选择自己操作系统对应的版本即可,安装时只需要一路Next即可安装完成,安装完成后选择 Git Bash即可打开,输入git --version
如果出现相关版本信息,就安装成功了。
Linux系统安装更简单,只需要apt-get install git
或者sudo apt-get install git
打个广告全篇满满都是干货,看完即会,避免再去看书,省时省钱哦~
以下是本文总字数,包学会的。
设置Git
Git的用户设置
- 全局设置Git用户名和E-mail:
git config --global user.name "Eddie Kao" # Eddie Kao换成自己的名字
git config --global user.name "eddir@qq.com" # eddir@qq.com换成自己的邮箱
git config --list # 检查是否设置成功
- 局部设置Git用户,给每个项目设置不同的作者
git config --local user.name "Eddie Kao" # Eddie Kao换成自己的名字
git config --local user.name "eddir@qq.com" # eddir@qq.com换成自己的邮箱
git config --global core.editor emacs # 将基本的vim编辑器改成Emacs
- 用户个性化设置(设置Git命令的缩写)
git config --global alias.co checkout # 设置之后输入git co 等于输入git checkout
git config --global alias.br branch # 设置之后输入git co 等于输入git checkout
使用Git
图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
新增初始Repository
cd /tmp
git init # 对tmp这个目录进行git初始化版本控制
git status # 查看目录下的文件版本控制状态
想要该目录移除管控,则把.git文件删除即可。
将文件交给Git管控(将文件加入暂存区)
git add . # 将这个目录中的所有文件版控
git add --all # 将这个目录中的所有文件版控
git add *.html # 将这个目录中的后缀危.html的文件进行版控
# 将暂存区的文件加入到存储库存档
git commit -m "add html file"
git commit -a -m "add html file" # -a参数表示先add 再commit
查看Git文件记录
git log
git log --oneline --graph # 将输出结果更加精简化
查找commit记录
git log --oneline --author="xxx" # 查找xxx的commit
git log --oneline --grep="LOL" # 查找commit信息中包含LOL的内容
git log -p welcome.html # 查看welcome.html这个文件的commit记录
更改提交commit的记录
git commit --amend -m "Welcome file" # 修改最后一次commit信息
撤销提交commit
git log --oneline # 查看Git记录
git reset master^
# 或者
git reset HEAD^
" ^ “这个符号表示“前一次”的提交,如果想要撤销前两次的提交,则是” ^^ "
HEAD是一个指标,指向某一个分支,通常当做“当前所在分支”
将某些文件取消Git版控
创建一个.gitignore文件,Git就会自动读取里面的文件,并进行管控:
touch .gitignore
vim .gitignore
# 将内容写入.gitignore
secret.html
*.yml
*.json
!index.json
则Git将不会把secret.html和所有后缀为yml和后缀为json的文件,但index.json文件除外(!表示除外)
Git中删除或更改文件名
# 删除文件
git rm welcome.html # 删除文件
git rm welcome.html --cached # 不删除文件,只是移除Git版控
# 更改文件名
git mv welcome.html world.html # 更改文件名
Git查看某个文件的某一行代码是谁写的
git blame index.html # 查看index文件的哪一行是谁在什么时候修改的
git blame -L 5,10 index.html # 查看第5~10行的内容
.git目录中有什么?
在Git中,有4种很重要的对象,分别是Blob对象,Tree对象,Commit对象和Tag对象。
- Blob对象
例如:index.html当文件被加入暂存区无误后,Git则会在.git目录中生成一个Blob对象,这个对象会将html文件中的内容按照SHA-1的值进行计算,然后存储html文件的内容,可以使用git cat-file -t xxxx
来查看xxx(SHA-1压缩值),用git cat-file -p xxxx
来还原压缩值。
因此,如果创建一个空的目录mkdir config
,git’是检测不到这个空目录的,因为空的内容是不可以被压缩,即没有SHA-1值,所有git检测不到空的目录。 - Tree对象
理解思路:Blob对象关注文件本身,Tree关注文件即目录的结构信息,Tree是一个有向无环图结构。 - Commit对象
commit对象记录内容如下:
a. 某个Tree对象;
b. 本次commit的时间;
c. 作者信息和本次commit的人
d. 本次commit的信息 - Tag对象
必须手动的吧Tag铁在某个Commit上,git tag -a big_treasure -n "tag在这里"
使用这个命令后会创造一个 big_treasure的tag对象。
总体理解思路:
这4种类把Git中的文件(类似于葡萄一样,把跟拎起来就会把所有的葡萄都串起来)
commit对象会指向某个Tree对象;
Tree对象的内容会指向某个或者某些Blob对象或者其他的tree对象;
除了第一个commit(初始的)对象外,所有的commit对象会指向前一次的commit对象;
Tag对象会指向某一个Commit对象;
分支虽然不属于这4种对象之一,但它会指向某个Commit对象;
往Git服务器上推送之后,在.git/refs下就会多出一个remote目录,里面放的是远端的分支,基本上与本地分支类似,同样也会指向某个Commit对象
HEAD也不属于这4种对象之一,它会指向某个分支。
Git资源回收机制
通常在Git觉得对象太多时会自动触发回收机制,也可以手动触发git gc
回收机制,这样子就会把原本放在.git/objects目录下的全部对象打包到.git/objects/pack目录下。
Git什么时候会自动触发资源回收机制
- 当.git/object目录的对象或者打包的packfile数量过多时,Git会自动触发资源回收命令。
- 当执行git push命令将内容推送至远端时。
对于内存空间问题,Git不是很在意,最主要的是版本迭代,因此,能够快速和高校的操作Git才是关键。
Git使用分支
分支其实可以想象成贴纸,贴在某一个Commit上,当做了一次新的commit时,这个新的commit会指向前一个commit(前面说过),分支就会贴到新的commit。
Git中的分支不是通过复制目录活文件来进行改动形成的。
Git 查看、切换分支
git branch # 查看当前分支
git branch cat
git checkout cat # 切换到cat分支
注意,切换分支时必须该分支存在才行,如果改分支不存在,则会报错。
切换分支发生了什么
切换分支主要做了2件事:
- 更新暂存区和工作目录,当切换分支时,会用该分支指向的那个commit内容来“更新”暂存区及工作目录。但在切换分支之前所做的改动则会留在工作目录不收影响,即切换分支并不影响已经在工作目录中的那些改动。
- 变更HEAD的位置。除了更新暂存区和工作目录的内容外,HEAD也会指向刚刚切过去的那个分支,即.git/HEAD文件会一起被改动。
Git更改分支名和删除分支
git branch -m cat tiger
参数 -m表示修改分支名,原分支名 想要新修改分支名
git branch -d tiger # 如果想强制删除,则使用-D 参数进行强制删除
Git合并分支:
用master分支来合并cat分支:
# 先切换回master分支
git checkout master
# 使用git merge进行合并
git merge cat # 目前在master分支
A合并B 和 B合并A有什么不同?
从最终结果来看是一样的,但过程会有点区别。
假设master分支创建了dog和cat分支,并且现在正在cat分支:
1. 如果master要合并cat或者dog分支,Git直接使用快转模式进行合并,也就是直接收割cat或dog的成果。(因为cat和dog都是master创建的)
A合并B和B合并A的区别:
从最终结果来说,二者并没有什么区别,只是在合并过程中有区别;
cat和dog分支有相同的来源(master),当cat要合并dog或者dog要合并cat时,Git生成一个额外的Commit来处理,而一般的Commit只会指向某一个Commit,但是这个Commit会指向两个Commit,明确标记来自哪两个分支。
1. 假设想用cat分支来合并dog分支(现在在cat分支上)运行git merge dog
;
2. Git将生成额外的Commit对象,这个Commit会分别指向cat和dog分支,HEAD随着cat分支往前,而dog分支会停留在原地。(dog合并cat则反之)
二者区别:
1. 合并的分支会继续往前,被合并的分支就会停留在原地,HEAD也会随之指向到合并分支;
2. 为了合并而生成的额外的Commit对象,会记录是谁合并的谁(cat合并dog,则会记录cat在前;dog合并cat,则会记录dog在前)
其实所谓的合并分支,合并的不是分支,其实合并的是:分支指向的那个Commit,分支只是贴纸是没办法合并的。之所以说“合并分支”是比“合并commit”更好理解。
标签
标签是一个指向某个Commit的指示标,通常在开发软件是会完成特定的“里程碑”。
标签分为两种:
- 轻量标签:只需直接指定要贴上去的那个Commit即可,命令
git tag xxxx
将xxx贴到当前的Commit上。轻量标签只是一个标签,不含有其他信息。 - 附注标签:带有信息的标签
git tag tag_name -a -m "test tag"
其中,-a参数就是创建有附注的标签;后面的-m参数则是附注的信息(-d参数是删除标签,例如:git tag -d tag_name
)
标签和分支的联系和区别?
二者被删除时都不会影响到被指到的对象;
区别:分支会随着Commit移动而移动,但标签不会移动,一旦贴上,就停留在当前位置。因此,分支可以看做会移动的标签。
Git远程连接Github
Git是工具,GitHub是网站,GitHub的本体是一个Git服务器。
将内容Push到GitHub
- 先在GitHub上创建新项目:在GitHub网站的右上角单击+,选择New respository ,如图所示
a. Repository name可以随意填写,只要不重复就行。
b. 存取权限选中Public单选按钮,免费试用。
c. 单击Create repository按钮,即可增加一个Repository。
d. 需要填写一个README.md文档(填不填都行)
将一下流程走完就可以创建新的仓库了。
- 接下来就是我们熟悉的Git命令了
git init # 初始化.git
git add README.md # 添加README.md文档
git commit -m "first commit"
- 以上是简单的Git基本招式,接下来准备把内容推送到远端的Git服务器,首先需要设置一个元旦节点:
git remote add origin git@https://github.com/1841302012/yolov5.git
需要说明的是:
a. git remote指令主要进行与远端有关的操作;
b. add指令是指要加入一个远端的节点;
c. 这里的origin是一个代名词,指的是后面那串GitHub服务器的位置;
4. 将内容推送到远端服务器:
git push -u origin master
这个push指令做了:
a. 把master分支推向origin位置;
b. 在origin远端服务器上,如果master不存在,就创建一个名为master的分支;
c. 如果服务器上存在master分支,就会移动分为上的master分支的位置,使它指到当前最新的进度上。
d. -u参数表示upstream,将该分支设置为上游分支,以后的更新就会把这个当做默认值。(如果不设置上游分支,则Git不知道要将新内容提交到哪,就要每次都设置远端分支,比较麻烦)
Pull下载更新
pull命令是将远端代码拉回本机更新,但其实fetch才是下拉的主角。
直接输入命令git fetch
,会发现没有任何变化,因为远端的代码并没有发生改变,因此,需要先改变远端代码,才能看到变化。
git pull = git fetch + git commit,git pull命令相当于去线上把内容抓下来冰鞋更新本机的进度。
多人开发时,一定一定要遵循**“先拉后推”**的顺序,先pull在本地解决冲突,然后在push上去。
因为本地计算机的内容可能是比较旧的,应该先拉一份在线版本的内容更新后再推上远程分支。
从服务器上去的Repository
当我们在GitHub上看到很有趣的项目时,如何把它拉到本地呢?
git clone https://github.com/1841302012/yolov5.git
即可把这个项目克隆到本地(clone只有第一次拉项目才使用)
PullRequest
当你在GitHub看到好的项目,并且想要帮忙开发时,由于该项目是别人的,你没有修改权限。
因此,你可以:
1. 先复制(fock)一份原作者的项目到自己的GitHub账号下;(因此你就有了权限)
2. 改完后再把项目推送上GitHub(Push);
3. 发个PullRequest通知告诉原作者,你修改了什么,做了那些事情;
4. 原作者看到如果觉得可以,就会进行merge,把你的分支合并到他的项目中。
感谢你看到了最后,这就是Git最常用的使用教程,相信你已经学会啦,快去注册GitHub账号试试吧!