Git 从入门到掐死

  • Git 从入门到掐死教程 (简易教程)
  • 主要整理了一下之前实习过程中一些 Git 的操作核问题的处理
  • 并为自己整理的 Git 命令集提供相应的索引
  • 未完待续~

写在前面

  • Git 相关的基础教程已经很多了,个人觉得对新人比较友好的教程为 廖雪峰的 Git 教程
  • 建议在上文提到的教程(一定要动手敲键盘鸭!)基础上再结合本文一起食用更佳。
  • 本文不再对基本操作做过多介绍,简单提及主要流程,主要针对特殊场景(开发常用)进行讲解。
  • 针对一些常用的 Git 高级命令,请参考 BlogIssue 常用Git命令 (长期更新)
  • ...
  • BTW,其实现有的 GUI 工具已经做的很好了 (直观且易用) ,熟练掌握 GUI 的使用,不会命令行也没太大关系。
    • SourceTree
    • Git GUI:Git 官方 GUI
    • Github Desktop
    • IDE 集成的 Git 工具等等

正文

Git 仓库级别的管理

创建的两种方式

  • 本地初始化:git init
  • 远程仓库克隆/下载:git clone [ssh-url/http-url]
两种创建方式的区别
  • 本地初始化只是在本地建立了一个对应的 Git 仓库,未和远端仓库建立相应的关系,只使用了一些默认的配置;
  • 远程仓库在克隆时已经加载了远程仓库中存储的关于该仓库的 Git 配置;

Git 本地仓库建立与远程仓库的联系

  • Git 仓库可以实现 本地 1:N 远程的关系,从而同步到多个远程代码库
  • 添加新的映射关系:git remote add [name] [url]
  • 查看已有的映射关系: git remote -v

Git 的日常操作流程

1.养成好习惯-工作之前保持同步

  • 下拉远程端最新的提交:git pull [remote-name] [remote branch]

2.(可选) 下拉过程的特殊处理

  • 如果本地已经存在部分修改,和远程端新的提交的修改的文件一致,Git 检测到文件版本不一致,拒绝下拉。此时可根据实际情况决定如何操作:
    • 保留本地修改:
      1. 使用 git stash 暂存本地修改到一个栈中;
      2. 正常下拉远程端最新的提交;
      3. git stash pop 弹栈之间暂存的提交,自动合并;
      4. 合并中如果出现冲突相应地解决冲突。
    • 不想保留本地修改:
      • 还未添加到缓冲区中:可以直接丢弃掉本地已有的修改 git checkout -- filepathname
      • 已经添加到缓冲区中:使用 git reset HEAD filepathname
      • 已经有了本地的提交:可以使用 git reset --hard HEAD^ 来回退到上一次commit的状态
  • 本地和远程端同时都信了新提交的时候,为了让整个提交的历史记录能够更加的简洁完整,避免一些不必要的合并操作,保证提交树的结构是线性的,可以使用 git pull --rebase 来自动地根据相应的提交时间进行友好的合并。

3.工作时注意文件编码和文件符号

  • 检查修改的文件编码和换行符

4.(可选) 新建一个本地分支用于特定功能

  • 针对部分功能模块或者程序 Bug 的修复,建议本地基于需要迭代的版本新建开发分支进行开发
  • 可参考 Git Branch 的相关命令来进行分支的管理

5.添加修改到缓冲区

  • 可指定文件也可全部添加到缓冲区:git add [..]
  • 记得养成查看工作区状态的好习惯:git status

6.提交缓冲区的带评论的修改

  • 提交存在缓冲区中的修改:git commit -m [comment]
  • 提交时会生成一个全局唯一的 ID,便于后续对本次 commit 进行标识
  • 记得养成查看工作区状态的好习惯:git status

7.推送到远程仓库的某个分支保持一致

  • 将本地提交推送到远程端:git push [remote-name default:origin] [local-branch default master]:[remote-branch]
  • 注意区分远端分支和本地分支,默认情况下保持远端和本地 master 分支同步
  • (可选) 针对本地新建的分支,可以直接推送到远程端,远程端自动新建新分支,如果已有类似分支,也可进行本地和远程分支之间的绑定。

8.Git 平台提交一个 PR/MR 请求 review 和 合并

  • 平台 GUI 操作, New Pull Request
  • CI/CD 流程相关代码审查和测试来验证本次提交的正确性
  • Reviewer 进行代码审核
  • 代码审核通过相应地合并到对应的分支
  • (可选,视业务情况而定)在进行了对应的人工测试和一系列回归测试之后,进行新版本的 Release

Git 历史记录追溯

查看 Git 提交记录(日志)

  • 主要信息:commit-id, commit-comment
  • 普通模式查看相关提交记录,退出按 qgit log
  • 简洁模式查看提交记录:git log --pretty=oneline
  • 可以使用某些参数对提交记录进行检索:git log --author="Elvis Zhang"

比较前后提交的差异

  • HEAD 是一个指针,指向当前最新的提交
  • 比较最近的一次提交和上一次的提交:git diff HEAD~1 HEAD
  • 可以设置参数来比较缓冲区的内容:--cached
  • 可以查看某个具体文件的修改内容:git diff HEAD~1 HEAD src/tools/rbd_mirror/ImageReplayer.cc
  • 针对不同的比较对象(缓冲区、工作区、已经提交的记录),可以使用如下命令:
>> git diff // Compare the cache and working area.
>> git diff --cached […] // Compare the cache area and latest commit. [..] file name
>> git diff HEAD […] // Compare the working area and latest commit.
>> git diff commit-id […] // Compare the workinga area and given commit.
>> git diff --cached [] […] // Compare the cache and given commit.
>> git diff [] [] // Compare two commits.
>> git diff --HEAD > patch-name // Make the differences between the working area and latest commit as a patch. And can use command git apply patch-name to apply patch.

版本回退

  • 版本回退主要有两种模式:hard & soft.
    • hard:能够回退到指定分支的最新提交,也可以根据 commit-id 回退到某个具体的提交,但不保留已有的修改;
    • soft:能够回退到指定分支的最新提交,也可以根据 commit-id 回退到某个具体的提交,保留修改到缓冲区中。
>> git reset --hard origin/master // Reset the cache and the commit
>> git reset --soft origin/master // Reset the commit and keep the modification.

查看Git命令执行历史

  • git reflog // Show the git operation history