好文档 - 专业文书写作范文服务资料分享网站

Git使用小结

天下 分享 时间: 加入收藏 我要投稿 点赞

Git使用小结原文链接:http://rogerdudler.github.io/git-guide/index.zh.htmlhttp://blog.a0z.me/2014/05/21/GitBeginning/参考链接(超详细):http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137584020什么是git?Git是一个版本控制软件。Git是一款分布式版本控制系统。这个“分布式”,要和“集中式”(svn)放在一起理解。“集中式版本控制”,就好比这一个团队中,版本库都集中在一台服务器上,每个开发者都要从服务器上获取最新的版本库后才能进行开发,开发完了再把新的版本提交回去。而“分布式版本控制”,则是这个团队中每个人的电脑上都会有一份完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。工作流 在将修改过的文件提交到Git版本库的时候,需要git add将文件添加进去,实际上就是添加到暂存区,然后通过git commit提交文件,实质上就是将暂存区的所有文件一次性提交。一旦提交后,再使用git status命令,显示工作区是干净的。你的本地仓库由 git 维护的三棵“树”组成。第一个是你的 工作目录(工作区中有一个隐藏目录.git,这是Git的版本库,里面存储了名叫index的暂存区,还有Git为用户自动创建的一个分支master,以及指向master的一个指针叫HEAD),它持有实际文件;第二个是 暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。

初始化

用git init初始化git仓库。创建新文件夹,打开,然后执行 git init

# Git初始化的命令,用于新建git仓库

在当前目录中就会默认产生一个新目录:

.git/

git init --bare /path/to/repo.git #可以将直接新建到你想存放仓库的位置/path/to/repo.git

检出仓库

执行如下命令以创建一个本地仓库的克隆版本:git clone /path/to/repository

如果是远端服务器上的仓库,你的命令会是这个样子:git clone username@host:/path/to/repository

添加和提交

git add # 把文件添加到暂存区

git commit -m \

$ git add README.txt$ git commit -m \ README\

第一个命令是告诉Git要追踪什么文件,第二个命令是进行提交,并对此次提交做个简答说明。当然,今后他再对README做什么修改,都可以这样做。Git会自动为此次提交生成一个16进制的版本号。

如果此时查看本地的版本库,就会发现最新的一次提交是在刚才,提交说明为:add README。

可以用git status 查看本地仓库的修改状态。

添加远程库

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。

首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库Test2。

在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。

目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。

现在,我们根据GitHub的提示,在本地的learngit仓库下运行命令:

$ git remote add origin git@github.com:nickYDQ/Test2.git

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

下一步,就可以把本地库的所有内容推送到远程库上:

$ git push -u origin master

Counting objects: 19, done. Delta compression using up to 4 threads. Compressing objects: 100% (19/19), done.

Writing objects: 100% (19/19), 13.73 KiB, done.

Total 23 (delta 6), reused 0 (delta 0) To git@github.com:michaelliao/learngit.git * [new branch] master -> master

Branch master set up to track remote branch master from origin.

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地

的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:

推送改动

推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;

关联后,使用命令git push -u origin master第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。

你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库: git push origin master

可以把 master 换成你想要推送的任何分支。

如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:

git remote add origin

如此你就能够将你的改动推送到所添加的服务器上去了。

分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!

分支

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。

分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,所以在同一个数据库里可以同时进行多个修改。

创建一个叫做“feature_x”的分支,并切换过去:git checkout -b feature_x切换回主分支:

git checkout master再把新建的分支删掉:git branch -d feature_x

除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:git push origin

也可以直接用git branch branch_name 直接创建该分支再git checkout branch_name 切换至刚刚创建的分支

git branch 显示分支一览表更新与合并

要更新你的本地仓库至最新改动,执行:git pull

以在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。

在合并改动之前,可以使用git diff可以查看工作树、暂缓区、最新提交的差异:git di? 1.要合并的文件只在分支上做了修改

要合并其他分支到你的当前分支(例如 master),执行:git merge

这时直接将分支上的内容合并到master。(一般是Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。))2.合并文件在master和分支上都做了修改

在这种情况下,会出现冲突。 这时候就需要修改这些文件来手动合并这些冲突(conflicts)。git status也可以告诉我们冲突的文件,也可以直接用cat查看文件的内容:

克隆

如果你想获得一份已经存在了的 Git 仓库的拷贝,比如说,你想为某个开源项目贡献自己的一份力,这时就要用到 git clone 命令。Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。

克隆仓库的命令格式是 git clone [url] 。 比如,要克隆 Git 的可链接库 libgit2,可以用下面的命令:

$ git clone https://github.com/libgit2/libgit2

这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。 如果你进入到这个新建的 libgit2 文件夹,你会发现所有的项目文件已经在里面了,准备就绪等待后续的开发和使用。 如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以使用如下命令:

$ git clone https://github.com/libgit2/libgit2 mylibgit

这将执行与上一个命令相同的操作,不过在本地创建的仓库名字变为 mylibgit。

Git 支持多种数据传输协议。 上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用 SSH 传输协议,比如 user@server:path/to/repo.git 。

log

如果你想了解本地仓库的历史记录,最简单的命令就是使用: git log

git log --graph 以图表的形式查看分支

你可以添加一些参数来修改他的输出,从而得到自己想要的结果。 只看某一个人的提交记录:git log --author=bob

一个压缩后的每一条提交记录只占一行的输出:git log --pretty=oneline

或者你想通过 ASCII 艺术的树形结构来展示所有的分支, 每个分支都标示了他的名字和标签: git log --graph --oneline --decorate --all看看哪些文件改变了: git log --name-status

这些只是你可以使用的参数中很小的一部分。更多的信息,参考:git log --help

版本回溯

假如你操作失误,你可以使用如下命令替换掉本地改动:git checkout --

此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。

要想让仓库的HEAD、暂缓区、当前工作树都回到指定的历史状态。在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。如果你想回溯到上一个版本:git reset --hard head^

还可以通过先git log查看提交日志,然后根据前面的版本号可以指定回到未来的某个版本(版本号没必要写全,前几位就可以了,Git会自动去找。):

$ git reset --hard commit_id

或者:只要提供目标时间点的哈希值,就可以完全回溯至该时间点的状态。

git reset <哈希值>

现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?Git提供了一个命令git reflog用来记录你的每一次命令:

$ git re?og

假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:git fetch origin

git reset --hard origin/master

实用小贴士

内建的图形化 git:gitk

彩色的 git 输出:git con?g color.ui true

显示历史记录时,每个提交的信息只显示一行:git con?g format.pretty oneline

Git使用小结

Git使用小结原文链接:http://rogerdudler.github.io/git-guide/index.zh.htmlhttp://blog.a0z.me/2014/05/21/GitBeginning/参考链接(超详细):http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0
推荐度:
点击下载文档文档为doc格式
4iero4lcst2wkqq4mj6h371qz5d0ci00ko3
领取福利

微信扫码领取福利

微信扫码分享