一、Git相关概念
Git是一种分布式版本控制系统,主要用于跟踪和管理代码的变更。它由Linus Torvalds创建,最初被设计用于Linux内核的开发,现已成为软件开发过程中广泛使用的版本控制工具。
1.基本概念
- 版本控制:Git能够跟踪代码的每一次修改,并允许用户回滚到任何一个历史版本,这对于确保代码的稳定性和可追溯性至关重要。
- 分布式系统:Git是分布式的,意味着每个开发者都可以在自己的本地分支上进行操作,不需要依赖于中央服务器。这种特性提高了开发的灵活性和可靠性。
- 团队协作:Git支持多人协作,不同开发者可以在同一项目上进行开发,通过分支管理来避免代码冲突,提高工作效率。
2.主要功能
- 版本控制:Git可以记录代码的每次修改,并提供回滚到任何历史版本的能力。
- 分支管理:支持多个分支,允许开发者在不同的分支上并行工作,最后再合并到主分支上。
- 分布式特性:每个开发者都有完整的代码库副本,可以在没有网络连接的情况下进行开发。
- 团队协作:通过Git,开发者可以轻松地共享代码、解决冲突,并共同推动项目的进展。
3.版本控制工具
3.1集中式版本控制工具
集中式版本控制工具是指所有的项目版本都集中存储在唯一的服务器中,而团队中的使用者本地只保存有最新版本的文件。这种模式下,团队成员需要通过连接到这个中心服务器来进行代码的提取、修改和提交等操作。
主要特点
- 单一服务器:所有版本数据都存储在中央服务器上,团队成员通过客户端与服务器交互。
- 权限管理:管理员可以方便地控制每个团队成员的访问权限。
- 依赖性强:团队成员的工作高度依赖于服务器的稳定性和网络连接。
优点
- 权限管理集中,易于控制。
- 适合大型团队和复杂项目,能够高效处理大量代码变更。
缺点
- 存在单点故障风险,一旦服务器宕机或网络中断,团队成员将无法正常工作。
- 团队成员必须联网才能获取最新的代码版本,限制了离线开发的可能性。
常见工具
- SVN(Subversion)
- CVS(Concurrent Versions System)
3.2分布式版本控制工具
分布式版本控制工具则打破了集中式管理的模式,每个团队成员都会在自己的本地机器上保存一个完整的项目版本库。这种模式下,团队成员可以在本地进行独立的开发、版本控制和提交操作,然后再通过某种方式将修改推送到远程服务器或其他团队成员的本地仓库中。
主要特点
- 去中心化:没有单一的中央服务器,每个团队成员的本地机器都是一个完整的版本库。
- 离线开发:团队成员可以在没有网络连接的情况下进行开发和版本控制。
- 分支管理灵活:支持更加灵活和快速的分支创建、合并和删除操作。
优点
- 提高了开发的灵活性和可靠性,即使远程服务器出现故障,团队成员仍然可以在本地继续工作。
- 降低了对服务器稳定性和网络连接的依赖。
- 分支管理更加灵活和高效,支持并行开发和独立测试。
缺点
- 同步操作可能较为复杂,需要更多的时间和精力来确保不同团队成员之间的代码一致性。
- 本地管理责任重大,团队成员需要谨慎管理本地代码库以避免数据丢失或混乱。
常见工具
- Git
- Mercurial
- Bazaar
4.Git工作机制
工作区:写代码,工作区是开发者进行日常编码工作的区域,它包含了项目的所有文件和目录。开发者在这里创建、修改和删除文件,这些更改最初只存在于工作区中,并不会立即被Git跟踪或记录。
暂存区:临时保存,暂存区是Git中的一个中间区域,用于暂存即将被提交的更改。
本地仓库:版本控制,本地仓库是Git在本地存储项目版本历史的地方。
- 工作区与暂存区的交互
- 开发者在工作区中对文件进行修改后,使用
git add
命令将修改后的文件添加到暂存区。这个过程是将工作区的更改“暂存”起来,准备进行提交。 - 如果需要撤销工作区的更改(即放弃修改),可以使用
git restore
命令(Git 2.23及以上版本)或git checkout -- <file>
命令(旧版本Git)。
- 开发者在工作区中对文件进行修改后,使用
- 暂存区与本地仓库的交互
- 当暂存区中的更改准备就绪后,开发者使用
git commit
命令将暂存区的更改提交到本地仓库。这个过程会创建一个新的提交记录,包含暂存区中的所有更改。 - 如果需要撤销暂存区的更改(即取消暂存),可以使用
git restore --staged <file>
命令(Git 2.23及以上版本)或git reset HEAD <file>
命令(旧版本Git)。
- 当暂存区中的更改准备就绪后,开发者使用
- 工作区与本地仓库的直接交互
- 虽然Git鼓励通过暂存区进行提交,但有时开发者可能希望直接将工作区的更改提交到本地仓库(跳过暂存区)。这可以通过
git commit -a
命令实现,但请注意,这个命令只会提交已经被Git跟踪的文件(即之前已经提交过的文件)的更改。
- 虽然Git鼓励通过暂存区进行提交,但有时开发者可能希望直接将工作区的更改提交到本地仓库(跳过暂存区)。这可以通过
5.代码托管中心
代码托管中心,通常也被称为远程代码仓库或云端代码仓库,是基于网络服务器的远程代码存储和管理平台。这些平台允许开发者将代码上传到中心化的服务器上,以便进行版本控制、团队协作、代码备份和共享等操作。
- GitHub:全球最大的代码托管平台,拥有庞大的开发者社区和丰富的开源项目资源。它提供免费的公共仓库托管服务,并对私人仓库收取费用。
- Gitee(码云):国内最大的代码托管平台,提供高速稳定的代码托管服务。它支持Git和SVN两种版本控制系统,并提供了丰富的代码仓库模板和社区支持。
- GitLab:一个开源的代码托管平台,支持企业内部部署和云端托管。它提供了丰富的CI/CD(持续集成/持续部署)工具和功能,适合大型企业使用。
二、Git安装
官网:https://git-scm.com/
三、Git基础命令
1.设置用户签名
全局设置:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱地址"
仓库级别设置,在仓库的目录下执行:
git config user.name "你的名字"
git config user.email "你的邮箱地址"
验证设置
git config user.name
git config user.email
git config --global user.name
git config --global user.email
2.查看配置信息
查看全局配置:
git config --global --list
查看当前仓库配置(如果没有特别指定全局或局部,默认是当前仓库):
git config --list
查看某项配置
git config 配置项名称
3.初始化本地仓库
git init
会创建一个隐藏的文件夹.git
4.查看本地仓库状态
git status
这个命令会输出当前仓库的状态,包括:
- 分支信息:显示你当前所在的分支。
- 未跟踪的文件:列出所有Git尚未开始跟踪的文件(即不在
.gitignore
中且未通过git add
添加到暂存区的文件)。 - 已修改但尚未暂存的文件:列出在工作目录中已修改但尚未使用
git add
命令添加到暂存区的文件。 - 已暂存但尚未提交的文件:列出已添加到暂存区但尚未使用
git commit
命令提交到本地仓库的文件。
5.添加暂存区
添加单个文件到暂存区
git add filename.txt
添加多个文件到暂存区
git add file1.txt file2.txt file3.txt
添加当前目录下所有更改到暂存区
git add .
添加特定类型的文件到暂存区
git add *.txt
6.移出暂存区
git rm --cached 文件名
该命令会从暂存区中移除指定的文件。
git rm --cached
命令本身不会立即从本地仓库中删除文件的历史记录,但如果你之后提交了这次更改(即执行了 git commit
),那么这些文件将从未来的提交历史中移除。
git rm --cached
命令本身对远程仓库没有直接影响。远程仓库是存储在服务器上的 Git 仓库,它包含了你推送到那里的所有更改。如果你在执行 git rm --cached
后提交了更改,并且将这些更改推送到了远程仓库(即执行了 git push
),那么远程仓库中的这些文件也将从未来的提交历史中移除(与本地仓库类似)。但是,它们仍然会保留在远程仓库之前的提交历史中,除非你同样在远程仓库上执行了修改历史记录的操作。
7.提交到本地仓库
git commit -m "提交信息"
8.查看历史版本
查看版本信息
git reflog
查看详细版本信息
git log
9.版本穿梭
git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>] [--] <paths>...
--soft
、--mixed
、--hard
、--merge
、--keep
是模式选项,用于指定重置操作的行为。-q
或--quiet
使得命令在执行时不输出任何信息。<commit>
指定了要重置到的提交。如果不指定,则默认为HEAD
,即当前分支的最新提交。<paths>
… 是可选的,允许你指定要重置的特定文件或目录。如果不指定,则影响整个仓库。
模式选项详解:
--soft
- 重置 HEAD 到指定提交,但保留暂存区和工作目录不变。
- 这意味着所有自指定提交以来的更改都被视为“已暂存”的更改,等待下一次提交。
- 常用于重新组织提交历史,而不丢失当前更改。
--mixed
(默认)- 重置 HEAD 和暂存区到指定提交,但保留工作目录中的更改。
- 这等同于执行
git reset <commit>
(不带任何模式选项)。 - 所有更改现在被视为“未暂存”的更改。
--hard
- 重置 HEAD、暂存区和工作目录到指定提交。
- 这会丢弃自指定提交以来在工作目录和暂存区中所做的所有更改。
- 警告:这是一个危险的操作,因为它会丢失未提交的更改。
--merge
- 在重置 HEAD 时,尝试合并重置后的状态与当前的工作目录和暂存区。
- 这主要用于解决可能出现的合并冲突,但通常不如
--mixed
或--hard
常用。
--keep
- 在重置 HEAD 时,保留所有未合并的更改(即在工作目录和暂存区中的更改)。
- 这主要用于解决可能出现的合并冲突,并尝试保留所有更改。
重置为某个特定提交 如果你知道要重置到的提交的哈希值或可以通过其他方式引用它(如分支名、标签等),你可以这样做:
git reset --hard <commit-hash>
四、分支操作
1.分支概念
在Git中,分支是一个非常重要的概念,它允许开发者在主分支之外进行独立的开发任务,而不会影响到主分支的稳定性和进度。
2.查看分支
git branch
git branch -v
3.创建分支
git branch 分支名
4.切换分支
git checkout 分支名
5.分支合并
git merge 要合并到当前分支的分支名
6.合并冲突
修改了同一文件的同一位置,就会产生冲突
git merge 要合并到当前分支的分支名
产生冲突,查看文件状态,出现both modified
git status
使用编辑器打开冲突文件
<<<<<<< HEAD
内容 主分支修改
=======
内容 其他分支修改
>>>>>>> 其他分支
手动修改合并,将冲突标识删了
内容 主分支修改
内容 其他分支修改
添加暂存区
git add 文件名
提交本地仓库
git commit -m '提交信息'
五、团队协作
1.团队内协作
2.跨团队协作
六、远程仓库
1.查看远程仓库
git remote -v
2.添加远程仓库
git remote add [shortname] [远程仓库的URL]
其中[shortname]
是你为远程仓库设置的简短名称(如origin
)
3.推送更改到远程仓库
git push [远程仓库名] [分支名]
4.从远程仓库拉取更改
git pull [远程仓库名] [分支名]
5.克隆远程仓库
git clone [远程仓库的URL]
6.推送并跟踪新的远程分支
当你想要推送一个新的本地分支到远程仓库,并让Git跟踪这个远程分支时,你可以使用带有-u
(或--set-upstream
)选项的git push
命令。
git push -u [远程仓库名] [分支名]
7.跨团队协作
- Fork项目
- 操作:团队成员(或外部贡献者)在GitHub上找到想要协作的项目,点击“Fork”按钮,将项目复制一份到自己的GitHub账户下。
- 目的:创建项目的独立副本,以便在不干扰原始项目的情况下进行自由修改和实验。
- Clone项目到本地
- 操作:团队成员使用Git命令(如
git clone
)将Fork后的项目克隆到本地计算机上。 - 目的:在本地进行开发,利用Git的本地版本控制功能进行代码修改和版本管理。
- 本地开发
- 操作:团队成员在本地仓库中自由地进行代码修改、添加新功能或修复bug。
- 注意:遵循项目的编码规范、代码风格和工作流程,确保代码质量和可维护性。
- 提交更改到远程仓库
- 操作:使用Git命令(如
git add
、git commit
和git push
)将本地修改提交到自己的远程仓库中。 - 目的:将修改保存起来,并准备向原始项目提交合并请求(Pull Request)。
- 发起Pull Request
- 操作:在GitHub上,团队成员点击“New pull request”按钮,选择要将更改合并到的分支(通常是原始项目的master或main分支),并填写Pull Request的描述信息。
- 目的:向原始项目的维护者或其他团队成员展示所做的修改,并请求将这些修改合并到原始项目中。
- 审核与合并
- 操作:原始项目的团队成员会收到Pull Request的通知,并可以查看、讨论和审核这些更改。如果更改被接受,他们可以将这些更改合并到原始项目中。
- 目的:确保合并到原始项目的更改符合项目的需求和标准,同时促进团队成员之间的交流和协作。