[TOC]
把代码托管到Github是一个高(zhuang)大(bi)上的方法,操作一会后发现简直找不到不用的理由了,而且发现阿里云居然自带git命令呵呵。
在本地commit文件的状态变化
借用网上的图片:)
新增一个文件为未跟踪,使用git status能看到新增的文件,但是不会被提交
使用git add后能把文件添加到版本库,这时候是一个跟踪的状态,和从项目克隆的文件保持一致叫做未修改
当已经跟踪的文件被改动时,会进入一个已修改的状态,但是提交的时候还是不会被提交,因为他还是未暂存
版本库里已跟踪的文件被修改时,也只有再变成已暂存状态才会被提交,要再使用git add(复合命令啊)把文件变成已暂存。
当git commit的时候只有新增的文件变成已跟踪,或者已跟踪的文件被修改又被加到暂存区了才会被提交,这点和svn不同,svn中已跟踪的文件任何修改都能直接被提交
使用git status能看到Changes to be committed提示的都是能被提交的。
不过可以使用git commit -a能实现svn的提交效果:所有已跟踪的文件如果被修改都能直接被提交。
本地和远程服务器的交互
先理解一下:git是一个分布式的版本控制方式,所以每个人本地都是一个完整的版本库,
同一个项目在每个人的电脑上都是一个完整的版本库,
同样同一个项目下的每个人的版本库都可以成为其中某一个人的该项目下的远程库
图片是网上找到的:)
下面来看看同一个项目labs在不同人的电脑上的版本库之间的关系
如图,假设我们都在github上建立一个统一的项目labs,项目下现在有alice和bob两个人,他们也都在github上有fork分支,如上图。
现在我要加入了,我也fork到了我的github上,而在本地我首先
git clone git:xxx/公共的/labs.git
这样我本地就有了一个labs的完整版本库
这个时候我
git remote -v #-v代表详细信息
这样看到了
origin git:xx(fetch)
origin git:xx(push)
类似信息,这代表github上的公共仓库在我本地的别名叫做origin,这个我第一次clone的时候默认就是这个名称了,可以改的
这里origin代表的就是git:xx这样的远程地址,我也可以把这个叫做labsCommon,只需要clone的时候指定-o参数
git -o labsCommon clone git:xxx/公共的/labs.git
这样这个远程公共仓库就被我本地以labsCommon来识别了
当我修改了本地版本,要提交到远程公共仓库,执行如下
git push labsCommon master
这样代表我把本地版本库最新的更新到远程仓库labsCommon的master分支下
当然我本地也能把我的代码提交到远程我自己的仓库下,或者bob的远程仓库下,如果有权限的话
git remote add myLabs git:xx
这样加入后,git remote -v就能看到我的本地版本库对应的远程仓库多了一个myLabs
labsCommon git:xx(fetch)
labsCommon git:xx(push)
myLabs git:xx
而我的本地库还通过remote add添加alice和bob的github远程仓库,可以从他们的库拉数据,如果有权限也能push
如果有多个远程库有push权限,可以指定一个默认远程库仓库
git push -u labsCommon master
这样下次再要吧本地推送到远程的labsCommon库的时候就可直接git push
Git的安装
由于阿里云都自带了,我就不说了
Git的配置
配置主要涉及到当前的用户名邮箱等和当前仓库的配置等。这里的用户名和登陆认证无关,不像SVN第一次需要输入账号密码以便链接到服务器端。Git的认证使用SSH,在服务器端保存客户端公钥即可。
为测试ssh是否正确,使用
ssh -v git@github.com
测试是否连接正常。
查看当前配置
git config -l
修改用户信息
git config --global user.name "Luca Shin"
git config --global user.email "xxx@gmail.com"
忽略文件模式修改的影响
git config --add core.filemode false
免密码提交远程
生成公钥私钥,把公钥传到远程。
然后要使用ssh协议访问远程库才行,查看.git/config,查看url是否是https,不能是https的
在客户端建立版本库并上传到Github
-
进入目录,比如labs目录,进行Git初始化操作,便把当前目录变成了版本库。
git init
-
添加文件到版本库。
git add README.md .vimrc
或者,这儿貌似没有提供遍历的参数
git add .
-
提交到仓库。
git commit -m "My first backup"
-
提交到Github,这样马马就不怕丢失我的代码啦!由于Github只支持使用SSH认证,所以首先必须在客户端建立公钥和密钥,然后把公钥传到Github账号下的SSH Keys。然后还得在Github下建立新仓库,使用如下命令。
git remote add origin git@github.com:blue-cat/.vimrc.git #把本地当前目录在远程地址url建立一个别名为origin的仓库,也就是远程仓库在本地的别名
git push -u origin master #git push <repository> <refspec>,repo是远程仓库,refs是远程仓库的分支,master或者dev或者branch-name
修改已有项目
-
修改后在git项目目录用
git status
来查看当前修改了哪些文件。还可以使用git add用来添加新的文件
-
首先需要提交到本地项目
git commit -a -m '修改注释' #当有-a参数时,会把所有修改过的文件都提交,而不加的时候需要先git add然后git commit来提交修改过的文件。而就算使用-a参数时,新添加的文件都不会被提交。
-
把提交的改动push到远程服务器
git push -u origin master #把本地master代码同步到远程origin分支#git remote show #可以用此命令查看远程所有分支
-
push后可以查看push的记录
git log
从现有项目克隆
-
git clone git://github.com/schacon/grit.git
这样会在当前目录建立grit目录,grit中存在.git目录
-
git clone git://github.com/schacon/grit.git mygrit
这样会在mygrit目录中
从现有项目更新
-
git fetch [remote-name],从远程更新代码到本地
git fetch origin master
-
在更新前一般远程会有多个人的仓库多个分支,要首先选择好分支,可以
git remote -v
查看所有仓库
分支使用
-
查看分支
git branch
-
新建分支
git branch new
-
切换到分支
git checkout new
-
从主干合并最新代码到分支
git merge master -m ''
-
提交最新改动到远程
git commit -m ''
git push origin new
-
删除远程分支
git push origin --delete new
回滚代码
revert和reset的区别: reset是把HEAD往后移动了一下,而revert是继续向前,只是新的commit和旧的相反。
-
强制回滚所有代码到某个版本
git reset --hard <version id>
-
把某个文件回滚到某个版本
git reset a4e215234aa4927c85693dca7b68e9976948a35e MainActivity.go
-
丢弃本地所有修改,强制回滚到和远程一样
git reset --hard origin/master
-
回滚一次提交
git revert HEAD
合并代码
-
正在改动时,需要紧急在上个提交的版本基础上修复一个bug,使用stash暂存,然后pull操作,最后使用stash pop进行merge,可能需要手动处理一下自动merge的情况。
git stash
git pull
git stash pop