Git 的正确使用姿势与最佳实践:团队协作和版本控制的最佳实践 | 青训营

66 阅读5分钟

0 术语

Git 是一个分布式版本控制系统,用于跟踪代码的变化并协调多人在同一个项目上的开发。

  • 版本库(Repository): 也称为仓库,是存储代码及其历史变化的地方。每个项目都有一个 Git 仓库,它可以存储在本地或远程服务器上。
  • 提交(Commit): 提交是代码的一个快照,记录了文件的改变。每个提交都有一个唯一的哈希值,用于标识这个提交。
  • 分支(Branch): 分支是一个代码的分割线,让你可以在不影响主线开发的情况下进行修改。主分支通常是 master(或 main)分支,而其他分支则可以用于开发新功能、修复错误等。
  • 合并(Merge): 合并是将一个分支的更改合并到另一个分支中,以保持代码同步。
  • 拉取(Pull)与推送(Push): 拉取操作将远程仓库的更改同步到本地,推送操作将本地的更改同步到远程仓库。
  • 克隆(Clone): 克隆是指复制一个远程仓库到本地,用于开始一个新的开发工作。
  • 远程仓库(Remote Repository): 远程仓库是存储在网络服务器上的仓库,多人协作时可以用于共享代码。
  • 代码冲突(Conflict): 当多个分支对同一个文件进行了不同的更改,并且试图将它们合并时,可能会发生代码冲突。解决冲突需要手动编辑文件并选择保留哪些更改。

1 文件的三种状态

在 Git 中,文件可以存在三种不同的状态。

  • 已修改(Modified): 这是文件的初始状态,表示文件的内容发生了改变,但这些改变尚未被保存到版本控制系统中。
  • 已暂存(Staged): 在已修改的文件上运行 git add 命令后,文件的改变会被添加到暂存区(也称为索引)。这意味着 Git 记录了你希望在下一次提交中包含的更改。
  • 已提交(Committed): 当你运行 git commit 命令后,Git 会将暂存区中的改变作为一个新的提交保存到仓库中。这个提交包含了一个唯一的哈希值,以及你在提交时附加的消息,描述了这个提交所做的更改。

这三个状态之间的转换关系如下。

  • 从已修改状态到已暂存状态:使用 git add 命令将修改后的文件添加到暂存区。

  • 从已暂存状态到已修改状态:使用 git reset 命令将暂存区的文件变回初始状态。

    通过使用 HEAD 来表示最新的提交,使用 git reset HEAD 来当前所在的分支的最新提交的某文件回到初始状态。

  • 从已暂存状态到已提交状态:使用 git commit 命令将暂存区的改变提交到仓库中,创建一个新的提交。

2 与远程仓库交互

  • 使用 git clone 命令可以将一个远程仓库复制到本地。克隆操作将在本地创建一个新的仓库,并自动设置一个追踪远程仓库的主分支。

  • 使用 git remote add <remote-name> <remote-url> 命令可以将一个远程仓库添加到本地仓库的远程列表中。你可以为每个远程仓库设置一个名称,以便后续引用。

    关于 origin

    origin 是默认的远程仓库别名,用于表示克隆或拉取代码的远程仓库。当克隆一个远程仓库时,Git 会自动将该远程仓库的 URL 设置为默认远程仓库别名 origin

  • 使用 git remote -v 命令可以查看当前仓库关联的远程仓库列表及其 URL。

  • 使用 git remote remove <remote-name> 命令可以将指定的远程仓库从本地仓库中移除。

3 分支

3.1 分支的创建、切换、合并和删除

  • 使用 git branch <branch-name> 创建一个分支。
  • 使用 git branch 查看所有分支。
  • 使用 git branch -r 命令查看远程分支列表。
  • 使用 git checkout <branch-name> 切换到分支。
  • 使用 git merge <source-branch> 将当前分支和 <source-branch> 合并。
  • 使用 git branch -d <branch-name> 删除已经合并的分支。
  • 使用 git branch -D <branch-name> 删除未被合并的分支。

3.2 分支的拉取

  • 使用 git fetch 获取远程仓库的最新状态,但不会自动合并到本地分支。

  • 使用 git merge <branch-name> 将远程分支的最新更改合并到本地分支。

  • 使用 git pull origin <branch-name> 拉取远程仓库的最新更改并立即将其合并到当前分支。它是 git fetchgit merge 的组合。

    关于 fast-forwardnon-fast-forward

    在 Git 中,fast-forwardnon-fast-forward 是两种不同的方式来合并分支。fast-forward 合并适用于在没有新提交的情况下将一个分支合并到另一个分支,而 non-fast-forward 合并适用于在另一个分支上有新提交的情况下将两个分支的变化合并在一起。

    当从一个分支(比如特性分支)合并到另一个分支(比如主分支)时,如果主分支上没有新的提交,Git 可以直接把主分支的指针移动到特性分支的最新提交,这被称为 fast-forward 合并。这意味着主分支没有其他新的变化,只是简单地包含了特性分支的提交。

    如果想把一个分支合并到另一个分支,而另一个分支上已经有了新的提交,那么 Git 无法简单地将指针移动过去,因为这会导致分支历史的分叉。在这种情况下,Git 将创建一个新的合并提交,将两个分支的变化合并在一起。这被称为 non-fast-forward 合并。

4 Reference

Pro Git