题记:linux之父Linus 最大的发明便是创造了git-分布式版本管理工具 。
最近在搭建git服务器,于是梳理I了下git笔记。
-------
FYI
-----------------------
1.Git安装
sudo apt-get install -y git-core
配置 Git
以下命令为配置 Git 相关信息。 一般不建议使用--global
git config --global user.name "wule"
git config --global user.email wule320@163.com
git config --global color.ui true # 使用git默认的配色方案,推荐
git config --global --list # 查看配置信息
git config --global color.diff true #显示diff时色彩亮
git config --global alias.co checkout # 取个别名
2.Git常用操作
git add *.c 把所有的c文件放入暂存区
git add Makefile.mk把名为Makefile.mk的文件放入暂存区
git add android4.0/ 把名为android4.0的目录里的所有文件放入暂存区
git add * 把当前目录的所有文件都放入暂存区
git rm --cached android4.0/ -r //把名为android4.0的目录里的所有文件取消暂存
git rm --cached readme.txt //把名为readme.txt的文件取消暂存
git commit -m '初始化版本库' //提交代码到本地仓库
git diff --staged # 已经暂存起来的文件和上次提交时的快照之间的差异 也可以用 git diff --cached
git diff # 直接使用此命令是 工作目录中当前文件和暂存区域快照之间的差异
git rm --cached file//文件从 Git 仓库中删除(亦即从暂存区域移除),仍保留在当前工作目录
git rm file //移除文件,强制删除选项 -f
git mv test.txt test1.txt//在 Git中对文件改名
git log --author=xx -p //查看xx的提交历史,并显示每一次修改的diff
git commit --amend -m 'first too'//撤消操作重新提交
git whatchanged //列出项目开发中的修改历史
git clone 远程代码 //克隆代码
git checkout -b branch_name //创建分支
git add file//添加代码到分支的暂存区
git show commit //查看一个commit
git commit -m "本次提交的注释" //提交代码到分支
git checkout master//切换到主版
git pull origin master //获取远程最新代码
git merge branch_name //合并某分支到master分支
git pull origin master //获取远程最新代码
git push origin master //推送master分支
git branch -d branch_name //没有问题了删除本地分支
git rm --cached dir/ -r //把名为dir的目录里的所有文件取消暂存
git init //初始化空仓库=git init-db
git commit -m "[manage20120518]完成XX的添加、修改功能"
git fetch master //确认已经获取了最新的主分支
git branch experimental//建立管理分支
git branch //列出git所有存在的分支
git checkout experimental 切换到制定分支
git merge experimental 合并分支
git branch -d experimental 删除分支在分支已经合并到主干上后
git branch -D experimental 删除分支无论如何
type *.txt //show the txt
git status //查看当前状态
补充对于任何一个文件,在 Git 内都只有三种状态 ,
已提交 committed 已提交表示该文件已经被安全地保存在本地数据库中了
已修改 modified 已修改表示修改了某个文件,但还没有提交保存
已暂存 staged 已暂存表示把已修改的文件放在下次提交时要保存的清单中
3.Git 使用规范
使用Git过程中,必须通过创建分支进行开发,坚决禁止在主干分支上直接开发。review的同事有责任检查其他同事是否遵循分支规范。
在Git中,默认是不会提交空目录到版本库中,需要在该目录下新建一个 .gitignore 的空白文件提交
代码回溯:不属于自己修改的代码被覆盖的情况
1.把外部文件纳入到自己的 Git 分支来的时候先比对,确认所有修改都是自己修改的。
2.多人协作时,不要各自在自己的 Git 分支开发,然后发文件合并。正确的方法应该是开一个远程分支,然后一起在远程分支里协作。不然,容易出现代码回溯
3.提交代码一定要 git diff 看提交的东西是不是都是自己修改的。如果有不是自己修改的内容,很可能就是代码回溯
4.review 代码的时候如果看到有被删除掉的代码,一定要确实是否是写代码的同事自己删除的。如果不是,很可能就是代码回溯
4.git原理
cd android4.0/
git init //初始化当前所在目录的这个项目
ls -a
git add . //git给目前的这个项目制作一个快照snapshot,git管快照叫做索引index)。快照一般会暂时存储在一个临时存储区域中
git commit //将快照里登记的内容永久写入git仓库中,也就是开发者已经想好了要提交自己的开发成果了
git diff //修改后和修改前的不同之处
git add *.txt //已经修改或增加了 *.txt文件,git去检查一下
如果修改了项目代码,先git add你修改过的文件,再git diff并git status查看确认,然后git commit提交,然后输入你的开发日志,最后git log再次确认。
git commit -a,//直接提交所有修改 = git add git commit
git log -p //给出开发日志,而且显示每个开发版本的代码区别
working directory 工作区
git add *
staging area/ index
git commit
repository 仓库
git commit -m “this is frist commit”
git checkout -f HEAD //从.git中找到删除的文件
git objests 对象,创建,不能改变
三种类型的object
blob 存储数据的文件 叶子
tree 类似目录指向目录或文件 树
commit 指向树
tag 指向commit 通过标签能找到commit对应的tree
ls -l .git/objects/
40字节 =2字节用于目录 +38字节 便于查找
git cat-file -t 哈希值 //查看文件的类型
git ls-tree 哈希值 //查看树的包含内容
git show -s --pretty=raw 哈希值 查看commit的内容
branh
|
commit
|
tree
|
blob
References 引用 ,可改变
Braches
HEAD
Remote Braches
git object Model
HEAD //指向当前工作分支
|
branch
|
remote ->commit< - tag
|
tree
|
blob
git tag v1.0 //轻量级创建tag
git tag -a milestone1.0 -m "this is the first stable version" //重量级创建TAG。对象
变更代码提交代码时打上标签,便于恢复,checkout
提取标签 并打包
git archive --format=tar --prefix=ruby/ v1.0 | gzip > /tmp/ruby1.0.tar.gz
归档 打成tar格式 项目 tag 压缩 路径
分支 -主线
git init
git add .
gitcommit -m "frist commit"
find
git branch
git commit -a -m "second commit"
git branch testing 当前对象创建分支 testing
git checkout testing 切换到指定的分支
master始终指向最近创建的commit
HEAD始终指向当前分支,TAGs不会变化
合并
git branch 列出所有分支,查看当前所在分支 *
git checkout master 切换到目的分支
git merge testing 然后将指定的其他分支testing合并到目的分支master下
commit 可以有多个父对象,在合并情况下,一般为一个父对象。
git branch -D testing 删除分支
three-way merge
git 目录
它是 Git 用来保存元数据和对象数据库的地方。每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
工作目录
从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从 git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑
暂存区域
所谓的暂存区域只不过是个简单的文件,一般都放在 git 目录中。有时候人们会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。
基本的 Git 工作流程
1、在工作目录中修改某些文件。
2、对这些修改了的文件作快照,并保存到暂存区域。
3、提交更新,将保存在暂存区域的文件快照转储到 git 目录中。
已跟踪
已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。
初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。
未跟踪
而所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。比如:一个全新的文件。
已修改
在编辑过某些文件之后,Git 将这些文件标为已修改。我们逐步把这些修改过的文件放到暂存区域,然后等最后一次性提交暂存区域的所有文件更新,如此重复。
5.Git 项目仓库常见方法
在现存的目录下,通过导入所有文件来创建新的 Git 仓库从已有的 Git 仓库克隆出一个新的镜像仓库来
一、从当前目录初始化
cd android4.0
git init //初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
git add
git commit -m "bulid frist android4.0 version "
这样我们就创建了一个新的 Git 仓库
二、从现有仓库克隆
git clone 把项目的Git 仓库复制一份出来
Git 收取的是项目历史的所有数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了。
实际上,即便服务器的磁盘发生故障,用任何一个克隆出来的客户端都可以重建服务器上的仓库,回到当初克隆时的状态。
命令格式为: git clone [url] [projectName]
git clone git://xxx.com/xxx/xxx.git myandroid
git gc
记录每次更新到仓库
6.远程仓库的使用
同他人协作开发某个项目时,需要管理这些远程仓库,以便推送或拉取数据,分享各自的工作进展。
管理远程仓库的工作,包括添加远程库,移除废弃的远程库,管理各式远程库分支,定义是否跟踪这些分支,等等。
5.1.查看当前的远程库
使用git remote 查看当前配置有哪些远程仓库,至少可以看到一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库:
git remote # 列出每个远程库的简短名字
origin
git remote -v # 显示对应的克隆地址
6.2.添加远程仓库
要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用格式:git remote add [shortname] [url]:
git remote add mygit git://XXX.com/XXX/XXX.git
现在可以用字串 mygit 指代对应的仓库地址了
6.3.从远程仓库抓取数据
命令 git pull [remote-name]
此命令会到远程仓库中拉取所有你本地仓库中还没有的数据,将远端的数据拉到本地仓库。
运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支
如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。
6.4.推送数据到远程仓库
项目进行到一个阶段,要同别人分享目前的成果,可以将本地仓库中的数据推送到远程仓库。
实现这个任务的命令很简单: git push [remote-name] [branch-name]。
如果要把本地的 master 分支推送到 origin 服务器上(再次说明下,克隆操作会自动使用默认的 master 和 origin 名字),
可以运行下面的命令:
git push origin master
远程仓库的删除和重命名
git remote rename mygit mygittest
移除远程仓库
git remote rm mygit