git实用手册(持续更新)

1. git简介

​ 没错,它只是一个工具,学会用很重要。git是一个分布式版本控制软件,最初Linux内核的作者Linus Torvalds制作,最初目的为了更好的管理Linux内核代码而设计。

image-20220316084424052

  • 工作区( working directory):下载远程仓库到本地后,文件被修改后处于工作区;可以使用git status命令查看工作区中文件。
  • 暂存区(staged):执行git add file命令将会使工作区被修改文件添加到暂存区,这一步是让作者把将要提交文件先一次性选择好。
  • git commit:git commit -m "xx"命令将会提交暂存区所有文件的修改,并生成一个commit提交记录,此时提交还在本地仓库。
  • 提交修改到线上:git push origin branch_name 命令会提交本地仓库的commit到远程仓库,branch_name是本地仓库所在分支名称。
  • 暂存区不属于任何分支、暂存区清空后,本地仓库才能进行切换分支操作。
  • HEAD指针:

2. 常用命令

  1. git reset 回退撤销修改

    HEAD^ 可以用来指定当前的commit_id;HEAD^^代表上一个commit_id;依次推类。

    命令 说明
    git reset HEAD file 撤销某个文件的git add, 修改回到工作区
    git reset –soft commit_id 撤销commit操作,修改回到暂存区
    git reset –mixed commit_id(–mixed参数可以省略) 撤销commit和add操作,修改回到工作区
    git reset –hard commit_id 撤销commit和add操作,删除工作空间改动代码(慎用)
  2. git status 查看本地仓库状态

  3. git rebase 用法小结

2.1 本地仓库关联多个远程仓库

当远程仓库地址迁移后,本地仓库可关联新的远程仓库地址,旧地址依旧保留。

  1. origin 重命名为 old_origin:git remote rename origin origin_old
  2. origin 默认关联到 新的远程仓库:git remote add origin new.git
  3. 本地修改提交到新远程仓库:git push origin msater
  4. 本地修改提交到旧远程仓库:git push old_origin msater

3. 分支管理

项目开发过程中,一般分为稳定发布分支master、开发分支develop、功能分支feature、Bug修复分支bugfix_xxx等四种类型。

  • 分支管理基本流程图 https://nvie.com/posts/a-successful-git-branching-model/

    image-20220316104121946

  • 分支合并规范(建议)

    • commit描述尽可能详细, 推荐使用commitizen插件, git cz代替git commit;

      配置参考文章 如何优雅的提交commit

      git cz 将commit描述分为简要描述和详细描述两个部分,以及一些修改对版本兼容性说明。

    • git merge时请慎用 –squash 参数,–squash会将多个commit合成一个,这不便于后续版本修改记录查看和代码维护。如果开发过程中commit节点提交的太零散,可以采用git rebase -i 命令整合commit,然后采用fast forward行为合入。

    • 其他待补充

4. git 子仓库

​ 在日常开发中,我们经常git来当做代码版本管理工具,使用中基本都是一个项目一个Git仓库的形式,那么当我们的代码中碰到了业务级别的需要复用的代码,我们一般怎么做呢 ? Git子模块允许我们将一个或者多个Git仓库作为另一个Git仓库的子目录,它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。

  1. 向父仓库添加子仓库:git submodule add https://github.com/xxx.git

    如下图,iot_project 为父仓库,执行命令后,子仓库将以子目录的形式存在;父仓库将会新增.gitmodules和子仓库目录。

    1625489517933-e44a3f15-ddb5-41ef-ae86-850d7a48c2aa

  2. 子仓库有修改后,父仓库如何感知?如下只是以子目录的形式提示,不显示细节。

    1
    2
    3
    4
    5
    6
    7
    zhaocs@DESKTOP-2J12679 iot_project [develop] $ git status
    On branch develop
    Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working directory)

    modified: os_algorithm (new commits)
  3. clone 父仓库后,怎么拉取子仓库内容?git submodule update --init --recursive

    1
    2
    3
    4
    5
    6
    7
    seedeer@DESKTOP-70ULORM:~/Study/iot_project$ git submodule update --init --recursive
    Submodule 'os_algorithm' (https://github.com/SeeDeer/os_algorithm.git) registered for path 'os_algorithm'
    Submodule 'os_time' (https://github.com/SeeDeer/os_time.git) registered for path 'os_time'
    Cloning into '/home/seedeer/Study/iot_project/os_algorithm'...
    Cloning into '/home/seedeer/Study/iot_project/os_time'...
    Submodule path 'os_algorithm': checked out 'ee81fccef733738ac643feb89960849b7c888827'
    Submodule path 'os_time': checked out '0a058507b2f4ab19ab75993c1da2bb7a93105d66'
  4. 批量查看子仓库修改: git submodule foreach git status

  5. 替换子模块的url 为 ssh方式

    • 手动修改 .gitmodules 文件中 url

    • 使用 git submodule sync 命令,将新的URL更新到文件.git/config

5. 附录

5.1 免密操作配置

和git远程仓库交互时有https和ssh两种方式,如果每次提交都要输入账户登陆密码将会很繁琐。

  1. https方式免密码操作配置:

    1
    2
    git config --global user.email "你的git的注册邮箱"
    git config --global user.user"你的git用户名

    然后输入一次用户密码,再根据自己的需求执行下面的任意一条命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    1、设置记住密码(默认15分钟):
    git config --global credential.helper cache

    2、如果想自己设置时间,可以这样做:
    git config credential.helper 'cache --timeout=3600'
    这样就设置一个小时之后失效

    3、长期存储密码:
    git config --global credential.helper store

    4、增加远程地址的时候带上密码也是可以的。(推荐)
    http://yourname:password@git.oschina.net/name/project.git
  2. ssh方式免密操作配置:

    • 同上:git config –global先设置,然后ssh客户端本地生成ssh key,进入用户下.ssh目录下执行ssh-keygen -t rsa, 然后一路回车确认即可。

      image-20220316115740457

    • 将ssh key中的公钥内容配置到ssh服务器上,github网站配置方法如下:进入账户设置

      image-20220316120420617

    • 认证情况测试:ssh -T git@github.com

      image-20220316121057600

  3. xxx


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!