git版本控制系统入门
-
花了小半个月的时间学习的,下面根据我用的时候遇到的问题来一步步探索这个软件。git官网的教程挺好的,我就是看的这个,下面都是我的总结,作为大家的参考
什么是git?
-
git就是一个软件而已,他的功能可以用一个例子来说,当用word写一个小论文的时候,比如周四你写完了,把他保存。周五你打算检查一遍上交,发现内容还可以改改,你又花了一天时间改。到了周六,你打算上交,突然又觉得还是周四写的好,你想改回来,怎么办?
-
解决办法就是,把每一次写完的版本分别用一个文件备份保存起来。可以改一次分别保存一次,分别为A.doc ,B.doc代表周四和周五写的。这样就可以比较了啊
-
git的功能:就是它会自动保存不同的版本,保存在一个仓库里,以后想改到哪个版本,只需要输入命令就会改回来
软件运行的环境
可以通过官网下载他的软件https://git-scm.com/其实它是一个linux系统上的软件,windows版的会弹出一个Linux的虚拟命令行界面,再这个界面里面模仿linux操作,就和windows的DOS命令一样。不想安装的话推荐一个网站:https://learngitbranching.js.org/?locale=zh_CN
命令行的格式是:
$: commd [-o|--option] param1 param2...
- 举个例子
git commit -a
:git就是命令(commd),commit就是参数(param),-a就是选项(-o) - 要知道移动文件的命令
使用
- 他是以文件夹为单位运行的,这个文件夹也叫做工作目录安装完以后,在一个文件夹下鼠标单击右键,就会出现一个类似dos的黑框
用这个黑框来操作这个文件夹,输入什么命令,怎么创建一会再说。
- 假设已经已经在这个文件夹下创建了这个 git仓库,这个文件夹内就会出现这个一
.git
命名的文件夹,这个文件夹就是git仓库;
这个文件夹就被.git文件夹管了,.git就是这个仓库,仓库里面保存着工作目录中的所有文件的不同版本,这些文件可以属于git仓库管,也可以用命令把他排除在外。
-
名词解释
一个版本仓库的组成
-
.git文件夹:存放所有的版本;
-
- 对象:
git的对象分为两类,对象和引用,对象就是一个文件,文件名是hash值。引用也是一个文件,它的文件名是正常的字符,它的文件内容只有一个别的文件民(hash)。
- 版本链:
每一个提交都是一个**版本对象。**除了第一个版本提交对象(首对象)之外,每一次提交对象中都有一个指针针指前一个提交对象。可以有多个不同的首提交对象,产生这个的情况通过fetch命令获取了多个不同版本库的版本链。
当然每一个新的仓库建立以后,第一次提交后就会有一个版本链,如果是克隆就一定了。
- HEAD引用对象:
它是提交等所有操作git仓库的基点,它指向一个提交、分支(普通本地分支,远程分支,远程跟踪本地分支),标签。
不是指向分支的HEAD,都叫分离的HEAD.
可以任意移动。
- 分支:
是一个引用对象,指向一个提交对象。也可以指向一个分支。
分支是用来改变某个提交对象,的下次提交对象的指向的方向。对一条提交连而言,他就像一棵树,在某棵树的末梢有两个分支,HEAD指向谁,下一次的提交就可以产生一个新的分叉。
分支**,在命令行中,要是没有分支,怎么找一个头对吧。。。分支还有这个作用;分支就是个头**
其实没有分支也可以,HEAD直接指向一个非末梢提交,进行一个提交,也会产生分支。但是没法标头,不好识别啊。
分支也是可以随意移动某个提交对象上的。
- 远程分支:
它的命名格式是:remote/branch
它不能受HEAD的提交移动,除非强制移动或者进行网络操作。通过更新远程仓库内容
- 远程跟踪分支:
这就是个本地分支,但是这个本地和远程分支关联一起了,所有自动合并的网络操作,都指的是这个分支和对应的远程分支的合并。
只有克隆时候有一个默认匹配的master远程跟踪分支,其他的远程分支也想要这个就得要获取手动进行匹配了。
-
合并:
-
工作目录:工作目录中保存的是某个版本的文件;
工作目录中的文件,等于HEAD指向的提交对象版本。如果HEAD指向改变,工作目录文件会跟着一起改变。
开始用命令真正的使用
建立一个版本库
- git init:
$ git add *.c
$ git add LICENSE
$ git commit -m ‘initial project version’
git commit -a 跳过暂存区
- git clone :
所有远程的分支都变成了,远程分支,只自动生成了一个本地的和remote/matser对应的远程跟踪本地分支,master
- 配置跟踪一个.gitignore 文件
- 查看修改:
当前修改后的文件——暂存区快照中的;git diff
暂存区中的(后一个 + )——最近一次提交中的:git diff --staged
- 删除:
$ git rm
会删除实际的文件
加 --cached 选项只会删除仓库中的文件,实际文件不被删除
- 移动文件:
不能直接在工作目录中移动,要用git mv
- 查看提交:
git log会显示从HEAD到树源头的提交这条线上的所有提交,这就显的分支的重要性了,没有分支咋用这个。hash值那么长。
加 -p显示每次提交的补丁
–start 简要显示
–pretty="…" 改变显示的格式
限制显示提交的数量
-
远程仓库
-
- 查看 git remote [-v显示url]
- 添加:git remote add
- 抓取所有数据:git fetch
-
抓取后本地跟踪分支自动合并远程分支:git pull
-
推送本地的某条提交(包括前面从树头到这里all):git push origin master
若是本地跟踪分支,远程仓库上的对应分支会自动合并。
-
查看服务器:git remote show
-
重名和移除:git remote rename/rm
-
标签:
-
- 列出:git tag
这个版本库需要信息(如果是克隆的话就不需要了)
-
windows和linux都有对应的系统级别的配置文件,.git里面也有一个
-
往配置文件里写入配置(这里用命令)
-
- 用户名
git config [–global] user.name “Name”
- 邮箱
git config [–global] user.email [email]
- 编辑器(windows下)
$ git config [–global] core.editor “‘C:/Program Files/Notepad++/notepad++.exe’ -multiInst -notabbar -nosession -noPlugin”
解释:后面的这个字符串例子是,必须提供某个文本编辑器的exe目录,和运行时的参数。
一些命令
命令 | 说明 |
---|---|
git status | 这个能查看git仓库的各种文件状态,包括现在HEAD在什么地方 |
git branch branch-name git branch -f branch-name name-commit | 在目前提交上创建一个新的分支 让分支移动到某个,提交上,提交名可以用相对引用。 |
git checkout [branch-name] [hash-commit][any-name~|1] git checkout -b new-branchname | 切换HEAD指向分支,并改变工作目录中的文件 如果参数是某个提交的hash值,HEAD不在指向分支,而是单独的提交记录 往前移,也可以用相对引用,在一个分支名或提交文件名或HEAD的后面,加上"^“符号,就代表往上移动一个(或num个,这个要用”~"符号)相对,如果往前没有分支就会移动到提交上。 直接新建一个分支,并转移到这个分支上 |
git log | 查看当前提交的提交历史的hash值(从当前分支到该分支提交的最开始),用的时候可以只输入前几位就可以了。 |
git merge branch-name | 就是让对方融入进自己,可以多线合并如果两个分支不在同一直线,会新生成一个包括两个分支的提交(如果没有冲突,有的话自己修改),HEAD也会移到这里。 |
git rebase branch-name git rebase -I branch-name | 以对方为基点,进行单线合并,如果在一条直线,那就没啥,如果不在,就会复制自己,在这个基点前创建一个分支,自己移到那里。 另外那个分支变秃了? 交互式 |
git reset 前面的提交名 | 撤回到这个提交 |
git revert 某个提交名或者分支名 | 并没有撤回,在本分支前新加一个,和这个参数提交前一样的提交。这样就可以分享到别的服务器那里了 |
git cherry-pick branch-name|hash-name …… | 在本提交点(或者分支上),自动复制数个参数指定的提交对象(分支对应的也是提交点),然后做出提交,HEAD自动向前移动(如果HEAD指向的是分支分支也会向前移动。 当你知道你所需要的提交记录(并且还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。 |
git reset --hard 目标版本号” | 这个会使当前版本到这个目标版本之后的提交都消失 |
总结,
最关键的是理解这些概念,分支,原创分支,原创跟踪分支,合并。另外要说一下github这个网站,github是一个git仓库网站,上面保存着数以万计的仓库,有开源的也有私人的,是世界上最大的开源网站。自己申请个账号,创建个git仓库,虽然没有在电脑上,但它的功能和你自己创建的没有任何区别,可以在本地克隆你创建的仓库,把他作为远程仓库。
|
总结,
最关键的是理解这些概念,分支,原创分支,原创跟踪分支,合并。另外要说一下github这个网站,github是一个git仓库网站,上面保存着数以万计的仓库,有开源的也有私人的,是世界上最大的开源网站。自己申请个账号,创建个git仓库,虽然没有在电脑上,但它的功能和你自己创建的没有任何区别,可以在本地克隆你创建的仓库,把他作为远程仓库。
num ↩︎