Git
Git 是一个分布式版本控制系统,被广泛用于软件开发中的源代码管理。它能够追踪文件的变化、记录修改历史,并支持多人协作开发。
一、配置
1、用户信息
安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改:
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
TIP
再次强调,如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。
2、文本编辑器
既然用户信息已经设置完毕,你可以配置默认文本编辑器了,当 Git 需要你输入信息时会调用它。 如果未配置,Git 会使用操作系统默认的文本编辑器。 如果你想使用不同的文本编辑器,例如 vscode,可以这样做:
git config --global core.editor code
3、检查配置信息
git config --list
4、查看版本信息
git --version
二、获取 Git 仓库
通常有两种获取 Git 项目仓库的方式:
- 将尚未进行版本控制的本地目录转换为 Git 仓库;
- 从其它服务器 克隆 一个已存在的 Git 仓库。
两种方式都会在你的本地机器上得到一个工作就绪的 Git 仓库。
1、在已存在目录中初始化仓库
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。
git init
2、克隆远程仓库
如果你想获得一份已经存在了的 Git 仓库的拷贝,比如说,你想为某个开源项目贡献自己的一份力,这时就要用到 git clone 命令。
git clone <repository_url>
# 克隆并重命名本地仓库
git clone <repository_url> <local_name>
三、记录每次更新到仓库
1、检查当前文件状态
git status
# 状态简览
git status -s
2、跟踪新文件
git add <filename>
#添加当前目录下的所有文件到暂存区
git add *
2、提交更新
# -m 选项,将提交信息与命令放在同一行
git commit -m 提交信息
# -a 选项,自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
git commit -a -m 提交信息
3、重置暂存区的文件
git restore <filename>
4、删除文件
git rm <filename>
# 强制删除
git rm <filename> -f
# 把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。
$ git rm --cached <filename>
5、移动或重命名工作区文件
git mv <filename> <new_filename>
6、查看提交历史
git log
# 查看历史记录的简洁版
git log --oneline
四、分支管理
1、查看分支
git branch
2、创建分支
git branch <branch_name>
3、删除分支
git branch -d <branch_name>
4、切换分支
git switch <branch_name>
#创建并切换分支
git switch -c <new_branch>
#创建并切换分支到指定提交id
git switch -c <new_branch> <commit_id>
#创建并切换分支到指定标签
git switch -c <new_branch> <tag_name>
5、合并分支
# 只能合并未选中的分支,合并冲突时需要手动处理
git merge <branch_name>
6、变基
git rebase <branch_name>
五、远程仓库
1、添加远程仓库
git remote add <remote_name> <repository_url>
2、推送到远程仓库
git push -u <remote_name> <branch_name>
3、从远程仓库中抓取与拉取
# 从远程代码库获取最新变更,并自动将其合并到当前分支
git pull <remote_name> <branch_name>
# 从远程代码库获取最新变更,但不立即将其合并到当前分支;若想合并到当前分支,则使用git merge
git fetch <remote_name>
4、查看远程仓库
git remote
# -v 选项,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
git remote -v
5、远程仓库的重命名与移除
# 重命名
git remote rename <remote_name> <new_name>
# 删除
git remote remove <remote_name>
git remote rm <remote_name>
5、远程仓库的分支移除
git push --delete <remote_name> <branch_name>
git push -d <remote_name> <branch_name>
六、标签
1、创建标签
#基于最新提交创建一个轻量级标签。
git tag <tag_name>
#创建一个带有注释信息(message)的附注标签。
git tag -a <tag_name> -m "message"
#基于特定提交(commit_id)创建标签,git log命令查看commit_id
git tag <tag_name> <commit_id>
2、删除标签
git tag -d <tag_name>
3、查看标签
git tag
# 查看指定的tag
git tag -l <tag_name>
# 查看标签信息
git show <tag_name>
4、推送标签到远程仓库
git push <remote_name> <tag_name>
5、删除远程仓库标签
git push <remote_name> --delete <tag_name>
七、忽略文件
通过在项目根目录下创建一个名为 .gitignore 的文件,并在其中列出要忽略的文件和目录的规则,可以告诉 Git 哪些文件不应被纳入版本控制。
file.txt # 忽略名为 file.txt 的文件
directory/ # 忽略名为 directory 的目录
*.txt # 忽略所有扩展名为 .txt 的文件
build/ # 忽略名为 build 的目录及其内容
!important.txt # 例外:不忽略名为 important.txt 的文件
/logs/ # 忽略根目录下的 logs 目录及其内容
八、Submodule(子模块)
当涉及到 Git 中的 Submodule(子模块),它是一种让一个 Git 项目嵌套包含另一个 Git 仓库的机制。Submodule 允许在一个项目中引用另一个项目,以便将其作为依赖项或子组件包含在主项目中。这对于管理项目之间的依赖关系和复用代码非常有用。
当你在主项目中添加一个 Submodule 时,它实际上是在主项目中嵌套了一个子仓库,并在主项目中记录了子仓库的位置和提交(commit)信息。在主项目提交时,它并不会将子仓库的内容包含在主项目中,而是将子仓库的引用(commit SHA-1)作为一个文件记录在主项目中。这个文件指明了子模块所在的仓库和所引用的具体提交。
Submodule 具有以下特点:
- 独立管理:子模块是一个独立的 Git 仓库,有自己的版本控制和提交历史
- 版本锁定:主项目中记录的子模块引用是一个特定的提交,这样可以确保子模块的版本与主项目兼容,避免出现不稳定或不兼容的情况
- 独立更新:你可以在主项目中单独更新子模块,这样可以获取子模块的最新代码
- 依赖管理:Submodule 允许将其他项目作为依赖项嵌套在主项目中,这样可以更好地管理项目之间的依赖关系
添加子模块
在主项目(如:src 文件夹)中添加子模块。
git submodule add <URL> #<URL> 是子模块的远程仓库地址
初始化子模块
在首次克隆包含子模块的主项目后,需要初始化子模块。
git submodule update --init --recursive
更新子模块
获取子模块的最新代码。
git submodule update --remote
提交子模块更改
如果在子模块中进行了更改,你需要先在子模块内提交更改,然后回到主项目,提交子模块引用的更新。
cd <path-to-submodule>
git add .
git commit -m "Update submodule"
git push origin main
cd ..
git add <path-to-submodule>
git commit -m "Update submodule reference"
git push origin main