安装Git-Core:
| |
因为要用到 Gitosis ,所有,需要安装python setuptools
| |
安装 Gitosis
| |
增加名为Git的用户
| |
上传公钥到USER用户的根目录下(如果没有,用 ssh-keygen -t rsa 生成)
| |
到这一步,基本上都安装好了,到本地进行测试:
| |
成功后,在本地将有一个gitosis-admin目录,里面有gitosis.conf,keydir。
为Rails项目配置git
打开gitosis.conf,增加一块内容,members为某个用户的公钥~/.ssh/id_rsa.pub中的名字(在该文件的最后在)
| |
然后,提交修改
| |
将本地代码提交到git中
| |
创建 .gitignore 文件,用于忽略某些不需要进行代码管理的内容
| |
提交代码
| |
接下来,可以增加成员的公钥到系统中了
| |
修改gitosis.conf
| |
提交修改
| |
其它成员就可以获取代码了
| |
2 简介GIT是一个分布式的版本控制系统。
分布式的意思是它不依赖一个中央服务器,每个开发者clone得到的仓库都包含了完整的变更记录。
3 GIT 的四种协议file: 只能访问本地repository
git:后台运行git-daemon,这种方式架设简单,运行速度快,但是传输的数据没有加密。
ssh:安全可靠的连接,如同访问本地文件一样,但是权限不好控制。
http/https:通过webdav实现,可以通过浏览器查看代码,权限管理与svn协议相同,https保证了数据传输的安全,但是配置复杂。
4 配置git告诉其他开发者你是谁,怎么联系你。
这些信息可以是全局的,也可以在某个项目中单独设置。
全局的配置文件位于~/.gitconfig
项目的配置文件位于<project>/.git/config
5 配置git全局配置
git config --global user.name “yourname”
git config --global user.email you@site.com
单个项目配置
git config --local user.name “yourname”
git config --local user.email you@site.com
6 要把本地项目文件纳入GIT管理,直接在本地项目目录中执行
git init
git add *
git commit -a -m "sth."
新建GIT项目
在代码服务器上:
mkdir <project>
cd <project>
git init
7 把本地git的库导入代码服务器中
代码服务器新建GIT项目:
cd /work/projects
mkdir <project>
cd <project>
git init --bare
本地(必须是commit过了的):
cd <project>
git remote add origin <yourname>@server:/path/to/project
git push origin master
以后提交到代码服务器只需要:
git push
pull测试:
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
git pull
8 从repository中取出代码
使用ssh协议
git clone yourname@192.168.8.91:/work/projects/cerberus
上一条命令取出的代码,包含了该repository完整的修订记录,从项目的创建到目前的最新版本。分布式就表现在这个地方,远程服务器上是一个完整的repository,你取出的代码是完整的,另一名开发者取出的代码也是完整。
9 git的常用命令查看提交的日志信息
git log
查看项目中所有文件的状态
git status
增加了哪些文件
修改了哪些文件
哪些文件没有被git追踪(通常是自动生成的文件)
…
10 git的常用命令添加文件到项目中
git add <filename>
删除项目中的文件
git rm <filename>
重命名
git mv <filename>
<filename>可以是一个文件,也可以是一个目录。对于add,会自动添加该目录下的所有文件。对于rm,加上-r参数可以删除整个目录。
11 git的常用命令只提交新增的文件
git commit
提交新增的文件,以及修改过的文件
git commit -a
git commit 需要填写日志,如果为空,git放弃本次提交。git 的日志对格式有一定的要求,但不是强制的。
12 git 的日志格式short description (lesser than 50 letters)
detail description
* file1: yourchanges
* file2: yourchanges
…
13 更新和提交更新代码
git pull
错误:
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.
If you often merge with the same branch, you may want to
use something like the following in your configuration file:
[branch "master"]
remote = <nickname>
merge = <remote-ref>
[remote "<nickname>"]
url = <url>
fetch = <refspec>
See git-config(1) for details.
解决:
Under [branch "master"], try adding the following to the repo's Git config file (.git/config):
[branch "master"]
remote = origin
merge = refs/heads/master
或者:
$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master
http://stackoverflow.com/questions/658885/how-do-you-get-git-to-always-pull-from-a-specific-branch
把修改后的代码提交到远程repository
git commit -a #提交 到本地git repository
git pull #取出远程repository中最新的代码
可能需要合并冲突
git push #提交到远程 repository
git push出错:
fatal: No destination configured to push to.
解决:
$ git remote add origin yourname@192.168.8.91:/work/projects/cerberus
// to push the master branch to the origin remote we added above:
$ git push origin master
// after that you can just do:
$ git push
http://blog.csdn.net/brave_heart_lxl/archive/2010/04/20/5507099.aspx
14 git checkoutgit checkout可以取出以下对象
一个版本
一个分支
一个文件
15 git 的 版本号git 使用一个40位数字来表示版本号;
HEAD 表示本地仓库的当前版本号
HEAD^表示本地仓库的上一个版本号
取出某个特定版本:
git checkout e9e986b7f1b7b1a0acf4b919e23e929705a8a209
git check “HEAD^”
16 放弃修改放弃某个文件或目录的修改
git checkout <filename>
放弃所有修改,回到某一个版本
git reset HEAD
git reset --hard HEAD
17 版本回退有时候会发现新的代码根本不能工作,我们可能需要回退到一个旧的版本,有两种方式:
git revert HEAD
这种方式会记录下错误的修改,以及回滚的历史
git reset “HEAD^”
这种方式直接放弃当前的版本,退回上一个版本,不会记录所做的修改。
18 分支管理查看分支列表
git branch
git branch -a #查看包括远程repository在内的所有分支
创建并切换到新的分支
git branch <barnch_name>
git checkout <branch_name>
或者
git checkout -b <branch_name>
19 删除分支:
如果分支已经合并到master
git branch -d <branch_name>
如果分支还没有被合并,可以强制删除
git branch -D <branch_name>
不能删除当前的分支
20 合并分支git merge <branch>
git 会尝试自动合并分支中冲突的内容
如果合并失败,会在文件中以diff的形式显示两者的差异,用户需要手动解决冲突
21 当合并失败git会提示那些冲突无法自动合并,有两种解决方法:
手工修改这些文件,合并其中的内容,然后commit。
使用当前分支,或者要合并分支的内容,然后提交
git checkout --ours <conflict file>
git checkout --theirs <conflict file>
- 下载 repo 的地址: http://android.git.kernel.org/repo ,可以用 wgethttp://android.git.kernel.org/repo 或者 curl http://android.git.kernel.org/repo >~/bin/repo 来下载 repo , chmod a+x ~/bin/repo
- 用repo sync 在抓去 android source code 的时候,会经常出现一些错误导致 repo sync 中断,每次都要手动开始。 可以用如下的命令,来自动重复: $?=1; while [ $? -ne 0 ] ; do repo sync ; done
- repo help [ command ] , 显示command 的详细的帮助信息内容
- repo init -u URL , 在当前目录安装 repository ,会在当前目录创建一个目录 ".repo" -u 参数指定一个URL, 从这个URL 中取得repository 的 manifest 文件。 repo init -u git://android.git.kernel.org/platform/manifest.git
可以用 -m 参数来选择 repository 中的某一个特定的 manifest 文件,如果不具体指定,那么表示为默认的 namifest 文件 (default.xml) repo init -u git://android.git.kernel.org/platform/manifest.git -m dalvik-plus.xml
可以用 -b 参数来指定某个manifest 分支。
repo init -u git://android.git.kernel.org/platform/manifest.git -b release-1.0
可以用命令: repo help init 来获取 repo init 的其他用法
4. repo sync [project-list]
下载最新本地工作文件,更新成功,这本地文件和repository 中的代码是一样的。 可以指定需要更新的project , 如果不指定任何参数,会同步整个所有的项目。
如果是第一次运行 repo sync , 则这个命令相当于 git clone ,会把 repository 中的所有内容都拷贝到本地。 如果不是第一次运行 repo sync , 则相当于 git remote update ; git rebase origin/branch . repo sync 会更新 .repo 下面的文件。 如果在merge 的过程中出现冲突, 这需要手动运行 git rebase --continue
5. repo update[ project-list ]
上传修改的代码 ,如果你本地的代码有所修改,那么在运行 repo sync 的时候,会提示你上传修改的代码,所有修改的代码分支会上传到 Gerrit (基于web 的代码review 系统), Gerrit 受到上传的代码,会转换为一个个变更,从而可以让人们来review 修改的代码。
6. repo diff [ project-list ]
显示提交的代码和当前工作目录代码之间的差异。
7. repo download target revision
下载特定的修改版本到本地, 例如: repo download pltform/frameworks/base 1241 下载修改版本为 1241 的代码
8. repo start newbranchname
创建新的branch分支。 "." 代表当前工作的branch 分支。
9. repo prune [project list]
删除已经merge 的 project
10. repo foreach [ project-lists] -c command
对每一个 project 运行 command 命令
11. repo status
显示 project 的状态