git的pull和clone有什么区别,第1张

从字面意思也可以理解,都是往下拉代码,git clone是克隆,git pull 是拉。

但是,也有区别:

从远程服务器克隆一个一模一样的版本库到本地,复制的是整个版本库,叫做clone(clone是将一个库复制到你的本地,是一个本地从无到有的过程)

从远程服务器获取到一个branch分支的更新到本地,并更新本地库,叫做pull(pull是指同步一个在你本地有版本的库内容更新的部分到你的本地库)

git pull相当于是从远程获取最新版本并merge(合并)到本地 git pull = git fetch + git merge,git fetch更安全一些

git clone是远程操作的第一步,通常是从远程主机克隆一个版本库,eg:$ git clone ## 该命令会在本地主机生成一个目录,与远程主机的版本库同名,如果要是制定不同的目录名,可以将目录名作为git clone 命令的第二个参数。eg:$ git clone #版本库网址# #本地目录名# git clone支持多种协议,除了http(s),还有ssh,git,本地协议。

git pull 作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。eg:$ git pull ##远程主机(origin) #远程分之(next)#:#本地分之(master)#

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。eg:$ git pull #远程主机(origin)#  #远程分之(next)# 相当于1 $ git fetch origin 2$git merge origin/next

在某些场合,git会自动在本地和远程分之之间,建立一种追踪关系。比如,在git clone 的时候,所有本地分之默认与远程主机的同名分之,建立追踪关系,也就是,本地的master分之自动“追踪”origin/master分之。git 可以手动建立追踪, git branch --set-upstream master origin/next --->指定master分之追踪到origin/next。

如果当前分支只有一个追踪分支,连远程主机名都可以省略。$ git pull 表示当前分之自动与唯一一个追踪分之进行合并。

TortoiseGit使用入门 本地使用Git 首先要确定TortoiseGit已找到msysgit,如果先安装msysgit 再装TortoiseGit, 一般TortoiseGit 就会自动的识别。 安装详见TortoiseGit安装教程 设置与查询的方法,这里从开始菜单进入设置。 这是TortoiseGit的设置界面,可以看到用来定位MSysGit的路径。 点“Check now”检查有效性。如果有错的话,就自己设置msysgit的bin文件路径。 右击任意文件夹,可以看到TortoiseGit已经嵌入右键了。 “Git Clone”是获得远程的版本库,“Git Create repository here”是将选定的文件夹作为要创建的版本库。 在要创建版本库的文件夹中点“Git Create repository here”后,会显示: 点“Ok”就会在该文件夹的根目录自动创建一个隐藏文件夹"git" 。 注意:最好找个空的文件夹练习操作,或者备份文件夹。比如误选了Clean up把无版本控制的文件都删了,哭都来不及 -_-。 现在,用git初始化过的文件夹就不一样啦!! 不仅文件都有附加的绿钩图标(此为已添加进版本库且未被修改过的文件),右键菜单也多了操作选项。 将要使用git版本库管理的文件,选择后用git的菜单add进去 master是Git默认的主要分支(主干),适合单人独自开发。

说明: 本地repo已经有啦,对应的远程repo 为tiger, 本地分支为master。

问题一: 当拉取代码的remote repo仓库为tiger, 而现在要将修改push到remote repo的 develop分支该如何?

思路:拉取新的remote_develop_repo_url, 将原有的代码合并到当前分支, 然后再提交到 remote_develop_repo_url,。

首先将当前修改提交到本地当前master分支, git commit -m "this is comment"

然后使用git remote add remote_repo_name url ,来添加新的remote repo, git remote add new_repo url_from_igerrit

然后再用git fetch remote_repo_name 来拉取代码 和 git branch 及其配置到本地,git fetch new_repo

然后,git checkout -b xx local_url 切换到新分支, git checkout -b develop new_repo/develop

然后再将master分支的修改合并到当前分支上, merge命令自动commit了合并后的代码到新的分支, git merge master

然后再用git log 查看下更新的是否生成了 change-id, 否则需要拷贝commit-msg 到当前git/hook目录下, git log (仅针对持续集成服务器需要根据change-id来分辨提交id的情况)

最后使用git push remote_repo_name local_branch_name:/refs/for/remote_repo/branch_name 。 git push n

本文介绍如何在 mac 机器上创建 Git 服务器,总体思路是:使用gitosis来简化创建过程,在用作服务器的机器上创建一个名为 git 的账户来创建 git 服务器,其他客户端通过 ssh 机制访问 git 服务器。

一,创建 git 账户

1,在用作服务器的机器上创建 git 账户。我们可以通过 System Preferences->accounts 来添加。在这里我添加一个 git 的 administrator 账户,administrator 不是必须的,在这里仅仅为了方便。

2,设置远程访问

logout 当前账户,使用 git 账户登录;在 System Preferences->Sharing 中,勾选 Remote Login。

二,下载安装 gitosis

1,Mac OSX Yosemite 默认已经为我们安装了 Git 和 Python,可以使用如下命令查看其版本信息:

yourname:~ git$git--version

git version 232 (Apple Git-55)

yourname:~ git$python--version

Python 279

2,通过命令 git clone git@githubcom:tv42/gitosisgit 来下载 gitosis

yourname:~ git$ git clone git@githubcom:tv42/gitosisgit

Cloning into gitosis

remote: Counting objects: 614, done

remote: Compressing objects: 100% (183/183), done

remote: Total 614 (delta 434), reused 594 (delta 422)

Receiving objects: 100% (614/614), 9382 KiB | 45 KiB/s, done

Resolving deltas: 100% (434/434), done

3,进入 gitosis 目录,使用命令 sudo python setuppy install 来执行 python 脚本来安装 gitosis。

yourname:~ git$ cd gitosis/yourname:gitosis git$ sudo python setuppy install

running install

running bdist_egg

running egg_info

creating gitosisegg-info

……

Using /Library/Python/26/site-packages/setuptools-06c9-py26egg

Finished processing dependencies for gitosis==02

三,制作 ssh rsa 公钥

1,回到 client 机器上,制作 ssh 公钥。在这里我的使用同一台机器上的另一个账户作为 client。如果作为 client 的机器与作为 server 的机器不是同一台,也是类型的流程:制作公钥,放置到服务的 /tmp 目录下。只不过在同一台机器上,我们可以通过开启另一个 terminal,使用 su 切换到 local 账户就可以同时操作两个账户。

yourname:~ git$ su local_accountPassword:bash-32$ cd ~

bash-32$ ssh-keygen -t rsa

Generating public/private rsa key pair

Enter file in which to save the key (/Users/local_account/ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:Your identification has been saved in /Users/local_account/ssh/id_rsa

Your public key has been saved in /Users/local_account/ssh/id_rsapub

bash-32$ cd ssh

bash-32$ ls

id_rsa        id_rsapub

bash-32$ cp id_rsapub /tmp/youramepub

在上面的命令里,首先通过 su 切换到 local 账户(只有在同一台机器上才有效),然后进入到 local 账户的 home 目录,使用 ssh-keygen -t rsa 生成 id_rsapub,最后将该文件拷贝放置到  /tmp/yournamepub,这样 git 账户就可以访问 yournamepub了,在这里改名是为了便于在 git 中辨识多个 client。

四,使用 ssh 公钥初始化 gitosis

1,不论你是以那种方式(邮件,usb等等)拷贝 yournamepub 至服务器的 /tmp/yournamepub。下面的流程都是一样,登入服务器机器的 git 账户,进入先前提到 gitosis 目录,进行如下操作初始化 gitosis,初始化完成后,会在 git 的 home 下创建 repositories 目录。

yourname:gitosis git$ sudo -H -u git gitosis-init < /tmp/yournamepub

Initialized empty Git repository in /Users/git/repositories/gitosis-admingit/

Reinitialized existing Git repository in /Users/git/repositories/gitosis-admingit/

在这里,会将该 client 当做认证受信任的账户,因此在 git 的 home 目录下会有记录,文件 authorized_keys 的内容与 yournamepub 差不多。

yourname:~ git$ cd ~yourname:~ git$ cd sshyourname:ssh git$ ls

authorized_keys

我们需要将 authorizd_keys 稍做修改,用文本编辑器打开它,删除里面的"command="gitosis-serve yourname",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty " 这一行:

yourname:ssh git$ open -e authorized_keys

然后,我们对 post-update 赋予可写权限,以便 client 端可以提交更改。

yourname:gitosis git$ sudo chmod 755 /Users/git/repositories//gitosis-admingit/hooks/post-update

Password:

yourname:ssh git$ cd ~

yourname:~ git$ cd repositories/

yourname:repositories git$ ls

gitosis-admingit

yourname:repositories git$

在上面的命令中可以看到,gitosis 也是作为仓库的形式给出,我们可以在其他账户下 checkout,然后对 gitosis 进行配置管理等等,而无需使用服务器的 git 账户进行。

最后一步,修改 git 账户的 PATH 路径。

yourname:gitosis git$ touch ~/bashrc

yourname:gitosis git$ echo PATH=/usr/local/bin:/usr/local/git/bin:\$PATH > bashrc

yourname:gitosis git$ echo export PATH >> bashrc

yourname:gitosis git$ cat bashrc

PATH=/usr/local/bin:/usr/local/git/bin:$PATHexport PATH

至此,服务器的配置完成。

五,client 配置

1,回到 local 账户,首先在 terminal 输入如下命令修改 local 的 git 配置:

bash-32$ git config --global username "yourgitname"bash-32$ git config --global useremail "yourmail@yourcomcom"

2,测试服务器是否连接正确,将 1014211 换成你服务的名称或服务器地址即可。

yourname:~ local_account$ ssh git@1014211Last login: Mon Nov  7 13:11:38 2011 from 1014211

3,在本地 clone 服务器仓库,下面以 gitosis-admingit 为例:

bash-32$ git clone git@1014211:repositories/gitosis-admingit

Cloning into gitosis-adminremote: Counting objects: 5, doneremote: Compressing objects: 100% (5/5), doneremote: Total 5 (delta 0), reused 5 (delta 0)

Receiving objects: 100% (5/5), done

bash-32$ ls

Desktop        InstallApp    Music        Sites

Documents    Library        Pictures    gitosis-admin

Downloads    Movies        Public

bash-32$ git

在上面的输出中可以看到,我们已经成功 clone 服务器的 gitosis-admin 仓库至本地了。

4,在本地管理 gitosis-admin:

进入 gitosis-admin 目录,我们来查看一下其目录结构:gitosisconf 文件是一个配置文件,里面定义哪些用户可以访问哪些仓库,我们可以修改这个配置;`keydir` 是存放ssh 公钥的地方。

bash-32$ cd gitosis-admin/

bash-32$ ls

gitosisconf keydir

bash-32$ cd keydir/

bash-32$ ls

yournamepub

我们只需要将其他 client 产生的 ssh 公钥添加到 keydir 目录下,并在 gitosisconf 文件中配置这些用户可以访问的仓库(用户名与放置在 keydir 下sh 公钥名相同,这就是在前面我们要修改ssh 公钥名的原因),然后将改动提交至服务器,这样就可以让其他的 client 端访问服务器的代码仓库了。

5,仓库权限管理

gitosisconf文件是用来设置用户、仓库和权限的控制文件。keydir 目录则是保存所有具有访问权限用户公钥的地方— 每人一个。在 keydir 里的文件名(比如上面的 yournamepub)应该跟你的不一样 — Gitosis 会自动从使用 gitosis-init 脚本导入的公钥尾部的描述中获取该名字。

看一下 gitosisconf 文件的内容,它应该只包含与刚刚克隆的 gitosis-admin 相关的信息:

$ cat gitosisconf

[gitosis]

[group gitosis-admin]

members = scott

writable = gitosis-admin

它显示用户 yourname — 初始化 Gitosis 公钥的拥有者 — 是唯一能管理 gitosis-admin 项目的人。

现在我们来添加一个新项目。为此我们要建立一个名为 mobile 的新段落,在其中罗列手机开发团队的开发者,以及他们拥有写权限的项目。由于 yourname 是系统中的唯一用户,我们把他设为唯一用户,并允许他读写名为 iphone_project 的新项目:

[group mobile]

members = scott

writable = iphone_project

修改完之后,提交 gitosis-admin 里的改动,并推送到服务器使其生效:

$ git commit -am 'add iphone_project and mobile group'[master 8962da8] add iphone_project and mobile group

1 file changed, 4 insertions(+)

$ git push origin master

Counting objects: 5, done

Compressing objects: 100% (3/3), done

Writing objects: 100% (3/3), 272 bytes | 0 bytes/s, done

Total 3 (delta 0), reused 0 (delta 0)

To git@gitserver:gitosis-admingit

fb27aec8962da8  master -> master

6,添加新项目到仓库种

在新工程 iphone_project 里首次推送数据到服务器前,得先设定该服务器地址为远程仓库。但你不用事先到服务器上手工创建该项目的裸仓库— Gitosis 会在第一次遇到推送时自动创建:

$ git remote add origin git@gitserver:iphone_projectgit

$ git push origin master

Initialized empty Git repository in /opt/git/iphone_projectgit/

Counting objects: 3, done

Writing objects: 100% (3/3), 230 bytes | 0 bytes/s, done

Total 3 (delta 0), reused 0 (delta 0)

To git@gitserver:iphone_projectgit

[new branch]      master -> master

请注意,这里不用指明完整路径(实际上,如果加上反而没用),只需要一个冒号加项目名字即可 — Gitosis 会自动帮你映射到实际位置。

要和朋友们在一个项目上协同工作,就得重新添加他们的公钥。不过这次不用在服务器上一个一个手工添加到 ~/ssh/authorized_keys 文件末端,而只需管理 keydir 目录中的公钥文件。文件的命名将决定在 gitosisconf 中对用户的标识。现在我们为 John,Josie 和 Jessica 添加公钥:

$ cp /tmp/id_rsajohnpub keydir/johnpub

$ cp /tmp/id_rsajosiepub keydir/josiepub

$ cp /tmp/id_rsajessicapub keydir/jessicapub

然后把他们都加进 mobile 团队,让他们对 iphone_project 具有读写权限:

[group mobile]

members = scott john josie jessica

writable = iphone_project

如果你提交并推送这个修改,四个用户将同时具有该项目的读写权限。

Gitosis 也具有简单的访问控制功能。如果想让 John 只有读权限,可以这样做:

[group mobile]

members = scott josie jessica

writable = iphone_project

[group mobile_ro]

members = johnreadonly = iphone_project

现在 John 可以克隆和获取更新,但 Gitosis 不会允许他向项目推送任何内容。像这样的组可以随意创建,多少不限,每个都可以包含若干不同的用户和项目。甚至还可以指定某个组为成员之一(在组名前加上 @ 前缀),自动继承该组的成员:

[group mobile_committers]

members = scott josie jessica

[group mobile]

members   = @mobile_committers

writable  = iphone_project

[group mobile_2]

members   = @mobile_committers john

writable  = another_iphone_project

如果遇到意外问题,试试看把 loglevel=DEBUG 加到 [gitosis] 的段落(译注:把日志设置为调试级别,记录更详细的运行信息。)。如果一不小心搞错了配置,失去了推送权限,也可以手工修改服务器上的 /home/git/gitosisconf 文件 — Gitosis 实际是从该文件读取信息的。它在得到推送数据时,会把新的 gitosisconf 存到该路径上。所以如果你手工编辑该文件的话,它会一直保持到下次向 gitosis-admin 推送新版本的配置内容为

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » git的pull和clone有什么区别

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情