Git学习
Git学习网站
http://lvwzhen.gitbooks.io/git-tutorial/content/
git安装
1. Ubuntu:sudo apt-getinstall git
2. Windows:http://msysgit.github.io/
Windows从开始菜单中,Git->Git Bash启动;工作目录是C:\Users\pc-user
创建版本库
1. 创建一个目录,进入该目录,并使用”git init”将其变成Git可以管理的仓库
2. 把文件添加到版本库
a) 所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外;图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化
b) 用命令git add告诉Git,把文件添加到仓库:$ git add readme.txt
c) 用命令git commit告诉Git,把文件提交到仓库:$ git commit -m "wrote a readme file"
commit一次可以提交多个文件
本地仓库管理
1. 常用命令
a) git add <filename>:向仓库添加文件
b) git commit:向仓库提交文件
c) git status:查看仓库当前的状态
d) git diff:查看不同
2. 版本回退
a) git log:查看最近到最远的提交日志
b) git reset –hard <commit-id >:切换版本,commit-id可以有几种形式
i. 版本id;版本id可以不写全,git会自动匹配
ii. HEAD^…^/HEAD~n;HEAD表示当前版本,一个”^”表示往前一个版本,”n”表示往前n个版本
c) git reflog:记录每一次命令
3. 工作区和暂存区
a) 工作区:即当前工作的目录
b) 暂存区:隐藏目录“.git”, 是Git的版本库版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
c) 用“git add”把文件添加进去,实际上就是把文件修改添加到暂存区;用“git commit”提交更改,实际上就是把暂存区的所有内容提交到当前分支
4. 管理修改:Git跟踪并管理的是修改,而非文件
5. 撤销修改:
a) 修改了还没提交到暂存区:git checkout – file,表示撤销最近一次修改
b) 已经提交到暂存区但还没commit:git reset HEAD file
6. 删除文件:在工作区中将一个文件删除了
a) 在本地仓库中也删除:用命令git rm删掉,并且commit
b) 想要恢复:git checkout – file
远程仓库
1. 由于本地git仓库和远程仓库的传输室通过SSH加密的,因此需要先得到自己的SSH Key
a) 生成Key:$ ssh-keygen -t rsa -C youremail@example.com
b) 查看Key内容:cat ~/.ssh/id_rsa.pub
c) 登陆到git服务器(可以是github等),在”Account Setting”的”SSH KEY”栏中添加公钥,用于服务器验证消息是你推送的
2. 添加远程库
a) 关联远程库:
$git remote add origin git@github.com:<github_username>/<repository_name>
远程库的名字就是origin,Git默认的叫法
注意:不同目录下关联的远程库是不同的
b) 把当前分支master推送到远程:$ git push -u origin master
第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
注意在本机~/.ssh/上必须要有名为”id_rsa”的私钥,否则认证失败
c) 第一次进行上述推送操作时,出现以下错误
猜是在git服务器上创建仓库时,勾选了“Initialize this repository with a README”,因此需要先进行”pull”操作再能进行”push”操作
d) 从远程获取最新版本到本地
i. 获取后自动合并:git pull origin master,就是将origin这个版本库的代码更新到本地的master主枝
ii. 获取后不自动合并:git pull origin master,需要merge命令进行合并
3. 添加与删除远程仓库文件
a) 添加文件:add——>commit——>push
b) 删除文件:rm——>commit——>push
4. 从远程库克隆
a) $ git clone git@github.com:<github_username>/<repository_name>
分支管理
创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作
1. 创建与合并分支
a) HEAD指向的就是当前分支
最开始HEAD->master->提交
如果创建了一个新分支,new_并切换了分支,则HEAD->new_->提交
b) 创建并切换到分支:$ git checkout -b dev
等价于:
$ git branch dev
$ git checkout dev
c) 查看当前分支:$ git branch
d) 在分支上进行工作后,切换回主分支”master”并进行合并
e) 删除分支后再查看所有的分支
2. 解决冲突:当不同分支上都进行了工作,分别有了新的提交;Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突
例:在不同的分支上对同一个文本进行不同的修改,进行合并后
用带参数的git log也可以看到分支的合并情况:
3. Bug分支:即当你在某个分支工作到一半且还没到提交的时候,这时候需要你到临时修复一个bug,需要创建新的分支来工作,这就需要用到Git提供的stash功能,可以把当前工作“储藏”起来
a) 隐藏
b) 恢复:一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;另一种方式是用git stash pop,恢复的同时把stash内容也删了
4. 多人协作
a) 查看远程库信息
b) 创建远程origin的dev分支到本地
$ git checkout -b <branch_name> origin/<branch_name>
c) 多人协作的工作模式通常是这样
http://lvwzhen.gitbooks.io/git-tutorial/content/chapter-6/6-6.html
可以试图用git pushorigin <branch_name> 推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branch_name>推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream <branch_name> origin/<branch_name>
标签管理
发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照
1. 创建标签
a) 切换到要需要打标签的分支上;默认标签是打在最新提交的commit上的
b) 对于历史提交的commit,需要找到其id,然后打上标签
c) 看某个标签的说明文字
2. 操作标签
a) 删除某个标签:$ git tag -d <tag_name>
b) 推送某个标签到远程:$ git push origin <tag_name>
c) 一次性推送全部尚未推送到远程的本地标签:$ git push origin –tags
d) 删除远程标签
i. 先本地删除:$ git tag -d <tag_name>
ii. 再远程删除:$ git push origin : refs/tags/<tag_name>
自定义Git
1. 忽略特殊文件:Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
2. 配置别名:$ git config –global alias.<别名><source_cmd>