0.git简介
git是一种高效、快速的分布式版本管理工具。特点:
本地拥有整个代码仓库(可以将远程仓库全部同步到本地);
每次提交都生成所有代码的一个快照(包含所有代码的引用而不只是差量),并且生成一个sha-1标识码作为此次提交的索引;
本地代码划分为工作区(可修改,测试稳定后加入阶段区)、阶段区(保存相对稳定的代码,准备提交)、提交区(保存稳定的代码,准备推送到远程库)3个区域。
1.ubuntu安装git
$sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev git-core
2.git仓库(Repository)管理
2.1仓库的组成
三种对象及其关系:提交(commit)、树(tree)——文件列表、原文(blob)——源码;大致关系为提交引用树,树引用原文。不必深究。
仓库的存放位置:.git文件夹
2.2 创建仓库
2.2.1 对本地文件夹进行管理
$cd mydir
$echo "this is A" >> a.c
$echo "this is B">> b.c
$git init (注:初始化仓库,建立.git目录)
$git add * (注:在git内部系统中,共有3个区域。工作区、阶段区、已提交区。工作区为当前所有的修改,阶段区的内容通过git add添加,已提交区用git commit)
$git status (注:显示当前工作区与阶段区的内容)
$git commit -a -m "first created" (注:-a表示本次提交包括工作区的修改,而不只是阶段区的内容 -m 表示提交的说明。)
$git branch (注:显示当前分支)
*master (注:默认主分支)
2.2.2克隆远程仓库
$git clone remote_url local_dir (注:克隆远程仓库到本地local_dir目录下,同时会checkout当前分支)
2.3分支管理
2.3.1创建、查看分支
$git branch -b temp (注:以当前分支的最后一次提交为起点创建分支temp)
$echo "add D1" >> a.c
$git add a.c
$git commit -m "this is D1" (注:提交D1到分支temp,现在temp的最后一次提交是D1)
$echo "add D2" >> a.c
$git add a.c
$git commit -m "this is D2" (注:提交D2到分支temp,现在temp的最后一次提交是D2)
$echo "add D2 D2" >> a.c
$git add a.c
$git commit --amend (注:重新提交D2到分支temp,相当于删除刚才的提交,然后再提交)
$git checkout master (注:从分支temp切换到分支master,亦即从分支temp的最后一次提交切换到分支master的最后一次提交,修改工作区)
$echo "add C2" >> a.c
$git commit -a -m "this is C2"
$echo "add C3" >> a.c
$git commit -a -m "this is C3"
$echo "add C4" >> a.c
$git commit -a -m "this is C4"
$git log (注:查看当前分支的提交记录,可以获取C2的SHA-1标识)
$git branch development 39c2a2399a73...417 (注:以C2为起点创建分支development)
$git branch development2 development (注:以development分支的最后一个结点为起点创建分支development2)
$git branch -d development (注:删除分支development,如果工作区的内容没有提交就无法删除)
$git branch -D development (注:强制删除分支development,忽略工作区)
$git branch (注:查看所有分支)
$git merge-base master development (注:显示master分支和development分支的共同结点的sha-1)
2.3.2合并分支与解决冲突
$git checkout master
$git merge temp (注:将分支temp的改动合并到当前分支即master上并提交。实际上就是将temp分支的最后一次提交合并到master分支的最后一次提交上,再产生一次提交)
$git merge --no-commit temp (注:将分支temp的改动合并到当前分支即master上但不提交,只修改工作区)
$git merge -m "merge from temp" temp (注:将分支temp的改动合并到当前分支即master上并提交,提交说明为merge from temp)
$git cherry-pick sha-1 (注:将提交sha-1合并到当前分支上,提交sha-1可以属于任意分支)
如果合并中出现冲突,系统会自动以一种特殊的格式写入源文件。一般的冲突格式如下:
<<<<<<< HEAD
this is C5
=======
this is A_2
>>>>>>> temp
前面上当前分支中的内容,后面是temp分支中的内容。
当冲突比较简单时,可以手动修改源文件,解决冲突后,调用git commit提交(当合并出现冲突时,系统是不会提交的)。
当冲突比较复杂时,可以执行git mergetool启动事先配置的外部工具进行合并(如何配置,下文有述)。
2.3.3改变分支的起点
rebase的具体过程是找到两个分支的共同结点(即分叉处),逐个找到当前分支中每个节点与共同结点的差别,并
把此差别提交到另一个分支上,从而在另一个分支上产生一次或多次提交。
假设master是主分支,development是某个测试分支。
$git checkout development
$git rebase master (注:将当前分支rebase到master分支上)
$git rebase --onto master development issue (注:把development分支中与issue分支共同结点以后的部分rebase到master分支上)
2.3.4 删除提交
$git log --pretty=oneline (注:--pretty=oneline 表示每次提交的信息占一行)
$git reset --soft HEAD~2 (注:--soft 表示只复位已提交区;HEAD~2表示越过2个结点,即复位到倒数第4个结点)
$git reset --hard HEAD^^^ (注:--hard表示复位已提交区、暂存区和工作区;HEAD^^^表示复位到倒数第4个结点)
$git reset --soft 417114d...bbcc (注:复位到SHA-1标识为417114d...bbcc的那次提交)
与git reset类似的是git revert,后者会产生一次新的提交(与以前的提交相反,一般不建议使用,以免引起混乱)
2.3.5 无引用的提交恢复引用
导致无引用提交的操作:复位、删除分支
恢复引用的方法:首先找到无引用提交的sha-1,然后git reset sha-1或 git branch sha-1
获取无引用提交的sha-1的方法:git log (只显示当前分支的结点) 或 git reflog(可以显示所有分支的结点)
3. 与远程仓库进行交互
$git clone remote_url local_dir (注:克隆远程仓库到本地,建立了远程库远程分支origin/master及其本地跟踪分支master,并checkout到master)
$git fetch origin (注:从远程库同步代码,改变了远程库远程分支origin/master)
$git pull origin(注:从远程库同步代码,改变了远程库远程分支origin/master,并把origin/master合并到master上)
......修改代码,并提交到本地跟踪分支master......
$git push origin (注:将本地修改同步到远程库,完整格式为git push git_name src:des,当des与src同名时可省略:des)
4.比较代码
$git diff HEAD (注:比较当前工作区与上一次提交,HEAD可省略)
$git diff --cached HEAD (注:比较当前暂存区和上一个提交)
$git diff sha-1 sha-1 (注:比较两个提交)
5.生成patch与合入patch
$git format-patch sha-1 sha-1 (注:比较两次提交,生成patch)
$git am [patch|patch_dir] (注:将某个patch或某个目录下所有的patch合入)
6.打标签
$git tag -a v1.4 -m "version1.4" (注:为当前分支的最后一个提交创建标签对象,名称为v1.4,注释为version1.4,-a 表示创建标签对象而不是轻量级标签)
$git tag v1.2 sha-1 (注:为标识为sha-1的提交创建轻量级标签,名称为v1.2)
$git tag (注:查看所有的tag)
$git show v1.4 (注:查看指定名称的tag)
$git tag -d v1.4(注:删除名称为v1.4的tag)
7.git配置
配置文件及其效力:/etc/gitconfig 小于 ~/.gitconfig 小于 .git/config
修改配置文件的相应命令:git config --[system|global|local] name value(当然也可以不通过命令,直接编辑配置文件)
基本信息配置:user.name user.email
查看当前配置:git config --list
忽略文件配置:创建或修改.gitignore文件(与.git在同级目录)
取消GIT对文件的跟踪管理:git rm [-r] --cached filename