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
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