Git 基础 | 青训营笔记

124 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第 2 篇笔记

版本控制

  • 记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
  • 能够更好的关注变更,了解到每个版本的变动是什么,方便检查改动的代码,预防事故;也便于随时切换到不同版本,回滚误删误改的问题代码。

分类

  • 本地版本控制

    • 代表性工具:RCS。能够对本地代码实现版本控制。
  • 集中式版本控制

    • 代表性工具:SVN。提供一个远端服务器来维护代码版本,本地不保存代码版本,解决多人协作问题。

    • 增量保存每次提交的 Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突。

    • 优点:学习简单,方便操作。支持二进制文件,对大文件支持更友好。

    • 缺点

      • 本地不存储版本管理的概念,所有提交都只能连上服务器后才可以提交。
      • 分支的支持不够好,不利于大型项目团队合作。
      • 用户本地不保存所有版本的代码,如果服务器故障,容易导致历史版本丢失
  • 分布式版本控制

    • 代表性工具:Git。每个仓库都能记录版本历史,解决只有一个服务器保存版本的问题。

    • 每次提交记录的都是完整的文件快照

    • 优点

      • 分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
      • 分支管理功能强大,方便团队合作,多人协同开发
      • 校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失。
    • 缺点

      • 相对于 SVN 更复杂,学习成本更高
      • 对于大文件的支持不是特别好(git-lfs 工具可以弥补)

git 的基本使用

初始化 git 仓库

进入目标文件中, 输入 git init, 初始化为 git 仓库

常见 git 配置

  • 用户名配置

    • git config --global user.name "name"
    • git config --global user.email name@***.com
  • Instead of 替换

    • 替换 git 命令。比如,将 SSH 协议换成 HTTP 协议
    • git config --global url
  • Git 命令别名配置

    • 可简化 Git 命令,
    • git config --global alias.cin "commit --amend --no-edit"( 配置之后, cin 等价于 commit --amend --no-edit )

Git Remote 操作远程仓库

  • 查看 Remote

    • git remote -v
  • 添加 Remote

  • 再输入 git remote -v

  • 输错名字可以输入 git remote rename <旧名称> <新名称> 更改名字

  • 为同一个 Origin 设置不同的 Push 和 Fetch URL

    • git remote set-url --add --push origin git@github.com:MY_REPOSITY/git (更改 push 的 URL)
  • SSH 免密配置

    • SSH 可以通过公私钥的机制,将生成的公钥存放在服务端,从而实现免密访问
    • 目前的 Key 有四种类型,分别是 dsa、rsa、ecdsa、ed25519。默认使用 rsa,但由于安全问题,不推荐使用 dsa 和 rsa,推荐使用 ed25519
    • 配置方式:ssh-keygen -t ed25519 -C "your_email@example.com" ,密钥默认存放在 ~/.ssh/id_ed25519.pub

修改历史版本

  • commit --amend。可修改最近的一次 commit 信息,修改之后 commit id 会改变

  • rebase。如:git rebase -i HEAD~3。可实现对最近三个 commit 的修改:

    • 合并 commit
    • 具体的 commit message
    • 删除某个 commit
  • filter --branch。指定删除所有提交中的某个文件或者全局修改邮箱地址等操作

常见问题

无法拉取代码

  • 免密认证没有配
  • 配的是 SSH 免密配置,但使用的是 HTTP 协议访问,需要配置 Instead Of

Fetch 远端分支后,本地当前分支历史不变

  • Fetch 会把代码拉取到本地的远端分支,但是不会合并到当前分支,所有当前分支历史没有变化