Git 自救手册

304 阅读11分钟

Git 自救手册

image.png

免密访问

Git 作为日常使用极为频繁的代码仓工具,可能会遇到这样的困惑,只有一台电脑,该如何管理多个 Git 账号的问题。简单来说,如何实现上班 Gitlab,下班 Github 呢?

单账号管理

  • 适用场景:
    • 单账号管理适用于个人开发者或使用同一身份在不同项目中工作的情况。
    • 在单账号管理下,你只需配置一个全局的用户名和邮箱地址,并使用它们进行所有的提交操作。
    git config --global user.name "Your Name"
    git config --global user.email "your.email@example.com"
    

多账号管理

  • 适用场景:
    • 多账号管理适用于同时使用多个身份(账号)在不同项目中工作的情况,例如个人项目和工作项目。
    • 每个账号都有独立的用户名和邮箱地址,并与特定的项目关联。
    • 针对每个项目,你需要在项目目录中设置局部的用户名和邮箱地址。
    # 进入项目目录
    cd /path/to/your/project
    
    # 配置局部的用户名和邮箱地址
    git config user.name "Your Name"
    git config user.email "your.email@example.com"
    

多账号 SSH 配置

如果你想在一台电脑上同时使用不同的 Git 服务(如公司的 GitLabGitHub),并且希望实现 SSH 免密访问,你可以通过以下步骤进行多账号的 SSH 配置。

  1. 生成 RSA 密钥对的非交互式命令

    • 超管用户(root):
      ssh-keygen -t rsa -N "" -C "your.email@example.com" -f /root/.ssh/<private_key>
      
    • 普通用户(admin):
      # 生成 GitLab 密钥对
      sudo -u admin ssh-keygen -t rsa -N "" -C "your_gitlab_email@company.com" -f /home/admin/.ssh/id_rsa_gitlab
      
      # 生成 GitHub 密钥对
      sudo -u admin ssh-keygen -t rsa -N "" -C "your_github_email@gmail.com" -f /home/admin/.ssh/id_rsa_github
      
  2. SSH 识别新的私钥

    ssh-add ~/.ssh/id_rsa_gitlab
    ssh-add ~/.ssh/id_rsa_github
    
  3. 创建一个用于配置多账号的 SSH config 文件

    touch ~/.ssh/config
    
    Host *
        StrictHostKeyChecking no
        GSSAPIAuthentication yes
        GSSAPIDelegateCredentials no
    
    # GitHub
    Host git@gitlab.org
        HostName https://gitlab.company.org
        User <Your Name>
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa_gitlab
        Port <Gitlab Port>
    
    # GitHub
    Host git@github.com
        HostName https://github.com
        User <Your Name>
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa_github
        Port 22
    
  4. 将生成的公钥上传到相应的 Git 服务上

    # 将 id_rsa_gitlab.pub 文件中的内容添加到公司的 GitLab 账户中的 SSH 密钥设置中
    cat ~/.ssh/id_rsa_gitlab.pub
    
    # 将 id_rsa_github.pub 文件中的内容添加到个人的 GitHub 账户中的 SSH 密钥设置中
    cat ~/.ssh/id_rsa_github.pub
    
  5. 本地测试 SSH 连接

    # 测试公司 Gitlab
    ssh -T git@gitlab.org
    Welcome to GitLab, @xxx!
    
    # 测试 Github
    ssh -T git@github.com
    Hi xxx! You have successfully authenticated, but GitHub does not provide shell access.
    

全局配置

git config --global 命令用于在全局范围内配置 Git 的设置。以下是一些常用的 --global 设置选项。

  1. 用户名:设置你的 Git 用户名,这将作为每个提交的作者标识。

    git config --global user.name "Your Name"
    
  2. 邮箱:设置你的 Git 邮箱地址,这也将作为每个提交的作者标识。

    git config --global user.email "your.email@example.com"
    
  3. 文本编辑器:设置你喜欢使用的文本编辑器,Git 将使用该编辑器打开提交信息的编辑界面。

    git config --global core.editor "vim"
    
  4. 换行符处理:设置 Git 在不同操作系统之间自动转换换行符的行为。

    • Windows 系统上:
      git config --global core.autocrlf true
      
    • macOSLinux 系统上:
      git config --global core.autocrlf input
      
  5. 忽略文件:指定一个全局的 .gitignore 文件,用于忽略特定文件或目录的版本控制。

    git config --global core.excludesfile ~/.gitignore_global
    
  6. 默认分支:设置默认的远程跟踪分支的名称,可以使命令更便捷。

    git config --global init.defaultBranch main
    
  7. 别名:创建简化的命令别名,以提高工作效率。

    git config --global alias.co checkout
    git config --global alias.br branch
    git config --global alias.ci commit
    git config --global alias.st status
    

管理项目

作为管理员或者 Repo Owner,可以使用命令行工具来管理整个项目。下面列举一些常见的命令。

  1. 创建新项目:你可以使用以下命令创建一个新的 Git 仓库:

    git init
    
  2. 克隆现有项目:如果项目已经存在于远程仓库中,你可以使用以下命令克隆项目到本地:

    git clone <远程仓库地址>
    
  3. 添加文件到暂存区:在开始跟踪新文件或修改现有文件之前,你需要将它们添加到 Git 的暂存区中。可以使用以下命令完成:

    git add <文件名>
    
  4. 提交更改:当你已经将所有需要提交的更改添加到暂存区后,可以使用以下命令将更改提交到版本控制系统中:

    git commit -m "提交信息"
    
  5. 查看项目状态:你可以使用以下命令查看当前项目的状态,包括已修改、已删除、已添加到暂存区等文件的状态:

    git status
    
  6. 查看提交历史:你可以使用以下命令查看项目的提交历史记录,包括每次提交的作者、提交时间和提交信息等:

    git log
    
  7. 推送更改到远程仓库:当你想将本地的更改推送到远程仓库时,可以使用以下命令:

    git push origin <分支名>
    
  8. 管理分支:你可以使用以下命令来创建、切换和合并分支,以及删除不再需要的分支:

    • 创建新分支:git branch <分支名>
    • 切换到分支:git checkout/switch <分支名> (更推荐 switch
    • 合并分支:git merge <目标分支名>
    • 删除分支:git branch -d <分支名>

协作开发

下面介绍一种简单的 Git 协作开发方式,具体的流程可能因项目和团队而异。在实际开发中,还应该考虑代码审查、分支管理策略以及与团队成员之间的沟通等方面。

合并更新到远程主分支

  1. 克隆仓库:从远程仓库中克隆代码到本地。

    git clone <远程仓库地址>
    
  2. 创建分支:每个开发人员在本地创建自己的分支,用于进行独立的开发工作。

    git checkout -b <your_branch>
    
  3. 进行开发:在各自的分支上进行开发工作,可以对文件进行增删改,代码编写等操作。

  4. 提交更改:在完成一部分工作后,开发人员将更改提交到各自的分支上。

    git add .
    git commit -m "提交信息"
    git push origin <your_branch>
    
  5. 合并代码:当开发人员完成了自己的任务并经过测试验证后,可以将他们的分支合并回主分支(main)。

    # 切换回主分支
    git checkout main
    
    # 拉取最新的主分支(*重要)
    git pull origin main
    
    # 合并你的分支
    git merge <your_branch>
    
  6. 解决冲突:如果在合并分支时出现冲突,需要手动解决冲突。打开有冲突的文件,根据提示进行修改,然后提交更改。

  7. 推送更改:合并完成后,开发人员将最新的代码推送到远程仓库。

    git push origin main
    

拉取更新到本地开发分支

  1. 拉取最新的代码:在继续新的开发之前,请确保你的本地仓库是基于最新的代码进行工作。

    git pull origin main
    
  2. 切换到开发分支:请确保你切换回你自己的分支,以便在该分支上继续开发。

    git checkout <your_branch>
    
  3. 合并主分支更新(可选):如果你认为主分支的更新对你当前的开发有影响,你可以选择将主分支的更新合并到你的分支中。

    git merge main
    
  4. 开发作业:当你的本地分支处于最新状态后,你可以开始进行开发工作。修改、添加和删除文件,进行代码编写等操作。

  5. 提交与推送:见上小结。

回滚提交

可以使用 Git 提供的 git revertgit reset 命令。这两个命令的区别在于回滚方式的不同。

  • 使用 git revert 回滚提交:

    • git revert 会创建一个新的提交来撤销指定的提交,并保留原始提交历史。
    • 可以使用以下命令回滚最近一次提交:
      git revert HEAD
      
    • 可以使用以下命令回滚特定的提交(使用提交的哈希值):
      git revert <commit-hash>
      
  • 使用 git reset 回滚提交:

    • git reset 将重置提交历史到指定的提交,丢弃了回滚的提交以及之后的提交。
    • 如果你想完全删除某个提交以及它之后的提交,可以使用以下命令(谨慎使用,因为这会改变历史记录):
      git reset --hard <commit-hash>
      
    • 如果你只想撤消某个提交以及它之后的提交,但是保留更改作为未添加的更改,可以使用以下命令:
      git reset <commit-hash>
      
  • 具体示例(每个 ^ 表示回退一个提交):

    # 表示回退到前一个提交
    git reset --hard HEAD^
    
    # 表示回滚两个提交
    git reset --hard HEAD^^
    
    # 表示回滚三个提交
    git reset --hard HEAD^^^
    
    # 依此类推 ...
    

删除分支

当某个分支不再需要,可以按以下步骤进行删除

  1. 首先,确保您在工作目录中,并且当前位于其他分支(例如 master 分支)上。

  2. 使用以下命令来查看分支列表,确认要删除的分支是否存在:

    git branch -a     # 同时查看本地和远程分支
    
    git branch        # 查看本地分支
    
    git branch -r     # 查看远程分支
    
  3. 删除 fix-123 分支。如果该分支上没有未合并的更改,可以使用 -d 标志

    git branch -d fix-123
    
  4. 将删除的分支推送到远程存储库(如果需要从远程存储库中删除该分支)

    git push origin --delete fix-123
    

标签管理

通常情况下,你可以在 dev 分支上进行开发、测试和调试,然后在准备好发布或部署时,将 dev 分支中的代码合并到 master 分支,再为 master 分支打上适当的版本标签。

具体步骤可能如下:

  1. dev 分支上进行开发、测试和调试,确保代码稳定。

  2. 当代码准备好发布时,在 dev 分支上打上一个开发期间的版本标签,例如 v0.1.0-dev

  3. dev 分支合并到 master 分支,解决可能出现的冲突。

  4. master 分支上打上正式发布的版本标签,例如 v1.0.0

这样做的好处是,master 分支中的标签可以用作稳定版本的发布,而 dev 分支中的标签可以用作开发版本的标识。这样在需要回滚或跟踪代码版本时,能够更方便地管理和识别不同的版本。

  • 想要给标签添加更多信息,可以使用 -a 参数:

    git tag -a v1.0.0 -m "Release v1.0.0"
    
  • 推送标签到远程仓库:

    git push origin v1.0.0
    
  • 删除本地仓库提交的标签:

    git tag -d v1.0.0
    
  • 删除已经提交远程仓库的标签:

    git push origin :refs/tags/v1.0.0
    
  • 查看提交过的标签记录:

    git tag
    
  • 更细粒度的标签应用场景: 如果 Go 项目采用子包管理方式,为了解决命名冲突的问题,可以为不同的子包创建单独的命名空间,以便在不同子包中使用不同的版本标签,将 v1.0.0 替换成 subpackage-a/v1.0.0

修改历史的提交消息

changing-a-commit-message

GitHub Pull Request

为何提交 PR

在开源项目中,用户和贡献者通常会提交 Pull Request (PR) 来解决以下几类问题:

  • 修复 Bug:如果你在使用开源项目的过程中遇到了错误,且你找到并修复了这个错误,那么你可以提交 PR 将这个修复提交给开源项目。
  • 添加新的特性或提高性能:如果你为开源项目添加了新的特性,或是改善了项目的性能,你也是可以提交一个 PR 的。
  • 改进文档或测试:开源项目的文档和测试是非常重要的部分,改进这些内容同样可以通过提交 PR 来完成。
  • 代码重构或清理:如果你优化了项目的代码结构,或是删除了过时的、未被使用的代码,这也是值得提交一个 PR 的。

如何提交 PR

  1. Fork 仓库:访问原始仓库,并点击页面右上角的 "Fork" 按钮。这将会创建一个该仓库的副本到你的 GitHub 账号下。

  2. 克隆 Fork 到你的本地:在你的 GitHub 账号下找到新创建的 Fork,然后复制 "Code" 按钮下的 URL。在你的电脑上打开命令行窗口,输入 git clone [URL] 来把这个 Fork 克隆到你的本地。

  3. 创建新的分支:在本地仓库中,使用 git checkout -b [分支名称] 命令创建新的分支。分支名可以随意取,尽量使其具有描述性,例如 "fix-[描述信息]"。

  4. 进行修改并提交:使用文本编辑器打开并修改相关文件,然后将修改添加到 Git,通过 git commit -m "[提交信息]" 来提交你的修改。

  5. 推送到你的 Fork:通过 git push origin [你的分支名称],把改动推送到你在 GitHub 上的 Fork。

  6. 创建 Pull Request:回到你在 GitHubFork 页面,你会看到一个 "Your recently pushed branches:" 的提示,点击 "Compare & pull request" 按钮。在新的页面填写你的 PR 的标题和描述,然后点击 "Create pull request"。

  7. 等待审核:仓库的维护者会审查你的修改,有可能会提出要求你做更多修改的需求。一切顺利的话,你的 PR 就会被合并到主分支。

参考教程