您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: