#Git的基本了解与使用、向github提交代码
- git:是一个版本控制系统。
- github:一个代码托管提供商、开源网站、是一个面向开源及私有软件项目的托管平台,因为支持Git作为唯一的版本库格式进行托管,故名为github。
- 刚开始我对两者的关系很困惑、其实就是你可以在github上面创建一个项目,然后将github提供的git克隆到本地,然后再提交给github。
> 这是向github上面提交项目的步骤:
- git clone [email protected]:iOSaFei/CoreImage.git //将远程仓库的项目克隆到本地
- cd CoreImageGit(down的文件夹,把要上传的项目拖进来)
- git add .(将目录中所有的内容添加到源里面去)
- git commit -m “描述性文字” //将缓存区的项目加到本地仓库
- git push -u origin master //上传
> 如果你只是想使用github、这么多就足够了,但是下面的内容还是很有必要看的:
- git:分布式版本控制系统(分布式版本控制系统(Distributed Version Control System,简称DVCS)。
- 这是一个可以不依赖中央服务器的的版本控制系统、每个终端都有完整的备份。而且git存储当前版本的所有内容、而不是和上一次的差异。
- 这两点是和git和集中式版本控制系统(svn等)的显著差异。除此之外git可离线完成大部分操作,更快更强更优雅
> 接下来步入正题,先说本地git的使用:
- Xcode自带git,只不过可能不是最新版本,只需在创建项目的时候,勾选上创建即刻。
如果你想使用最新版本,可以去下载:git-scm.com,下载完成后:
- which -a git //查看本地所有的git
- git --version //查看当前使用的git
- vim .bash_profile //在此文件中输入指定的git
- source .bash_profile//载入该文件
> git的基本配置(在每一次提交的时候都会用到):
- git config --global user.name iOS_aFei // 配置作者的名字(如果以前有责替换)
- git config --global user.email [email protected] // 配置作者的邮箱
- git config --global --add user.name miaomiao //添加作者的名字
- git config user.name //获取作者的名字,获得是最后添加的
- git config --list --global //获取本地用户的信息
- git config --global --unset user.name miamiao //删除指定的用户名
- git config --help // 查看帮助文档
> git的使用
- cd 项目文件夹
- git init //初始化一个空的源,.git子目录已经被创建
- git add . //将目录中所有的内容添加到源里面去
- git commit -m ‘Initial commit‘ //重启xcode即可
> 由于是本地的、比上述往github上面提交少了上传到远程服务器;而且第一步是创建的git,而不是clone的。
> 或许应该简单的说明一个git的原理了,不然命令很难记住:
- Git的有4个区域:工作区(编辑代码的地方)、暂存区域(中间的缓存)、仓库
- 工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪。
- 已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间 后,它们的状态可能是未更新,已修改或者已放入暂存区。
- 而所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。
- 初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。在编辑过某些文件之后,Git 将这些文件标为已修改。我们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些暂存起来的文件,如此重复。
- git status //查看文件处于什么状态
#####效果:
{
git status
#nothing to commit (working directory clean) //说明没有修改的文件,且没有任何处于未跟踪的新文件
# Untracked files://未跟踪的文件
# Changes not staged for commit//内容发生了变化,但还没有放到暂存区。
#Changes to be committed: //已暂存状态
}
- git add 文件名 //可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等
- git commit // 提交更新
> 尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交
- git commit -m “描述” //也可以用 -m 参数后跟提交说明的方式,在一行命令中提交更新:
> 这些是git的一些其它操作、整理的有点乱、可以用到时再看。
- git rm //删除文件
- git rm -f 文件名 //如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项
- git rm --cached 文件名 //我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。
- git mv file_from file_to //修改文件名
- git log //在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 git log 命令查看。
{
> 我们常用 -p 选项展开显示每次提交的内容差异,
> 用 -2 则仅显示最近的两次更新:
> --stat,仅显示简要的增改行数统计:
}
- git commit --amend //有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作
- git reset HEAD 文件 //取消暂存
- git checkout -- 文件名 //撤销上一步对文件的修改
> 打标签还是很有必要的
>Git 也可以对某一时间点上的版本打上标签。人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做
- git tag//列出现有标签
{
> 创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可
> **git tag -a v1.4 -m ‘my version 1.4‘**
> **如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取 signed 的首字母)即可**
**git tag -s v1.5 -m ‘my signed 1.5 tag‘**
}
> 后期加注标签
- git tag -a v1.2 9fceb02
{
> git log --pretty=oneline获取提交对象的校验和
}
- git push origin v1.5//默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可:
- git push origin --tags//如果要一次推送所有本地新增的标签上去,可以使用 --tags 选项
- git show //命令查看相应标签的版本信息,并连同显示打标签时的提交对象。
{
> git show v1.4
}
> **现在看博客开始往github提交的命令就很简单了。**
1、git clone [email protected]:iOSaFei/CoreImage.git //将远程仓库的项目克隆到本地
2、cd CoreImageGit(down的文件夹,把要上传的项目拖进来)
3、git add .(将目录中所有的内容添加到源里面去)
4、git commit -m “描述性文字”//将缓存区的项目加到本地仓库
5、git push -u origin master//上传
>第一步中的[email protected]:iOSaFei/CoreImage.git是SHH类型的链接、也可以使用HTTPS链接的,区别在于你使用SHH类型的不必每次输入github帐号密码,而使用SHH类型的链接要为github帐号添加SSH keys,否则会报错:
{
>Permission denied (publickey).
>fatal: Could not read from remote repository.
>Please make sure you have the correct access rights
>and the repository exists.
}
这时需要在本地创建SSH key,然后将生成的SSH key文件内容添加到github帐号上去
{
- ssh-keygen -t rsa -C "[email protected]” 然后输入自己要设置的sshkey的密码(不一定是github密码)
- "$(ssh-agent -s)”//保存密码
- ssh-add~/.ssh/id_rsa 然后输入刚刚那个密码
- vim ~/.ssh/id_rsa.pub 复制里面的内容粘贴到gitHub
- ssh -T [email protected]//验证一下
}
或许你不会看到这里了,即使看到这里也没耐心了,因为我都不想写了:
> 但是git的分支是git的必杀技:
#####Git分支
> 假设你们团队有个地址为 git.ourcompany.com 的 Git 服务器。如果你从这里克隆,Git 会自动为你将此远程仓库命名为 origin,并下载其中所有的数据,建立一个指向它的 master 分支的指针,在本地命名为 origin/master
- git branch testing// 创建一个新的分支testing、这会在当前 commit 对象上新建一个分支指针、看图:加载中...
> Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针、HEAD指针指向正在当前工作的分支。
- git checkout testing//转换到 testing 分支
> 由于 Git 中的分支实际上仅是一个包含所指对象校验和(40 个字符长度 SHA-1 字串)的文件,所以创建和销毁一个分支就变得非常廉价。说白了,新建一个分支就是向一个文件写入 41 个字节(外加一个换行符)那么简单,当然也就很快了。
- git checkout -b iss53 //这相当于执行下面这两条命令:
- $ git branch iss53
- $ git checkout iss53
- git merge hotfix//master 分支并把hot fix合并进来、
- git branch -d hotfix//hotfix 已经完成了历史使命,可以删掉
#####推送本地分支
> 要想和其他人分享某个本地分支,你需要把它推送到一个你拥有写权限的远程仓库。你创建的本地分支不会因为你的写入操作而被自动同步到你引入的远程服务器 上,你需要明确地执行推送分支的操作。换句话说,对于无意分享的分支,你尽管保留为私人分支好了,而只推送那些协同工作要用到的特性分支。
- git push origin serverfix
- git push origin serverfix:awesomebranch 上传我本地的 serverfix 分支到远程仓库中去,称它为 awesomebranch 分支
> 接下来,当你的协作者再次从服务器上获取数据时,他们将得到一个新的远程分支 origin/serverfix,并指向服务器上 serverfix 所指向的版本:值得注意的是,在 fetch 操作下载好新的远程分支之后,你仍然无法在本地编辑该远程仓库中的分支。换句话说,在本例中,你不会有一个新的 serverfix 分支,有的只是一个你无法移动的 origin/serverfix 指针。如果要把该远程分支的内容合并到当前分支,
可以运行 git merge origin/serverfix。如果想要一份自己的 serverfix 来开发,可以在远程分支的基础上分化出一个新的分支来:
- git checkout -b serverfix origin/serverfix
> 这会切换到新建的 serverfix 本地分支,其内容同远程分支 origin/serverfix 一致,这样你就可以在里面继续开发了。
删除远程分支
- git push origin :server fix