2012年4月12日星期四

git基本用法


git的特点

git并不是存差异,而是存储完整的文件
git是分布式的,不用中心服务器
git的工作目录中的文件可以随时的从git目录".git"中的不同分支之间切换
git提交的不是当前工作目录的改动,需要手工的把改动提交到Index中,有三种状态: staged-已经提交到Index中的改动;modified-已经改动但没提交到Index中(之前已经提交到Index过);untracked-未加入到Index中改动。

git的概念

blob - 文件,存储文件内容
tree  - 目录, 指向tree或者blob
commit - 指向一个tree,标记当前的状态,记录元信息(作者,提交者,时间戳,之前的commit等)
tag - 用来给commit做标记

git的配置


git安装完后第一步是设置全局配置项,这个可以在用户目录下的.gitconfig文件下配置,包括user, email和autocrlf

git config --global core.autocrlf false#禁用换行自动转换
git config --global core.autocrlf input#开启输入换行自动转换,在提交时会将CRLF自动转换为LF
git config --global user.name "Jeromy Fu"
git config --global user.name "fuji246@gmail.com"

如果不是配置全局的,仅仅针对具体的项目配置,去掉上面的--global即可。 git有多种访问方式,git,http,ssh,git的效率更高,但http可以穿越防火墙。

git基本操作


git init -初始化仓库

git add file1 file2 -添加文件到Index(还未提交)

git diff -显示当前的改动(包括还未添加到Index中的)

git diff --cached -显示当前待提交(staged)的改动

git status -查看staged, modified和untracked的改动

git commit -提交Index中的改动到仓库

git commit -a -针对当前所有的改动(不包括新文件)一步完成git add和git commit的操作

在提交后,需要添加一些comment,最好的格式是第一行写一个概括性的描写,然后空格,然后是详细的描述,很多工具根据这个规则来将第一行作为邮件标题,详细描述作为邮件正文。

之前的一些工具新文件都是需要通过add命令来添加的,git的add也能添加新文件,但意义不太一样,是添加文件到Index中。

git branch branchname -添加新的分支

git branch -列出当前的所有的分支,并标识当前所在的分支

git checkout branchname -从git目录中(.git)取出branchname对应的分支

这里如果在创建分支之前文件已经更改,但还未提交,那么在checkout刚创建的分支时会自动合并文件。

git merge branchname -将当前分支和branchname分支合并

如果上面的merge有冲突,需要解决冲突再提交。可以使用git diff查看冲突

gitk - 显示当前分支改动的历史图示

git branch -d branchname -删除branchname的分支,(当前必须在其他分支),如果branchname的分支有未合并到当前分支(不一定是master)的内容,那么删除会失败,这个会确保branchname分支的内容会合并到其他的某个分支。

git branch -D branchname -强制删除branchname的分支
git diff -显示当前工作目录还未提交到Index中的改动,modified的。

git diff --cached -显示当前工作目录中已经提交到Index中的改动,staged的。

git diff HEAD -显示当前工作目录中所有改动,除untracked之外的。

git clone [uri] [dir] -克隆一个工程

git pull [uri] [branch] -从uri的特定分支拉代码,会自动合并

git remote add [name] [uri] -给远程的uri指定一个名称

git fetch [name]/[uri] -从uri的特定分支拉代码,不会自动合并。

git branch -r -查看远程的branch



git reset --hard 如果使用git init,push后需要使用这个命令才能看到新的内容,最好用git --bare init

git checkout -- file1 // 使用暂存区快照恢复工作目录文件,工作目录的文件修改被抛弃。
git reset HEAD file1 // 取消暂存区的文件快照


git clone后分支缺失,保存下面的shell脚本并执行,

#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do
    git branch --track ${branch##*/} $branch
done


参考:http://stackoverflow.com/questions/67699/how-do-i-clone-all-remote-branches-with-git


Git bare 和 non-bare 仓库 :
简单的说,bare的方式类似集中式的仓库,没有工作目录(working copy)。默认的
git init
创建的是non-bare的仓库,如果从其他地方push到这个non-bare的仓库,那么当前目录是不会出现最新的代码的,需要使用
git reset --hard
才能更新到最新的内容到当前工作目录。如果是作为中心仓库服务器,那么使用
git --bare init
来初始化仓库。

两者间转换:

bare -> non-bare: clone后删除之前的bare的就可以了
non-bare -> bare:
git clone --bare -l non_bare_repo new_bare_repo

参考链接:

http://sitaramc.github.com/concepts/bare.html
http://www.bitflop.com/document/111
 

没有评论:

发表评论