zoukankan      html  css  js  c++  java
  • Git 使用教程

    第一篇:


    下载Git  Git for Windows

    2:点击安装,依次默认下一步

    3:安装完成

    4:设置SSH建立计算机与Github的链接

    4.1 点击开始菜单找到Git Bash,并点击:

     

    4.2 运行命令 cd ~/.ssh 检查自己的电脑上是否存在ssh keys

    如果显示No such file or directory 则需要去创建一个新的ssh keys

    4.3 创建新的ssh keys

    运行命令:$ ssh-keygen -t rsa -C "your_email@youremail.com"点击回车

    点击回车

    输入你的passphrase(密码),并重新输入确认

    注:在Enter passphrase 的时候,输入的密码是看不到的,其实已经输入了,输完后点击回车就可以了

    这样一个新的keys就创建完成了,上面代码显示,密匙位置放在了C:/Users/用户名/.ssh/文件夹中。(.ssh文件夹可能是隐藏的,需要查看隐藏文件

    4.4 将你新生成的ssh keys 添加到github中

    在 GitHub 网站点击“Account Settings” > 点击 “SSH Public Keys”> 点击 “Add another public key”

    在本机找到你创建的密匙文件id_rsa.pub,使用记事本打开,复制里面所有的内容,粘贴到网站key的文本框中,点击Add Key 保存

    5:测试一下我们的设置是否正确

    输入命令:$ ssh -T git@github.com 

    输入yes 

    我本机显示连接关闭,然后我继续执行上诉命令,提示输入passphrase(密码),输入前面自己设置的passphrase。回车登录成功

    如果不成功,检测一下:输入命令:$ ssh -Tv git@github.com 


    出现问题:

    GitHub 连接问题,使用ssh -T git@github.com , Permisson denied (publickey)


    解决办法:

    window下面可以用gui里面的帮助复制pubkey


    6:在本地设置Git信息

    6.1设置用户名和邮箱

    $ git config --global user.name"Firstname Lastname"

    $ git config --global user.email"your_email@youremail.com"

    此处用户名为自己的实际姓名(自定义的),而非登录用户名


    Git 创建一个库Create a Repository

    1:点击 New repository


    2:输入库的相关信息,然后点击Create Repository


    3:上传一个文件

    3.1首先在本地创建一个目录(这个目录名需要和上一步创建的项目名相同):依次执行下列命令行

    mkdir Helloworld
    cd Helloworld
    git init
    touch README
    git add README
    git commit -m 'first commit'

    3.2:打开本机的c:/User/用户名/Helloworld文件夹中的readme文件(使用记事本)编辑内容,保存。

    3.3:将文件提交到github中的库中,执行下列命令行

    git remote add origin git@github.com:github用户名/Helloworld.git
    git push -u origin master

     

    转自:http://blog.csdn.net/utstarm/article/details/8215628


    第二篇:

    Git 历险记(三)——创建一个自己的本地仓库

    作者 刘辉 发布于 二月 22, 2011 | 6 讨论

    如果我们要把一个项目加入到Git的版本管理中,可以在项目所在的目录用git init命令建立一个空的本地仓库,然后再用git add命令把它们都加入到Git本地仓库的暂存区(stage or index)中,最后再用git commit命令提交到本地仓库里。

    创建一个新的项目目录,并生成一些简单的文件内容:

    $ mkdir test_proj
    $ cd test_proj
    $ echo “hello,world” > readme.txt
    

    在项目目录创建新的本地仓库,并把项目里的所有文件全部添加、提交到本地仓库中去:

    $ git init #在当前的目录下创建一个新的空的本地仓库
    Initialized empty Git repository in /home/user/test_proj/.git/
    $ git add . #把前目录下的所有文件全部添加到暂存区
    $ git commit -m 'project init' #创建提交
    [master (root-commit) b36a785] project init
    1 files changed, 1 insertions(+), 0 deletions(-)
    create mode 100644 readme.txt

    Git目录的结构

    git init命令在项目的顶层目录中建了一个名为:“.git”的目录,它的别名是 “Git目录”(Git directory)。这时”Git目录”中虽然有一些文件,但是没有任何提交(commit)在里面,所以我们叫它是空仓库(empty Git repository)。

    和 SVN不同,一个Git项目一般只在项目的根目录下建一个“.git”目录,而SVN则会在项目的每一个目录下建一个”.svn”目录;这也我喜欢Git的原因之一:)

    Git把所有的历史提交信息全部存储在“Git目录”里,它就是一个Git项目的仓库;你对本地的源代码进行编辑修改后创建的提交也都会先保存在这里面,然后再推送到远端的服务器。当我们我把项目目录和“Git目录”一起拷到其它电脑里,它能马上正常的工作(所有的提交信息全都保存在Git目录里);甚至可以只把“Git目录”拷走也行,但是要再签出(checkout)一次。

    Git为了 调试的方便,它可以指定项目的Git目录的位置。有两种办法:一是设置“GIT_DIR”环境变量,二是在命令行里设定“--git-dir--git-dir”参数指定它的位置,大家可以看一下这里(git(1) Manual Page)。

    庖丁解牛

    前面的这些东东我在第一篇里也大概的讲过一些,但是今天我们想不但要开动这辆叫“Git”的跑车,还想看看它里面有些什么样的零件,是怎么构成的。

    OK,我们来看看“test_proj”项目里的“Git目录”的结构:

    $cd test_proj/.git 
    $ ls | more 
    branches/ # 新版的Git已经不再使用这个目录,所以大家看到它 #一般会是空的
    COMMIT_EDITMSG # 保存着上一次提交时的注释信息
    config # 项目的配置信息
    description # 项目的描述信息
    HEAD # 项目当前在哪个分支的信息
    hooks/ # 默认的“hooks” 脚本文件
    index # 索引文件,git add 后把要添加的项暂存到这里
    info/ # 里面有一个exclude文件,指定本项目要忽略的文件 #,看一下这里
    logs/ # 各个refs的历史信息
    objects/ # 这个目录非常重要,里面存储都是Git的数据对象
    # 包括:提交(commits), 树对象(trees),二进制对象 #(blobs),标签对象(tags)。
    #不明白没有关系,后面会讲的。
    refs/ # 标识着你的每个分支指向哪个提交(commit)。

    我先用git log命令来看一下这个Git项目里有哪些提交:

    $ git log
    commit 58b53cfe12a9625865159b6fcf2738b2f6774844
    Author: liuhui998 <liuhui998@nospam.com>
    Date: Sat Feb 19 18:10:08 2011 +0800
    project init

    大家可以看到目前只有一个提交(commit)对象,而它的名字就是:”58b53cfe12a9625865159b6fcf2738b2f6774844”。这个名字就是对象内容的一个SHA签名串值,只要对象里面的内容不同,那么我们就可以认为对象的名字不会相同,反之也成立。我在使用时一般不用把这个40个字符输全,只要把前面的5~8个字符输完就可以(前提是和其它的对象名不冲突)。为了方便表示,在不影响表达的情况下,我会只写SHA串值的前6个字符。

    我们可以用git cat-file来看一下这个提交里的内容是什么:

    $ git cat-file -p 58b53c 
    tree 2bb9f0c9dc5caa1fb10f9e0ccbb3a7003c8a0e13
    author liuhui998 <liuhui998@nospam.com> 1298110208 +0800
    committer liuhui998 <liuhui998@nospam.com> 1298110208 +0800
    project init

    大家可以看到:提交“58b53c” 是引用一个名为“2bb9f0”的树对象(tree)。一个树对象(tree)可以引用一个或多个二进制对象(blob), 每个二进制对象都对应一个文件。 更进一步, 树对象也可以引用其他的树对象,从而构成一个目录层次结构。我们再看一下这个树对象(tree)里面有什么东东:

    $ git cat-file -p 2bb9f0
    100644 blob 2d832d9044c698081e59c322d5a2a459da546469 readme.txt
    

    不难看出,2bb9f0”这个树对象(tree)包括了了一个二进制对象(blob),对应于我们在前面创建的那个叫 ”readme.txt”的文件。现在我们来看看这个”blob”里的数据是不是和前面的提交的内容一致:

    $ git cat-file -p 2d832d
    hello,world
    

    哈哈,熟悉的“hello,world”又回来了。

    想不想看看提交对象、树对象和二进制对象是怎么在”Git目录“中存储的;没有问题,执行下面的命令,看看”.git/objects”目录里的内容:

    $ find .git/objects
    .git/objects
    .git/objects/2b
    .git/objects/2b/b9f0c9dc5caa1fb10f9e0ccbb3a7003c8a0e13
    .git/objects/2d
    .git/objects/2d/832d9044c698081e59c322d5a2a459da546469
    .git/objects/58
    .git/objects/58/b53cfe12a9625865159b6fcf2738b2f6774844
    .git/objects/info
    .git/objects/pack
    

    如果大家仔细看上面命令执行结果中的粗体字,所有的对象都使用SHA签名串值作为索引存储在”.git/objects”目录之下;SHA串的前两个字符作为目录名,后面的38个字符作为文件名。

    这些文件的内容其实是压缩的数据外加一个标注类型和长度的头。类型可以是提交对象(commit)、二进制对象(blob)、 树对象(tree)或者标签对象(tag)。

    如何clone一个远程项目

    我身边的很多朋友是因为要得到某个开源项目的代码,所以才开始学习使用Git。而获取一个项目的代码的一般的做法就是用git clone命令进行直接复制。

    例如,有些朋友可能想看一下最新的linux内核源代码,当我们打开它的网站时,发现有如下面的一段提示:

    URL
    git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

    URL下面的三行字符串表示三个地址,我们可以通过这三个地址得到同样的一份Linux内核源代码。

    也就是说下面这三条命令最终得到的是同一份源代码:

    git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    git clone http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    git cone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

    我们先来看一下URL,git://、http://、https://这些代表是传输git仓库的协议形式,而“git.kernel.org“则代表了Git仓库存储的服务器名字(域名),“/pub/scm/linux/kernel/git/torvalds/linux-2.6.git” 则代表了Git仓库在服务器上位置。

    Git 仓库除了可以通过上面的git、http、https协议传输外还可以通过ssh、ftp(s)、rsync等协议来传输。git clone的本质就是把“Git目录”里面的内容拷贝过来,大家想想看,一般的“Git目录”里有成千上万的各种对象(提交对象,树对象,二进制对象......),如果逐一复制的话,其效率就可想而知。

    如果通过git、ssh协议传输,服务器端会在传输前把需要传输的各种对象先打好包再进行传输;而http(s)协议则会反复请求要传输的不同对象。如果仓库里面的提交不多的话,前者和后者的效率相差不多;但是若仓库里有很多提交的话,git、ssh协议进行传输则会更有效率。

    不过现在Git对http(s)协议传输Git仓库做了一定的优化,http(s)传输现在也能达到ssh协议的效率,有兴趣的朋友可以看一下这里(Smart HTTP Transport)。

    好的,现在我们执行了下面这条命令,把linux-2.6的最新版源代码clone下来:

    $cd ~/
    $mkdir temp
    $git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    Initialized empty Git repository in /home/liuhui/temp/linux-2.6/.git/
    remote: Counting objects: 1889189, done.
    remote: Compressing objects: 100% (303141/303141), done.
    Receiving objects: 100% (1889189/1889189), 385.03 MiB | 1.64 MiB/s, done.
    remote: Total 1889189 (delta 1570491), reused 1887756 (delta 1569178)
    Resolving deltas: 100% (1570491/1570491), done.
    Checking out files: 100% (35867/35867), done.
    

    当我们执行了“git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git”这条命令后大家可以看到这条输出:

    Initialized empty Git repository in /home/user/temp/linux-2.6/.git/

    这就是意味着我们在本地先建了一个“linux-2.6”目录,然后在这个目录建了一个空的Git本地仓库(Git目录);里面将会存储从网上拉下来的历史提交。

    下面两条输入代表服务器现在调用 git-pack-objects 对它的仓库进行打包和压缩:

    remote: Counting objects: 1888686, done.
    remote: Compressing objects: 100% (302932/302932), done.
    

    然后客户端接收服务器端发过送过来的数据:

    Receiving objects: 100% (1889189/1889189), 385.03 MiB | 1.64 MiB/s, done.

    在我们执行完上面的clone linux-2.6代码的的操作后,Git会从“Git目录”里把最新的代码到签出(checkout)到“linux-2.6”这个目录里面。我们一般把本地的“linux-2.6”这个目录叫做”工作目录“(work directory),它里面保存着你从其它地方clone(or checkout)过来的代码。当你在项目的不同分支间切换时,“工作目录”中的文件可能会被替换或者删除;“工作目录”只是保存着当前的工作,你可以修改里面文件的内容直到下次提交为止。

    大家还记得前面的“庖丁解牛”吗,是不是觉得只杀一头叫“hello,world”的小牛太不过瘾了。没有问题,拿起前面的那把小刀,来剖析一下现在躺在你硬盘里这头叫“linux-2.6”大牛看看,我想一定很好玩。


    在写篇文章的过程中,我要感谢在那些关心我并提出真诚意见的朋友,如果没有你们真诚的意见,我也许没有这么强烈的紧迫感,也不会深深的感到自己的不足。我是第一次写专栏,张凯锋同学给了我很大的帮助。最后还是要感谢我的家人,是他们让我有时间来进行写作:)

    转自:http://www.infoq.com/cn/news/2011/02/git-adventures-local-repository

  • 相关阅读:
    ASP.NET编程的十大技巧
    C#学习心得(转)
    POJ 1177 Picture (线段树)
    POJ 3067 Japan (树状数组)
    POJ 2828 Buy Tickets (线段树)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4235 Flowers (线段树)
    POJ 2886 Who Gets the Most Candies? (线段树)
    POJ 2418 Cows (树状数组)
    HDU 4339 Query (线段树)
  • 原文地址:https://www.cnblogs.com/xieyuan/p/3787339.html
Copyright © 2011-2022 走看看