• Git学习笔记


    前言:虽然学习git没几天,对git的理解也不够全面,但是还是写点笔记,记录一下掉坑爬坑的过程。

    ------------------------------------------------------------------------------------------------------------

    环境:win7 x64 、Git2.11.0 for windows

    需求:上传Android4.0.3系统源码至github托管,供自己阅读及学习Android系统使用

    注意事项:github上每个仓库最大容量为1GB,单个文件最大容量为100MB,还有git对文件名的大小写不敏感for windows

    ------------------------------------------------------------------------------------------------------------

    1.搭建环境

      1.1 安装git:https://git-for-windows.github.io/

      1.2 在github中新建一个仓库,比如Android4.0

      1.3 建立与github的连接

     ssh-keygen -t rsa -C "youremail"

        生成一个key,这个key用来与你的github进行连接,不然服务器怎么知道你是谁,是吧,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在C:UsersAdministrator.ssh目录下生成一个key,保存在id_rsa.pub文件中,复制里面的key,再回到github,进入Account Settings,选择SSH Keys,Add SSH Key,title随便填一个,粘贴key,搞定。

      1.4 为了验证是否成功,在git bash下输入:

    ssh -T git@github.com 

        如果是第一次的会提示是否continue,输入yes之后,如果出现:You’ve successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github,否则看看哪一步错了,再折腾一次就好了。

      1.5 配置你的用户名与邮箱,这是每次你提交代码的时候会有记录是谁谁谁提交的

        git config --global user.name "yourname"

        git config --global user.email "youremail"

      1.6 为了防止没有任何操作而中断与服务器的连接,我们让服务器给客户端发送心跳包保持长连接

        在git安装目录下的etc/ssh/ssh_config配置文件增加如下参数

    Host *
      ServerAliveInterval 60

    2.初始化git

      2.1 进入到需要托管的本地文件夹,比如Android4.0.3

      2.2 右键进入Git Bash Here选项,打开命令窗口,现在,开始我们的git之旅啦

      2.3 新建一个本地仓库

    git init 

        新建一个.git文件夹,作为本地仓库的管理

      2.4 添加远程地址,表明该项目要上传到github的哪个仓库里

    git remote add origin git@github.com:yourName/yourRepo.git

        yourName和yourRepo表示你在github的用户名和新建的仓库,加完之后进入.git,打开config,这里会多出一个remote “origin”内容,这就是刚才添加的远程地址,也可以直接修改config来配置远程地址。

    好啦,初始化git完成啦,接下来我们来添加,提交操作吧

    3.git主要命令

      3.1 首先我们需要添加代码到暂存区

    git add -A

      表示添加当前目录下所有未加入版本控制以及已更改的文件,也可以指定文件或文件夹

        3.1.1 如果我发现add错了,不想add了,使用

    git rm --cache 

          这里也可以指定文件或文件夹,默认会撤销所有暂存区的文件

      3.2 提交到本地仓库

    git commit -m "yourLog"

      表示把你添加的代码文件提交到本地的仓库中,若需要换行,则把“换成‘即可,例

    git commit -m '
    1.aaa
    2.bbb
    '

        3.2.1 如果我发现commit错了,我需要恢复原来的仓库,使用

    git reset --hard 版本号

          可以恢复上一个版本的仓库

      3.3 推送到远程仓库即github中

    git push origin master

         origin表示版本库名即我们remote add的origin,master表示分支名,分支的用法很值得深究

        3.3.1 如果我要删除远程仓库的文件,我可以使用rm删除暂存区的文件,然后commit到本地仓库最后push到远程仓库中

            第二种方式,直接在github上手动删除该文件,但是这需要我们在本地使用git pull同步一下本地仓库,否则push会失败哦

        3.3.2 如果我要恢复远程仓库的文件,也就是说我误删了远程仓库的文件怎么办,不要着急,我们只要把本地仓库回溯一下,恢复到我们希望的版本,然后push到远程就ok了

      3.4 从远程仓库下载文件到本地

    git pull origin master  
    或
    git fetch origin master

        git pull会下载到本地仓库并合并分支,而git fetch不会主动合并分支,就比如说我本地文件已经修改,而我也没有commit,但我又不想丢弃我的本地修改,那么肯定就不希望合并,而使用pull会主动去merge

      3.5 下载github上的项目

    git clone https://github.com/hisName/hisRepot.git

      3.6 查看当前的状态,即有没有add呀,add了哪些呀,更改了哪些文件呀等等

    git status

      3.7 查看本地仓库与工作区的更改内容

    git diff

      3.8 忽略特定格式的文件

        在仓库根目录下创建名称为“.gitignore”的文件,向其中添加不需要上传的文件夹与文件,例如不想传out目录bin目录以及后缀为bin的文件

    out
    bin
    *.bin

        一个文件占一行就好

    好啦,是不是有点晕,哈哈那就解释一下git的工作区域,这里有四个概念,

    1.工作区,就是我们本地文件夹,我们现在能看得到的文件

    2.暂存区,当我们执行add命令后,add的文件会保存至暂存区

    3.本地仓库,当我们执行commit命令后,先前add的文件会提交到本地仓库中

    4.远程仓库,当我们执行push命令后,才会把本地仓库同步到远程仓库中,否则远程仓库是不会有变动的。

    以上是我个人对git的理解,如有错误,还望指出,本人不甚感激。

    更多git命令就看大神的博客:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

    ----------------------------------------------------------------------------------------------------------------------------------------

     好啦,接下来是吐槽时间!!!!!!!!!!!!!!!!!!!

    怎么说呢,我的需求是上传Android源码到github上,最开始什么也没考虑,就是干,Android4.0整个源码不加二进制文件就有20w+个,一次性上传那得传到啥时候去啊,果断选择分文件夹上传,传了一天,突然想起这服务器总有个容量吧,遂网上一查,嘿,还真有,一个仓库最大1GB,如果真要全上传那再开几个仓库就好了嘛,后来又传了一天,还剩下一半源码,为何这么慢,网络啊!都是泪,唉,后来想想算了,反正改的最多的也就是Frameworks了,那把这个文件夹上传上去好了,这里放上github链接:https://github.com/pngcui/Android4.0_Frameworks

    接着上传kernel的源码,这下子有意思的来了,注意:前方高能

    想着整个kernel3.0也就500MB,4w多个文件,那干脆全传上去好了,毕竟以后在kernel上改动的也比较大

    当我在上传include文件夹的时候,add报错了

    error: short read: No such file or directory
    error: include/linux/netfilter_ipv6/ip6t_HL.h: failed to insert into database
    error: unable to index file include/linux/netfilter_ipv6/ip6t_HL.h
    fatal: adding files failed

    include/linux/netfilter_ipv6/ip6t_HL.h No such file ???去找找有没有该file,哦,能see能vi也能保存,我不信邪,执行以下命令
    git add include/linux/netfilter_ipv6/ip6t_HL.h 好吧,依旧报如上错误,什么鬼啊,不是有这个文件吗,你傻逼啊,
    注意:我在该目录下发现存在一个ip6t_HL.h以及一个ip6t_hl.h的文件,嗯,就是文件名部分大小写不一样,可是这应该不会是问题所在吧!!既然把文件添加至缓存,怎么可能大小写不敏感呢
    好吧,那我改下名吧,改为ipt6t_HL01.h,继续add .......................然后add成功了,我.......................整个人都惊呆了,这一定不是事实,我不信!!

    好吧,还是不得不接受这个残忍的事实啊...那就继续add吧,先把源码传上去,再在github上把文件名改回来好了,接下来还有6个文件一样的err,改了继续

    ok上传到github了,嗯,一个个改名,有图为证,还好github提供在线编辑的功能

    前面我们也提到了,如果我们在github上改动了仓库,那么需要在本地执行git pull同步一下对吧

    ok,执行git pull origin master

    $ git pull origin master
    remote: Counting objects: 35, done.
    remote: Compressing objects: 100% (35/35), done.
    remote: Total 35 (delta 28), reused 0 (delta 0), pack-reused 0
    Unpacking objects: 100% (35/35), done.
    From github.com:pngcui/Android4.0_linux3.0
     * branch              master     -> FETCH_HEAD
       00f8d8f5..96bd42f1  master     -> origin/master
    Updating 00f8d8f5..96bd42f1
    Fast-forward
     include/linux/netfilter/{xt_CONNMARK01.h => xt_CONNMARK.h} | 0
     include/linux/netfilter/{xt_DSCP01.h => xt_DSCP.h}         | 0
     include/linux/netfilter/{xt_MARK01.h => xt_MARK.h}         | 0
     include/linux/netfilter/{xt_RATEEST01.h => xt_RATEEST.h}   | 0
     include/linux/netfilter/{xt_TCPMSS01.h => xt_TCPMSS.h}     | 0
     include/linux/netfilter_ipv4/{ipt_TTL01.h => ipt_TTL.h}    | 0
     include/linux/netfilter_ipv6/{ip6t_HL01.h => ip6t_HL.h}    | 0
     7 files changed, 0 insertions(+), 0 deletions(-)
     rename include/linux/netfilter/{xt_CONNMARK01.h => xt_CONNMARK.h} (100%)
     rename include/linux/netfilter/{xt_DSCP01.h => xt_DSCP.h} (100%)
     rename include/linux/netfilter/{xt_MARK01.h => xt_MARK.h} (100%)
     rename include/linux/netfilter/{xt_RATEEST01.h => xt_RATEEST.h} (100%)
     rename include/linux/netfilter/{xt_TCPMSS01.h => xt_TCPMSS.h} (100%)
     rename include/linux/netfilter_ipv4/{ipt_TTL01.h => ipt_TTL.h} (100%)
     rename include/linux/netfilter_ipv6/{ip6t_HL01.h => ip6t_HL.h} (100%)

    OK~把我原先改过文件名的文件都改回来了,为了证实,打开目录includelinux etfilter,昂?????xt_connmark.h呢???excuse me???!,

    那么,我再使用git diff看看

    $ git diff
    diff --git a/include/linux/netfilter/xt_connmark.h b/include/linux/netfilter/xt_connmark.h
    index efc17a83..2f2e48ec 100644
    --- a/include/linux/netfilter/xt_connmark.h
    +++ b/include/linux/netfilter/xt_connmark.h
    @@ -1,31 +1,6 @@
    -#ifndef _XT_CONNMARK_H
    -#define _XT_CONNMARK_H
    +#ifndef _XT_CONNMARK_H_target
    +#define _XT_CONNMARK_H_target
    
    -#include <linux/types.h>
    +#include <linux/netfilter/xt_connmark.h>
    
    -/* Copyright (C) 2002,2004 MARA Systems AB <http://www.marasystems.com>
    - * by Henrik Nordstrom <hno@marasystems.com>
    - *
    - * This program is free software; you can redistribute it and/or modify
    - * it under the terms of the GNU General Public License as published by
    - * the Free Software Foundation; either version 2 of the License, or
    - * (at your option) any later version.
    - */

    啊??xt_connmark.h有差别??我一万个黑人问号。。。

    于是我悄悄的打开了xt_CONNMARK.h与xt_connmark.h两个文件

    xt_CONNMARK.h内容如下:

    #ifndef _XT_CONNMARK_H_target
    #define _XT_CONNMARK_H_target
    
    #include <linux/netfilter/xt_connmark.h>
    
    #endif /*_XT_CONNMARK_H_target*/

    xt_connmark.h部分内容如下:

    #ifndef _XT_CONNMARK_H
    #define _XT_CONNMARK_H
    
    #include <linux/types.h>
    
    /* Copyright (C) 2002,2004 MARA Systems AB <http://www.marasystems.com>
     * by Henrik Nordstrom <hno@marasystems.com>
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 2 of the License, or
     * (at your option) any later version.
     */
    
    enum {
        XT_CONNMARK_SET = 0,
        XT_CONNMARK_SAVE,
        XT_CONNMARK_RESTORE
    };
    ...

    很明显xt_CONNMARK.h与xt_connmark.h这两个文件名都不一样,而git diff是把本地工作区与本地仓库的文件进行对比啊

    但是我本地就没有xt_connmark.h这个文件好吧,git你怎么能用xt_CONNMARK.h冒充xt_connmark.h来骗我呢???

    难道git真的大小写不敏感???????!!!!!!!!!!!!!!!!!!!!!!!

    网上一查,我去类,果然git默认是大小写不敏感,这不坑人吗,真是在这个坑摔个狗吃屎(/ □ )

    可以使用命令设置git大小写敏感,它只更改.git/config配置,即每个项目都需要执行一次!

    windows系统对文件名大小写不敏感!在Linux下不会,所以最好还是在Linux环境下进行源码的提交等

    git config core.ignorecase false

    如果碰到这样的情况,请把两份文件都git rm --cached(只删除暂存区的,不删除本地工作区的文件),commit,然后push到远程

    然后继续add,commit,push,这样就不会出错啦!

    好了,说了这么多,我继续传源码去了,最后附上几个详细的教程

    配置git上传到github上的详细流程:http://blog.csdn.net/luckyyulin/article/details/21090905

    撤销git的操作:http://www.tuicool.com/articles/BJfUn2B

    为什么git要先add然后commit:https://www.zhihu.com/question/19946553

    git与svn的区别:http://blog.csdn.net/ithomer/article/details/7529022#comments

  • 相关阅读:
    Sql Server 中的 @@ERROR
    MVC 自定义HtmlHelper帮助类型之分页
    CI(CodeIgniter)框架中的增删改查操作
    WMAP 启动报错 PHP- 提示缺少 msvcr110.dll 的问题
    Bat命令学习 (转载)
    C# 实现刻录光盘功能
    几个操作、名词的说明
    CheckStateChanged(复选框选中状态更改事件)和 CheckedChanged(单选按钮选中状态更改事件)二者区别?
    关于设置Visaul Studio 2010 代码编辑界面背景的方法
    checkBox1_CheckedChanged(object sender, EventArgs e)和checkBox1_CheckStateChanged(object sender, EventArgs e)不同
  • 原文地址:https://www.cnblogs.com/pngcui/p/6237287.html
Copyright © 2020-2023  润新知