git 简明使用手册
2014-09-28 11:07
190 查看
git 使用简明手册
git 是由Linus Torvalds领衔开发的一款开源、分布式版本管理系统,显然,git最初是为了帮助管理Linux内核开发而开发的版本控制系统。版本控制系统本身并不要求一个中央服务器(远端仓库)来存储所有数据,虽然svn是这样做的。
Git允许克隆仓库,克隆的仓库跟被克隆的仓库的数据和功能完全一样,中央服务器的概念只是使用上的一种习惯;
每个仓库都可以和其它仓库交换文件,从而实现仓库数据的同步。
代码在workspace、本地仓库、远端仓库之间的数据同步流程图如下:
从上面的流程图可以看出,本地git仓库是由三棵“树”组成:
1、工作目录,它持有实际文件;
2、
暂存区(Index),它像个缓存区域,临时保存你的改动;
3、
HEAD,它指向你最后一次提交的结果。
可见,workspace与本地仓库Repository之间的代码流动,跟SVN的workspace和服务器中央仓库之间的流动类似,通过checkout、add、commit命令控制。
与SVN不一样的是,git是分布式的,不存在一个托管所有代码的“中央服务器”。
或者从某种意义上来说,git有很多“中央服务器”,这些“中央服务器”可以是本地仓库,也可以是远端仓库,仓库之间也可以进行代码同步。
创建新仓库(init)
创建新文件夹,打开,然后执行git init
以创建新的 git 仓库。
克隆仓库(clone)
执行如下命令以创建一个本地仓库的克隆版本:git clone /path/to/repository
如果是远端服务器上的仓库,你的命令会是这个样子:
git clone username@host:/path/to/repository
该命令会在本地主机生成一个目录,与远程主机的版本库同名。如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数:
git clone <版本库的网址> <本地目录名>
另外,git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子:
git clone http[s]://example.com/path/to/repo.git/ git clone ssh://example.com/path/to/repo.git/ git clone git://example.com/path/to/repo.git/ git clone /opt/git/project.git git clone file:///opt/git/project.git git clone ftp[s]://example.com/path/to/repo.git/ git clone rsync://example.com/path/to/repo.git/
远程主机管理(remote)
列出所有的远程主机名:git remote
加上选项-v可以查看远程主机的地址
对远程主机的操作:
git remoteshow <主机名>
git remoteadd <主机名> <网址>
git remoterm <主机名>
git remoterename <原主机名> <新主机名>
修改和提交(add/commit)
你可以提出更改(把它们添加到暂存区),使用如下命令:git add <filename> git add *
这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:
git commit -m "代码提交信息"
现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。
查看(diff/status/log)
查看版本修改的历史日志git log --pretty=oneline
git的版本号与SVN的纯数字不一样,它是一个SHA1计算出来的一个非常大的数字,用十六进制表示。
查看working directory的具体修改
git diff git diff filename
查看working directory的修改状态
git status
推送改动(push)
你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库:git push <远程主机名> <本地分支名>:<远程分支名>
如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
分支(checkout)
分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。创建一个叫做“feature_x”的分支,并切换过去:
git checkout -b feature_x
切换回主分支:
git checkout master
再把新建的分支删掉:
git branch -d feature_x
除非你将分支推送到远端仓库,不然该分支就是不为他人所见的:
git push origin <branch>
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。
比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支。
Git也允许手动建立追踪关系:
git branch --set-upstream master origin/next
上面命令指定master分支追踪origin/next分支。
获取分支(fetch)
fetch命令可以将远端主机的更新取回本地:git fetch <远程主机名> <分支名>
若省略<分支名>,则更新远程主机的全部分支。
所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取,比如origin主机的next分支,就要用origin/next读取。
git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。
git branch -r git branch -a
取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支
git checkout -b newBrach origin/next
此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支
git merge origin/next 或者 git rebase origin/next
更新与合并(pull)
取回远程主机某个分支的更新,再与本地的指定分支合并:git pull <远程主机名> <远程分支名>:<本地分支名>
如果本地分支名是当前分支,本地分支名可以省略不写;
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
git pull origin
上面命令表示,本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并。
如果当前分支只有一个追踪分支,连远程主机名都可以省略:
git pull
上面命令表示,当前分支自动与唯一一个追踪分支进行合并。
例如,取回远程主机origin的next分支,与本地的master分支合并,可以执行:
git pull origin next:master
这等同于先做git fetch,再做git merge:
git fetch origin next
git merge origin/next
在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:
git add <filename>
在合并改动之前,你可以使用如下命令预览差异:
git diff <source_branch> <target_branch>
标签(tag)
为软件发布创建标签是推荐的。这个概念早已存在,在 SVN 中也有。你可以执行如下命令创建一个叫做 1.0.0 的标签:git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。可以使用下列命令获取提交 ID:
git log
你也可以使用少一点的提交 ID 前几位,只要它的指向具有唯一性。
替换本地改动
假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动:git checkout -- <filename>
此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。
假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
git fetch origin git reset --hard origin/master
实用小贴士
内建的图形化 git:gitk
彩色的 git 输出:
git config color.ui true
显示历史记录时,每个提交的信息只显示一行:
git config format.pretty oneline
交互式添加文件到暂存区:
git add -i
参考文档:
http://rogerdudler.github.io/git-guide/index.zh.html http://www.ruanyifeng.com/blog/2014/06/git_remote.html http://www.oschina.net/news/12542/git-and-svn http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
相关文章推荐
- MacOSX 中正则表达式简明使用手册
- Selenium简明使用手册(一)——发布与开发
- junit使用简明手册
- VB.NET简明使用手册(转帖 )
- VSS 2005简明使用手册
- junit使用简明手册
- Spring2.0简明手册(系列之一 Bean的配置及使用)
- Leo个人MSN简明使用手册
- junit使用简明手册
- WinCVS与CVSNT简明使用手册
- JunitPerf使用简明手册
- Selenium简明使用手册(二)——运行TestRunner
- JunitPerf使用简明手册
- junit使用简明手册
- StrutsTest使用简明手册
- EasyMock使用简明手册
- EasyMock使用简明手册 (转)
- EasyMock使用简明手册
- “易语言.飞扬”集成开发环境(EFIDE)简明使用手册(图)
- StrutsTest使用简明手册