Git
定义
目前世界上最先进的,专为处理文本文件而设计的,分布式版本控制系统1,其由Linus花2周时间用C编写,最早在Linux上开发。
Git跟踪并管理的是修改
,而非文件。
缺点
1、“撤销”按钮由其局限性,最明显示的是,在关闭文件时,文件的过去也随之丢失。
2、文件保存是非常个人化的。它不能够显示整个系统的历史,只能够显示该文件的。
其他版本控制系统
- 集中式:
-
开源免费:SVN、CVS、VSS
收费:ClearCase - 分布式:
- Git、Mercurial、Bazaar
什么是版本控制
- 1、版本控制记录了什么?
-
所有的版本控制系统,其实只能跟踪
文本文件
的改动细节(比如TXT文件,网页,所有的程序代码等等,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。) 而图片、视频、Word这些二进制文件
,虽然也能由版本控制系统管理,但没法跟踪文件的具体变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。 - 2、文本文件的编码问题
-
因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。
使用Windows的童鞋要特别注意:
千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可.
支持协议
Git支持多种协议,包括https
,但通过ssh支持的原生git协议
速度最快。
工作区和暂存区
- 工作区(Working Directory)
-
就是你在电脑里能看到的包含.git的目录,
Git可以察觉到工作区的动态。但是不会自动记录。 - 版本库(Repository)
-
工作区的隐藏目录.git,它不算工作区,用于记录我们提交的修改。
版本库里面存放了很多东西,包括暂存区(stage)
,Git为我们自动创建的第一个分支master
,以及指向master的一个指针Head
.
往Git版本库里添加文件时,分两步进行:
1、用git add
把工作区中对文件的修改
添加到暂存区
2、用git commit
把暂存区(不能把工作区)中的所有修改记录一次性提交到当前分支,并自动清空暂存区。
指针
- head指针
-
总是指向当前分支中某个版本
head^ 前一个版本,head^^前两个版本……
head~n 前n个版本 - master指针
- 指向主分支的某个版本
- 分支名
- 指向分支的指针
GitHub
定义
GitHub是通过Git进行版本控制的软件源代码托管服务,由GitHub公司使用Ruby on Rails编写而成。
功能(在代码托管方面)
-
1、远程仓库(remote repository)
备份
,实现任意电脑访问。 - Github 获取 Git 中的提交历史,并将其存储在互联网上,实现任一访问。本机1推送(pushing)提交到 Github后,可从另一台新的或不同的电脑上拉取(pulling)这些提交。一旦被上传到 Github,这些提交记录就被存储在远程仓库中。
-
2、
协同工作
-
1、从主分支上摘取自己的负责部分,创建本地分支
2、在本地分支上编辑修改,然后提交(Commit)
3、推送提交(Push)到 Github
4、创建发布请求(Pull Request),说明该分支包含了哪些更改
5、合作者同意后,合并(Merge)分支内容到主分支
6、将主分支上的最新提交拉取(pull)到本地
7、重复上述步骤特点
1、免费情况:对他人只读(他人可以任意fork)
收费情况:可以对他人不见。
2、可以pull request给官方仓库来贡献代码
Git命令
版本(修改
)管理
记录版本
- git stage (=git add)
-
把对工作区中
文件的修改
添加到暂存区
同一文件多次连续(没有commit)stage,后面的会把前面的覆盖掉。 - git commit -m <文件说明>
- 把暂存区(不能把工作区)中的所有修改一次性提交到当前分支,并自动清空暂存区。
查看版本
- git status
- 查看工作区是否有文件更改,缓存区是否有需要提交到当前分支。
- git diff
- 查看工作区文件和缓存区或者当前分支中记录的版本有什么不同。
- git log [–pretty=oneline]
-
查看当前版本之前提交的
日志
(即文件说明
) 2以及版本号 3
撤销版本
- git checkout – <文件名>
- 丢弃当前工作区的修改,回退到暂存区状态(优先)或当前分支记录的状态
- git reset HEAD <文件名>
- 清除暂存区
- git reset –hard < commit id>
- 回到某个指定分支中某个版本
删除文件
- rm
- 从工作区中删除文件(可以用checkout恢复)
- git rm <文件名>
- 在工作区中已经删除了该文件时,从分支中删除文件的当前版本(当前版本不可恢复,其他版本可以恢复)
- git rm -f <文件名>
- 在工作区中没有删除该文件时,从分支中删除文件的当前版本
临时任务
- git stash
- 把当前工作现场存储起来,即保存stage中的内容,然后将stage清空,为临时任务提供stage.
- git stash list
- 查看stash中的内容
- git stash apply stash@{编号}
- 恢复特定stash中的内容
- git stash drop
- 删除stash中的内容
git stash pop
:恢复stash中内容的同时,将恢复的stash删除
远程仓库
远程仓库默认名字为origin
创建SSH Key
1、在本地创建SSH Key
2、在GitHub上创建SSH Key,让GitHub得到你的公钥
- 原因
- 本地Git仓库和GitHub仓库之间的传输是通过SSH加密的。GitHub只要知道了你的SHH公钥,就能确认是你的电脑推送的,从而接收你的推送,别人不行。
GitHub允许你添加多个Key(对应多台电脑)
本地仓库–>远程仓库(推送)
- git remote add origin git@server-name:path/repo-name.git
- 关联一个远程仓库
远程仓库–>本地仓库(克隆)
- git clone git@servername:path/repo-name.git
- 只有从自己的账号下clone仓库,才能推送修改(因为对应推送到clone时对应的仓库)。
远程分支和本地分支
远程分支最好和本地分支名称一致
- git push -u origin master
- 第一次推送master分支的所有内容
- git push origin master
- 本地提交后,推送最新修改
- git push origin <分支名>
- 向远程推送本地dev分支
- git branch –set-upstream <分支名> origin/<分支名>
- 将本地分支和远程分支建立连接关系
- 合并冲突
-
本地分支b2从远程分支b1中pull下来后,远程分支b1和本地分支b2都对分支中的某些文件,如文件a进行了改动,使得现在远程分支b1不再时你pull下来时的b1(它被其他人改动了),那么此时将b1和b2进行push时(
相当于merge
)会发生远程合并冲突
。
此时,需要将远程分支b1中的文件pull下来(相当于merge
),但是pull下来后,由于上述原因,会发生本地合并冲突
。
此时,解决冲突,再次push即可。
查看远程库信息
- git remote
- git remote -v
- 显示抓取和推送的origin的地址,如果没有推送权限,就看不到push的地址
分支管理
查看分支
- git branch
- 查看分支有哪些
- git log –graph
- 查看分支合并图
创建分支
git branch <文件名>
切换分支
git checkout <文件名>
创建+切换分支
git checkout -b <文件名>
合并某分支到当前分支
- git merge <分支名>
- fast forward(快进模式),没有分支合并说明
- git merge –no-ff -m “合并说明” <分支名>
- 禁用fast forward(快进模式),可以附件分支合并说明,并可以在查看分支合并图时看到说明。
- 合并冲突
-
分支b1和分支b2,都对a文件的某一版本同时做了修改,并提交了相应版本。分支b1合并分支b2时,提示冲突。此时分支b1中的a文件中附加有两分支的区别信息,分支b2中a文件保持不变。
解决:对分支b1中的a文件进行修改(即对a文件中附加的区别信息进行删除或者进行有必要的其他更改)(当然也可以不修改,那么a中就会有对于的附件信息)。然后在b1分支中的a文件当前版本再次提交。最后再次将b1分支和b2分支进行合并。此时不会有冲突提示,并且b2中a文件一直保持合并前不变。
删除分支
git branch -d <文件名>
Bug分支
在需要调试bug的分支上,创建临时分支,进行bug调试。
功能分支
在需要创建新功能是,最好创建一个新的分支。
如果要丢弃一个没有合并过的分支,可以通过
git branch -D <分支名>强行删除
标签管理
标签:指向某个版本的指针,不能改变指向(分支可以改变指向),是一个让人容易记住的名字(而commit号(即版本号)则不容易让人记住)
- git tag <标签名>
- 对向前分支中最新的版本打标签
- git tag <标签名> <版本id>
- 对某一版本打标签
- git tag
- 查看所有标签,标签按照字母顺序依次显示
- git show <标签名>
- 查看标签详细信息
- git tag -a <标签名> -m “标签说明” <版本id>
- 为标签写说明
- git tag -s <标签名> -m “标签说明” <版本id>
- 用PGP签名标签
- git tag -d <标签名>
- 删除标签
- git push origin :refs/tags/<标签名>
- 在已经将该标签从本地删除的前提下,删除一个远程标签。
- git push origin <标签名>
-
推送某个标签到远程。
创建的标签都只存储在本地,不会自动推送到远程 - git push origin –tags
- 推送全部未推送过的本地标签
[1] https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001373962845513aefd77a99f4145f0a2c7a7ca057e7570000
[2] http://blog.jobbole.com/111187/
[3] https://zh.wikipedia.org/wiki/GitHub
[4] https://www.zhihu.com/question/19946553
[5] https://blog.csdn.net/qq_22337877/article/details/73249912