Git 是一个分布式版本控制系统,用于跟踪软件开发过程中的代码变更。它允许多个开发者协同工作,同时记录代码的变更历史,管理不同版本的代码库,以及轻松地创建分支和合并代码。

基础概念

以下是与 Git 相关的一些关键概念和命令:

  1. 仓库(Repository):仓库是包含项目及其所有文件的目录,同时还包括了代码变更的历史记录。
  2. 克隆(Clone):要开始使用一个 Git 仓库,通常会使用 git clone 命令将远程仓库克隆到本地计算机上
  3. 提交(Commit):提交是在特定时间点对你的更改进行快照。你可以使用 git commit 命令将更改保存到本地仓库。
  4. 分支(Branch):分支是仓库内的一个独立开发线。它允许你在不影响主要代码库的情况下开发功能或修复问题。可以使用 git branch 创建分支,使用 git checkout 在不同分支之间切换。
  5. 合并(Merge):合并将一个分支的更改合并到另一个分支中。使用 git merge 命令将源分支的更改集成到目标分支中。
  6. 拉取(Pull):拉取是从远程仓库获取更改并将其整合到本地仓库的过程。这通常用于保持本地仓库与远程仓库同步。你可以使用 git pull 进行拉取操作。
  7. 推送(Push):推送将本地的提交发送到远程仓库。这是与他人共享更改的方式。使用 git push 进行推送操作。
  8. 远程(Remote):远程是对远程仓库的引用,通常托管在平台如 GitHub、GitLab 或 Bitbucket 上。可以使用 git remote 命令添加、删除或管理远程仓库。
  9. 状态(Status)git status 命令显示仓库的当前状态,包括已经进行但尚未提交的更改。
  10. 差异(Diff)git diff 命令显示两个版本之间的差异,帮助你理解所做的更改。

常用命令

以下是一些可能会用到的命令及其简要描述:

  1. git init:在当前目录初始化一个新的 Git 仓库。
  2. git clone <URL>:从远程仓库克隆代码到本地。
  3. git add <file>:将文件的更改添加到暂存区。
  4. git commit -m "message":将暂存区的更改提交到本地仓库。
  5. git status:查看当前仓库的状态,包括未提交的更改。
  6. git diff:显示当前工作目录中的更改。
  7. git branch:列出所有本地分支,显示当前所在分支。
  8. git checkout <branch>:切换到指定分支。
  9. git merge <branch>:将指定分支的更改合并到当前分支。
  10. git pull:从远程仓库拉取最新更改。
  11. git push:将本地更改推送到远程仓库。
  12. git remote add <name> <URL>:添加一个远程仓库。
  13. git log:查看提交历史记录。
  14. git reset <file>:从暂存区撤销文件的更改。
  15. git revert <commit>:创建一个新提交,撤销指定提交的更改。
  16. git stash:将当前未提交的更改暂存起来,以便在切换分支时使用。
  17. git tag <tagname>:创建一个标签,用于标记某个特定的提交。

git的工作原理

工作区域

Git本地有三个工作区域∶工作目录(Working Directory )、暂存区(Stage/ndex)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下∶
图片损坏

Workspace :工作区,就是平时存放项目代码的地方
Index / Stage:暂存区,用于临时存放改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository :仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交的所有版本的数据。其中HEAD指向最新放入仓库的版本

工作流程

  1. 在工作目录中添加、修改文件;
  2. 将需要进行版本管理的文件放入暂存区域;
  3. 将暂存区域的文件提交到git仓库。
    因此,git管理的文件有三种状态:已修改,已暂存,已提交

关于分支

git是一个帮助多人协同合作的工具,由于个人之间的工作不同,项目代码势必会在同一基础上进行不同的修改,这个同一基础就是master主分支,要对master进行修改,一般要新建一个分支,对master进行不同修改后得到的不同分支进行合并时,一般会由git判断是否存在冲突,这时,Git 不能自动决定应该选择哪个更改,因为它无法确定哪个更改是正确的。在这种情况下,Git 会将冲突标记在文件中,然后需要开发者手动解决冲突,冲突解决后,可以将合并后的这个新的分支设置为新的master
解决冲突的一般步骤是:

  1. 执行git pu11以获取远程分支的最新更改。
  2. Git将会提示存在冲突的文件,需要在这些文件中手动编辑并解决冲突。
  3. 编辑后的文件需要保存,然后使用git add将文件标记为已解决。
  4. 最后,运行git commit来提交解决冲突的更改。

关于一些常见问题

  1. Git的原理和工作流程: Git 是一种分布式版本控制系统,它的核心原理是基于快照(snapshot)。每次提交(commit)都会创建一个文件和目录的快照,而不是保存文件之间的差异。Git 的工作流程通常包括以下步骤:
    • 克隆(Clone):从远程仓库复制项目到本地,创建一个本地仓库。
    • 工作目录(Working Directory):在本地仓库中,你可以在工作目录中修改文件。
    • 暂存区(Staging Area):将工作目录中的修改添加到暂存区,为下一次提交做准备。
    • 提交(Commit):从暂存区中创建一个快照,将其保存到版本历史中。
    • 分支(Branch):可以创建分支来在不同功能上开展并行开发,每个分支都有自己的工作目录、暂存区和提交历史。
    • 合并(Merge):将不同分支上的修改合并到一起,形成一个新的提交。
    • 推送(Push):将本地提交推送到远程仓库,与团队共享。
    • 拉取(Pull):从远程仓库获取最新的变更,包括其他人的提交。
  2. 版本控制系统: 版本控制系统(Version Control System,VCS)是一种用于追踪和管理文件版本和变更历史的工具。它允许多人协同开发、追踪代码变化、回溯历史、分支和合并等。VCS 的主要目的是使开发团队能够更有效地协同工作,减少错误和冲突,并为项目提供详细的版本历史。
  3. git fetch和git pull命令的区别
    • git fetch:从远程仓库获取最新的提交和分支信息,但不会自动合并或更新你的工作目录。它会将获取的内容存储在本地仓库的远程跟踪分支中。

    • git pull:执行两个操作,首先,它会从远程仓库拉取最新的提交并合并到当前分支,然后更新你的工作目录。这相当于执行了 git fetch 后紧接着的 git merge

  4. git rebase和git merge命令的区别
    • git merge:将一个分支的更改合并到另一个分支。合并会创建一个新的提交节点,记录两个分支的历史交汇点。
    • git rebase:将一个分支上的更改在另一个分支的基础上重新应用。它将当前分支上的提交逐个应用到目标分支的顶部,创造更线性的提交历史。
  5. Git Flow: Git Flow 是一种流行的 Git 分支管理工作流,它提供了一套规范的分支命名和管理策略。它包括主分支(master)、开发分支(develop)、功能分支(feature)、发布分支(release)、修复分支(hotfix)等。Git Flow 的好处在于使协同开发更有条理,促进版本控制和发布的流程化,降低冲突和错误。
  6. 暂存区: 暂存区是 Git 版本控制系统的一个重要概念。在进行提交之前,你可以将工作目录中的修改(包括新增、修改和删除的文件)添加到暂存区。暂存区允许你控制哪些更改应该包含在下一次提交中。这使你能够构建精细的提交,准备提交前进行检查,避免错误和混乱的提交。
    Git 需要暂存区的存在,因为它提供了更多的控制权和准备提交的灵活性。你可以选择性地将不同文件的修改添加到暂存区,从而创建更清晰、有序的提交历史。
  7. 控制某些文件不被提交: 你可以使用.gitignore文件来控制哪些文件或目录在提交时被忽略。在项目根目录下创建或编辑.gitignore文件,然后列出你希望忽略的文件、目录、通配符等。这样,这些文件就不会出现在提交中。
  8. 提交冲突的情况和解决方法: 冲突通常发生在以下情况:
    • 多人同时修改同一行或相邻行的代码。
    • 合并分支时,两个分支有相同文件的不同修改。
      解决冲突的步骤:
    • 运行 git status 查看冲突文件。
    • 打开冲突文件,在文件中可以看到类似于 <<<<<<< HEAD=======>>>>>>> branch_name 的标记,这是冲突的标志。
    • 手动编辑文件,保留需要的代码部分,删除冲突标记和无关的部分。
    • 保存文件,然后运行 git add 将冲突文件标记为已解决。
    • 运行 git commit 提交解决冲突后的修改。
  9. 恢复错误的代码或删除的文件
    • 对于已提交的错误代码,可以通过创建新的提交来修复。你可以修改代码,然后提交一个新的修复提交。
    • 对于已删除的文件,如果你没有提交删除操作,可以使用 git checkout 命令来还原文件,例如:git checkout filename
  10. 项目代码管理的方法
    • 使用版本控制系统,如 Git。
    • 遵循分支管理策略,如 Git Flow,以便有条理地管理功能开发、测试和发布。
    • 使用代码审查来保证代码质量。
    • 使用持续集成和持续交付工具,确保代码的集成和交付过程自动化、稳定和可重复。
    • 鼓励团队成员遵循一致的编码风格和最佳实践。
  11. 防止错误的代码提交
    • 使用代码审查:通过审查他人的代码,可以发现和纠正错误。
    • 使用自动化测试:编写自动化测试用例来检查代码是否正常工作。
    • 使用持续集成:集成和自动化测试可以在提交之前自动运行,减少错误的机会。
    • 使用预提交挂钩(pre-commit hooks):可以设置钩子,在提交前运行特定的脚本来检查代码是否符合规范。