Git 是团队开发项目时必不可少的工具,故在此梳理记录 Git 的常用知识点,以便学习查阅。
一、Git 是什么
Git 是一种分布式版本控制系统,用于跟踪计算机文件的变化并协作多人开发项目。
二、Github 是什么
Github 是一个基于 Web 的 Git 仓库托管服务,为开发者提供了一个平台,使他们能够在云端存储和管理 Git 仓库。此外,类似的代码托管平台还有 GitLab、Gitee 等。
-
版本控制: GitHub 基于 Git,提供了强大的版本控制功能。开发者可以跟踪项目的变化、管理不同版本的代码,并轻松地回滚到先前的状态。
-
协作开发: GitHub 允许多个开发者协同工作。通过分支和合并请求,团队成员可以并行地开发不同的功能或修复bug,然后将这些更改合并到主分支中。
-
代码审查: 合并请求(Pull Requests)是GitHub 中的一个关键概念。开发者可以创建合并请求,邀请其他人对代码进行审查,确保代码质量、可读性和符合项目标准。
-
开源项目托管: GitHub 为开源项目提供了一个中心化的平台,使得开发者可以分享他们的代码、贡献代码、报告问题,从而推动开源社区的发展。
-
问题跟踪: GitHub 的问题跟踪系统使团队能够报告、分配和解决问题。这对于跟踪 bug、讨论新功能和管理项目进度非常有帮助。
-
持续集成和部署: GitHub Actions 允许开发者设置自动化流程,例如在代码提交后运行测试、构建项目或部署应用程序。这有助于确保每个更改都经过了自动化测试,并且可以顺利地集成到项目中。
-
社交互动: 用户可以关注其他用户、星标仓库以及参与讨论,使 GitHub 成为一个社交平台。许多课程、教程和教学资源都托管在 GitHub 上,使学生和教师能够方便地共享代码和学习材料。
三、Git 如何使用
(1)Git 工作原理
初始化本地 Git 仓库之后,会生成一个 .git 的隐藏文件夹,用来存储 Git 仓库的所有信息。
-
工作区(Working Directory):
工作区是在计算机上看到的目录,包含项目的实际文件,不包括隐藏文件夹 .git。
-
暂存区(Staging Area):
暂存区是一个中间区域,用于存放已经修改过的文件。在提交到本地仓库之前,需要通过
git add命令将文件的更改添加到暂存区。这样可以选择性地将文件的更改纳入下一次的提交中。也叫 index,在隐藏文件夹 .git 中。
-
本地仓库(Local Repository):
本地仓库是存储在计算机上的 Git 仓库。它包含了完整的项目历史记录,包括所有的分支、提交、标签等。当运行
git commit命令时,将会把暂存区的更改保存到本地仓库。.git 文件夹存储 Git 仓库的所有信息。
-
远程仓库(Remote Repository):
远程仓库是托管在网络上的 Git 仓库,如 GitHub、GitLab 或 Bitbucket 等。远程仓库可以是个人的,也可以是团队共享的。可以通过
git push将本地仓库的更改推送到远程仓库,并通过git pull拉取远程仓库的更改。
-
分支(Branch):
分支(Branch)是指指向某个特定提交的指针,它允许你在项目中的不同版本之间切换。每个分支都是一个独立的开发线,你可以在不影响主干(通常是
master分支)的情况下进行开发、测试和实验。分支的使用使得多人协作和并行开发变得更为灵活。
(2)基本命令
-
初始化仓库:
git init: 在当前目录初始化一个新的 Git 仓库。 -
克隆仓库:
git clone <仓库URL>: 克隆远程仓库到本地。 -
配置用户信息:
git config --global user.name "Your Name": 配置用户姓名。git config --global user.email "you@example.com": 配置用户邮箱。 -
添加文件到暂存区:
git add <文件名>: 将文件的更改添加到暂存区。git add .: 将所有修改添加到暂存区。 -
提交更改到本地仓库:
git commit -m "Commit message": 将暂存区的更改提交到本地仓库。 -
查看状态和差异:
git status: 查看工作区、暂存区和本地仓库的状态。git diff: 查看工作区和暂存区的差异。 -
查看提交历史:
git log: 查看提交历史记录。 -
创建分支:
git branch <branch_name>: 创建一个新的分支。git checkout -b <branch_name>: 创建并切换到一个新的分支。 -
切换分支:
git checkout <branch_name>: 切换到指定分支。 -
合并分支:
git merge <branch_name>: 将指定分支的更改合并到当前分支。 -
删除分支:
git branch -d <branch_name>: 删除指定分支。 -
远程操作:
git remote -v: 查看远程仓库的信息。git remote add <remote_name> <remote_url>: 添加远程仓库地址,在推送和拉取时,可以使用短名称来引用远程仓库的地址git push origin <branch_name>: 推送本地分支到远程仓库。git pull origin <branch_name>: 拉取远程仓库的更改。 -
撤销操作:
git restore <文件名>: 将工作区中指定文件的更改还原为最近一次提交时的状态.git restore --staged <文件名>: 将暂存区中指定文件的更改还原到工作区,并保持工作区中的文件不变。git reset <commit>: 撤销到指定的提交。git revert <commit>: 撤销指定的提交,生成一个新的提交。 -
其他:
gitignore: 创建并配置.gitignore文件,用于忽略特定文件和目录。git fetch: 拉取远程仓库的变化,但不合并。
四. 基本工作流程:
-
创建仓库,并连接本地 Git 与 GitHub
-
在GitHub上创建仓库:
- 打开 GitHub,登录你的账户。
- 在右上角,点击加号图标,选择 "New repository"。
- 设置仓库的名称、描述、公开/私有等选项,并点击 "Create repository"。
-
在本地初始化Git仓库:
- 打开命令行或终端。
- 进入你的本地项目目录。
git init - 运行
git init命令,初始化本地 Git 仓库之后,会生成一个 .git 的隐藏文件夹,用来存储 Git 仓库的所有信息。
-
将本地仓库与远程仓库关联:
-
在 GitHub 上的仓库页面中,复制远程仓库的URL。
-
在本地项目目录中运行以下命令,将本地仓库与远程仓库关联:
git remote add origin <远程仓库的URL> -
这里的
<远程仓库的URL>应该替换为你实际的远程仓库 URL。
-
-
将本地分支与远程分支关联:
-
在本地项目目录中运行以下命令,将本地分支与远程分支关联(通常是主分支):
git branch -M main git push -u origin main -
这里的
main应该替换为你实际的分支名。
-
-
推送本地代码到远程仓库:
-
在本地项目目录中进行一些修改,然后使用以下命令将这些更改推送到 GitHub:
git add . # 提交所有文件至暂存区 git commit -m "Initial commit" # 提交第一次修改 git push -u origin main #远程仓库的main分支 -
把本地的更改推送到在 GitHub 上创建的仓库中。
-
现在,本地 Git 仓库就与 GitHub 远程仓库连接起来了。以后可以使用 git push 将本地更改推送到 GitHub,使用 git pull 拉取 GitHub 上的更改。
-
克隆他人或团队的仓库,并进行提交
-
Fork GitHub 仓库:
- 打开 GitHub 上的原始项目页面。
- 点击页面右上角的 "Fork" 按钮,这将创建一个独立的仓库,并将原始项目的代码库复制到你的 GitHub 账户下。
-
在本地选择克隆位置:
- 在本地决定克隆仓库的位置。在命令行中使用
cd命令切换到你想要放置仓库的目录。
- 在本地决定克隆仓库的位置。在命令行中使用
-
执行克隆命令:
-
获取仓库URL:
git clone <仓库URL> -
或者如果你想要在克隆的同时指定一个本地目录的名称:
git clone <仓库URL> <本地目录名称>
-
-
输入凭据信息(如果需要):
- 如果远程仓库是私有的,你可能需要输入你的用户名和密码,或者使用SSH密钥进行身份验证。
-
等待克隆完成:
- Git 会下载远程仓库的所有文件和版本历史,并在本地创建一个与远程仓库相同的仓库。
-
修改、提交和拉取:
- 克隆完成后,你就可以在本地对仓库进行修改、提交和拉取等操作。
- 分割多个 Commit 可以使版本控制历史更加清晰,每个 Commit 只关注一个特定的功能或修改。通常会进行多次 Commit,然后创建一个 Pull Request 将这一系列的 Commits 合并到原始仓库。
- 通过
git pull命令,可以随时获取远程仓库的最新更改。
-
Pull Request:
- 通知 GitHub 源仓库(原始项目)你已经在你的 forked 仓库中做了一些更改,请求将这些更改合并到源仓库的操作。
-
解决冲突
代码冲突(Merge Conflict)通常发生在多个开发者或团队成员同时修改同一文件的同一部分,而这些修改无法被自动合并时。
-
检测冲突: 尝试合并分支或拉取远程更改时,如果发生冲突,Git 会将冲突的文件标记为冲突状态。可以使用以下命令检查冲突:
git status -
打开冲突文件: 在文件中,Git 会用特殊标记标识冲突的部分。标记通常是这样的:
<<<<<<< HEAD // 你的修改 ======= // 对方的修改 >>>>>>> branch-name -
解决冲突: 手动编辑文件以解决冲突。你需要决定保留哪个修改,或者可能将两者结合在一起。删除特殊标记并保留你需要的修改。编辑完成后,文件应该不再包含特殊标记。
-
标记为已解决: 使用以下命令将文件标记为已解决冲突:
git add <冲突文件> -
完成合并: 如果有多个冲突文件,解决完所有冲突后,使用
git commit完成合并提交。git commit -m "解决冲突" -
继续合并或推送: 如果你是在合并分支,你可能需要继续合并操作。如果你是在拉取远程更改,可以继续尝试
git pull或git push。
五. GitHub 的基本功能
- 新建仓库: 设置名称,公有私有,readme 等。
- PR: 请求将更改合并到源仓库,可以审查所有历史提交和代码。
- Issues: 一个“issue”通常代表项目中的一个具体任务、bug、新功能请求或其他需要讨论和解决的事项。每个问题都有一个独一无二的编号,可以分配给特定的团队成员,并分配一个标签以表示其类型(如bug、enhancement等)。
六. IDEA 中的 Git
许多 IDE 集成了 Git,可以直接使用图形化方式进行 Git 操作,而无需使用 Git 命令。
-
查看每行代码的作者:
- 右键点击Annotate
-
提交修改:
- 在暂存区选择要提交的修改
- 提交commit
- push 推送