Git&GitHub

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


  1. ~X18X
  2. ~X18X
  3. ~X18X

猜你喜欢

转载自blog.csdn.net/u013617791/article/details/79934620