嵌入式操作系统那些事儿程序员Linux

git简明使用手册

2017-04-08  本文已影响227人  古斟布衣

1. 概述

git作为时下最流行的代码管理工具,Git权威指南总结了十条喜欢Git的理由

其中:

1.1 git客户端安装

1.2 git客户端配置

远程仓库可以通过网页方式访问,但通常情况下仍然需要创建本地仓库:

  1. 创建本地 SSH key:

    • Windows下打开Git Bash,Linux下打开终端;
    • 执行ssh-keygen,所有提示均回车确认,生成私钥和公钥:

      <当前用户根目录>/.ssh/id_rsa
      <当前用户根目录>/.ssh/id_rsa.pub

    • 查看公钥文件内容并复制,注意不要复制命令本身

      cat <当前用户根目录>/.ssh/id_rsa.pub

  2. 添加远程仓库访问权限,不同的服务器会有不同的配置方法:

    • GitHub需要从右上角头像右侧的向下箭头进入settings->SSH and GPG keys来添加或者直接通过GitHub客户端自动添加;
    • gitolite需要将SSH公钥拷贝到gitolite-admin目录下的keydir目录中,并需要gitolite.conf已配置合适的访问权限。

    注意:

    • 本机SSH 私钥id_rsa不能删除。
    • 本机SSH key只需要创建一对,不需要为每个服务器都创建一对。
  3. 创建本地仓库并配置

    • 回到Git Bash/终端;
    • 执行

      git clone ssh://xxx.git

    • 执行本地配置(更多配置参见自定义-Git-配置-Git

      git config --global user.name “姓名”
      git config --global user.email “邮箱”
      git config --global color.ui auto
      git config --global core.ignorecase false

      git config --global core.filemode false
      git config --global core.autocrlf input
      git config --global core.safecrlf true
      git config --global push.default simple
      git config --global rerere.enabled true
    • 配置完成后可显示本地配置信息

      git config -l --global

    注意

    • 自动补齐: Windows客户端默认支持命令补齐,服务器上Linux已经配置自动补齐,自行安装的Linux需要参考Git基础-技巧和窍门进行配置;
    • 命令别名:git允许为常用操作设置别名,以简化操作(参见Git-基础-Git-别名):

    git config --global alias.ci commit
    git config --global alias.unstage 'reset HEAD --'

2. git基础

2.1 基本工作流程

2.2 获取帮助信息

2.3 合并比较结果阅读

git支持外部比较/合并工具(参见外部的合并与比较工具配置说明),但通常使用更为直接的命令行方式:

--- a/src/test.txt  :原始文件(以---开头) 
+++ b/src/test.txt  :目标文件(以+++开头) 
@@ -1,3 +1,3 @@     :当前差异块的比较对象为原始文件的第1行开始的3行与目标文件的地1行开始的3行
-orign              :只存在于原始文件(以-开头) 
+modified           :只存在于目标文件(以+开头)  
以空格开头           : 同时存在于原始文件和目标文件
<<<<<<<
当前分支代码
=======_
其他分支合并进来的代码
>>>>>>>

2.4 提交(commit)消息格式

git提交消息是日志回溯/代码审查/二分法问题查找的基础,建议参考thoughtbot规范

50-character subject line

1. Why was this change necessary?

2. How does it address the problem?

3. Are there any side effects?

建议将模板保存在根目录下,使用如下命令配置为模板,这样在提交时就会自动显示:

git config --global commit.template <模板文件>

3. git仓库构成及访问路径

Paste_Image.png

3.1 远程仓库

远程仓库是服务器上的git仓库,支持如下常用操作(更多操作参见Git-基础-远程仓库的使用):

3.1.1 基本操作

Paste_Image.png

该操作可用于查看远程仓库的地址,分支情况,与本地分支的差别等等。

3.1.2 从远程仓库到本地仓库

3.1.3 从本地仓库到远程仓库

3.2 本地仓库

本地仓库是当前工作机器上的git仓库,支持如下常用操作:

3.2.1 查看本地仓库状态

Paste_Image.png

命令结果中注释如下:

3.2.2 查看本地仓库日志(参见Git-工具-选择修订版本

Paste_Image.png

3.2.3 查看本地仓库的git操作记录并无限回退

Paste_Image.png

3.3 分支

分支是指向提交的的可变指针(参见Git-分支-分支简介),每个git仓库都有一个默认创建的master分支和若干其他分支,支持如下常用操作:

3.3.1 查看分支信息

Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png

3.3.2 从当前分支到其他分支

3.3.3 从其他分支到当前分支

3.4 工作区和暂存区

工作区是工作目录的形象化称呼,实际上就是当前分支最新版本的本地副本;暂存区(stage)则是包含将要提交到本地仓库中的文件的索引列表(参见Git权威指南-git暂存区)。

3.4.1 查看工作区和暂存区内容

3.4.2 从工作区到暂存区

3.4.3 从暂存区到工作区

3.4.4 从暂存区到本地仓库

3.4.5 从本地仓库到暂存区即清除暂存区

3.4.6 从本地仓库到工作区

3.4.7 从工作区到本地仓库

3.4.8 清除工作区

3.5 临时缓冲区

临时缓冲区(stash)是保存临时修改内容的各个分支共享的全局缓冲区,支持如下常用操作(参见Git-工具-储藏与清理):

3.5.1 查看临时缓冲区

3.5.2 从工作区和暂存区到临时缓冲区

3.5.3 从临时缓冲区到工作区

4. git进阶

4.1 变基(参见Git权威指南-改变历史

4.2 二分法查找错误版本(参考Git权威指南-二分查找

该方法用于快速定位问题,但是需要如下条件作为前提才能高效工作:

Paste_Image.png

该操作具体步骤如下(使用简单实例,具体使用时根据需要调整):

4.3 压缩提交(参见Git-工具-重置揭密#压缩

每个pull request中应当包含尽可能少的提交,因此在推送到服务器之前,每个功能点或者修改点包含的所有提交都应当压缩成一个提交,并编译通过,最好能够通过基本测试。

该操作具体步骤如下(使用简单实例,具体使用时根据需要调整):

注意^用于回退到上一次提交,等价于~1;也可以叠加使用以回退到N次提交之前,等价于~N

4.4 拆分提交(参见Git-工具-重写历史#拆分提交

该操作用于对不合理的提交压缩进行拆分,以方便cherry-pick和二分法查找等后续操作。

注意:该操作也可以用于调整提交的顺序,参见Git-工具-重写历史#重新排序提交

该操作具体步骤如下(使用简单实例,具体使用时根据需要调整):

4.5 补丁操作(参见分布式-Git-向一个项目贡献#r_project_over_email分布式 Git - 维护项目

该操作用于创建和应用patch。

  1. 标准格式补丁创建

    每个标准格式补丁就是1个包含提交消息、修改文件概述和修改文件细节的mbox格式文件:

    $ cat 0001-test1.patch
    From 0d57e1ea1a27c54c7ec62cacfccb7d037923150a Mon Sep 17 00:00:00 2001
    From: matt <matt@pc.com>
    Date: Mon, 28 May 2018 16:29:57 +0800
    Subject: [PATCH 1/2] test1
    
    ---
     README | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    !!!此处可以增加自定义信息以方便阅读,应用补丁时会被忽略。!!!
    
    diff --git a/README b/README
    index df1d5d6..3409f8c 100644
    --- a/README
    +++ b/README
    @@ -5,7 +5,7 @@
    
     Summary:
     ========
    -
    +1111111111111111111111111111111
     This directory contains the source code for U-Boot, a boot loader for
     Embedded boards based on PowerPC, ARM, MIPS and several other
     processors, which can be installed in a boot ROM and used to
    --
    2.10.1.windows.1
    

    操作命令如下所示:

    • git format-patch -M master

      为主线上不存在的每个提交创建一个标准格式补丁文件,同时查找重命名操作。注意,该操作需要切换到当前工作分支,并与主线同步后执行,即git checkout <工作分支>git rebase master之后。

    • git format-patch <起始提交ID或者标签>...<结束提交ID或者标签>

      为当前分支上起始提交ID或者标签与结束提交ID或者标签之间的每个提交创建一个标准格式补丁文件,不包括起始提交ID或者标签,但是包含结束提交ID或者标签。

      注意:

      • --cover-letter选项用于创建邮一个额外的mbox格式文件,包含所有提交的信息,而不只是某一个提交的信息。
        $ cat 0000-cover-letter.patch
        From 89d4c523ebf5bb6c700bcbf8e2c899c3f1d345fe Mon Sep 17 00:00:00 2001
        From: matt <matt@pc.com>
        Date: Tue, 29 May 2018 09:28:44 +0800
        Subject: [PATCH 0/2] *** SUBJECT HERE ***
        
        *** BLURB HERE ***
        
        matt (2):
          test1
          test2
        
         README | 2 +-
         1 file changed, 1 insertion(+), 1 deletion(-)
        
        --
        2.10.1.windows.1
        
      • 结束提交ID或者标签可以省略,默认为HEAD
    • git am <标准格式补丁文件>

      从标准格式补丁文件中读取补丁内容并应用到当前分支。注意,补丁文件应用冲突时,该操作会停下来,提示手工解决冲突,并在冲突解决后使用git am --resolved继续应用下一个补丁:

      $ vim README
      $ git add ticgit.gemspec
      $ git am --resolved
      Applying: test1
      

      当然,也可以跳过(git am --skip)或者终止(git am --abort)本次操作。

  2. diff格式补丁

    diff格式补丁使用diff命令创建,就是一个包含修改内容的文本文件,不包含提交消息和修改文件概述,但是可已经将多个提交的修改合并到一个文件中,方便阅读,但是应用补丁时只有补丁内容全部应用和完全不应用两种可能

    $ cat patch.txt
    diff --git a/README b/README
    index df1d5d6..3409f8c 100644
    --- a/README
    +++ b/README
    @@ -5,7 +5,7 @@
    
     Summary:
     ========
    -
    +1111111111111111111111111111111
     This directory contains the source code for U-Boot, a boot loader for
     Embedded boards based on PowerPC, ARM, MIPS and several other
     processors, which can be installed in a boot ROM and used to
    
    • git diff -c -p <起始提交ID或者标签>...<结束提交ID或者标签> > <补丁文件名称>

      将当前分支上起始提交ID或者标签与结束提交ID或者标签之间的所有修改创建一个diff格式补丁,不包括起始提交ID或者标签,但是包含结束提交ID或者标签。注意结束提交ID或者标签可以省略,默认为HEAD,例如:

      git diff -c -p HEAD^ > patch.txt

    • git apply <补丁文件名称>

      读取补丁内容并应用到当前分支。注意,本操作只修改当前分支文件,不会自动创建提交。

上一篇下一篇

猜你喜欢

热点阅读