【01】基本使用
提示
下面所有内容将仅介绍命令行下的使用,Git 在 GUI 中的使用不做介绍
1. 仓库管理
1.1 克隆仓库
克隆仓库,包含所有的git
信息
git clone https://xxx.xxx.xx # HTTP
git clone ssh://git@xxx.xxx.xx # SSH
git clone xxx --depth=1 # clone 操作的深度为 1,即只 clone 最新的代码
git clone xxx --recursive # 递归方式整个项目(包含子模块)
有关子模块的内容参见 1.4 节
1.2 初始化仓库
git init
1.3 信息配置
1.3.1 配置远程端
新建远程端
# 下文均以 SSH 地址为例
git remote add origin ssh://git@xxx.xxx.xx
这里的 origin
可以换成其他的单词,例如我们的代码同时放在 GitHub 和 Gitea 中,我们则可以新建两个远程端,例如 origin_gitea
和 origin_github
。
移除远程端
# 移除名为 origin 的远程端信息
git remote remove origin
获取/设置 URL 地址
# 设置远程 URL 地址
git remote set-url origin ssh://git@xxx.xxx.xx
# 获取远程 URL 地址
git remote get-url origin
1.3.2 配置用户
# 配置邮箱
git config --global user.email "your email@example.com"
# 获取邮箱
git config user.email
# 配置用户名
git config --global user.name "your name"
# 获取用户名
git config user.name
注意
这个命令中 --global
选项表示全局配置,即将这个邮箱地址设置为默认邮箱地址,供所有的 Git 仓库使用。如果省略了 --global
选项,则表示设置该仓库使用的邮箱地址,只对当前的 Git 仓库生效。
1.4 子模块
添加子模块
git submodule add ssh://git@xxx path # 添加子模块至 path 文件夹下
初始化子模块
cd sub_path # 需要跳转至待设置为子模块的目录下 git submodule init # 初始化,跟 git init 类似
拉取所有子模块
git submodule foreach git pull
2. 基础操作
2.1 添加至暂存区
git add .
用于将工作目录中的所有变更(包括新增、修改和删除等)添加到 Git 索引中,以便在下一次提交时将这些变更纳入版本控制系统中。通常情况下,该命令会将所有变更的文件都添加到暂存区中,但需要注意的是,如果文件已经被添加到 Git 管理中,但现在处于被忽略状态,那么该命令将不会添加这些被忽略的文件。
例如,执行以下命令即可将所有变更的文件添加到 Git 暂存区中:
git add .
或者使用以下命令将指定目录下的所有变更文件添加到 Git 索引中:
git add path/to/directory
执行git add
命令后,可以使用git status
命令查看各个文件的状态,以确认是否将所有需要的文件都添加到了暂存区中。
2.2 提交
git commit
是 Git 中的一个基本命令,用于将工作目录中被添加到暂存区的变更提交到本地 Git 仓库中,以便将这些变更固化为一次提交历史记录。
在执行 git commit
命令时,一般需要提供一个提交消息,以描述这次提交所做的更改内容。提交消息应该简明扼要、清晰明了,能够准确地传达出这次提交所做的实质性更改,帮助日后的代码审查、维护和合并等工作。
例如,执行以下命令即可进行一次提交:
git commit -m "xxxxx"
2.3 推送
git push
命令用于将本地 Git 仓库中的提交推送到远程仓库中,以便将这些提交共享给其他开发者。
例如,如果要将 master
分支中的最新提交推送到名为 origin
的远程 Git 仓库中,则可以使用以下命令:
git push origin master
在推送前,需要注意以下几点:
如果远程分支不存在,则会自动创建一个同名的分支。
如果远程分支已经存在,且当前的本地分支存在于该远程分支中,则可以直接将本地分支的修改推送到远程分支中。
如果远程分支已经存在,但当前本地分支不在其中,则需要使用
--set-upstream
或-u
选项来建立本地分支和远程分支之间的链接关系,例如:git push -u origin new-feature
执行此命令后,Git 将会自动建立
new-feature
分支与origin/new-feature
分支之间的追踪关系,下次执行git push
时只需要指定分支名称即可。除了目标分支名称之外,
git push
命令还可以带有一个可选参数:--force
(或-f
),用于强制推送。当本地仓库与远程仓库存在冲突时,Git 通常会拒绝推送,以防止数据丢失。但在某些情况下,比如你已经确定自己的更新是正确的,可以使用--force
选项强制推送,覆盖远程仓库中原有的数据。。
2.4 更新与同步
2.4.1 pull
git pull
命令用于从远程 Git 仓库中拉取最新的变更,并将变更应用到本地 Git 仓库中。
在执行 git pull
命令时,Git 会自动找到当前本地分支所对应的远程分支,并尝试将其更新至最新状态,如果远程分支中存在不在本地分支中的新提交,Git 将会自动将这些提交下载至本地 Git 仓库中,以便让本地仓库与远程仓库保持同步。
例如,如果要从名为origin
的远程 Git 仓库中拉取最新的master
分支,则可以使用以下命令:
git pull origin master
注意
在拉取最新变更之前,需要注意以下几点:
- 如果本地分支与远程分支存在冲突,则可能需要先解决冲突才能够拉取最新变更。
- 如果您希望跟踪任意一个分支来拉取最新的提交,请在拉取命令中指定
-u
或--set-upstream-to
选项,例如:git branch --set-upstream-to=origin/master
该命令将会将名为master
的本地分支和名为origin/master
的远程分支建立联系,以便在执行git pull
命令时可以自动选择相应的远程分支进行拉取。
总之,git pull
命令是保持本地 Git 仓库与远程 Git 仓库同步、获取最新变更的重要手段之一,可以帮助开发者快速、方便的更新代码。
2.4.2 fetch
git fetch
命令用于从远程 Git 仓库中拉取最新的变更,但不会自动将这些变更应用到当前分支上。相比于 git pull
命令,git fetch
命令更加安全,。
# 指定要获取的远程分支名称 upstream/master
git fetch upstream master
# 指定要获取的远程端 origin
git fetch origin
# 全部获取
git fetch
第一个命令将会从名为upstream
的远程 Git 仓库中拉取最新的master
分支,并在本地仓库中创建一个指向该分支的“引用”。
git fetch
命令的优点在于,它可以让开发者快速了解远程仓库的最新变更,而且不会自动修改本地分支的状态,这意味着开发者可以使用git diff
或git merge
命令在本地查看、比较和处理所拉取的变更,以便更好地控制代码的更新过程。
当完成了针对远程分支的变更处理后,可以使用git merge
命令或者git rebase
命令将本地分支与远程分支合并,以便将所拉取的变更应用到当前分支中。
3. 分支管理
3.1 创建、签出分支
# 创建一个名为 dev 的分支
git branch dev
# 签出分支(从当前分支转移到 dev 分支)
git checkout dev
# 创建并签出(一步到位)
git checkout -b dev
3.2 合并
对于如下示例,当前有两个独立开发的分支,分别是dev
和master
。
现计划将master
分支的数据合并至dev
中,使用以下命令
git checkout dev # 切换到 dev 分支下
git merge master # 将 master 的数据合并至 dev 下
合并结果如下
3.3 删除
git branch -d dev # 删除名为 dev 的分支
有时删除失败会提示dev
是未完全合并的分支,例如计划将图3.1中的dev
分支删除,那么则会显示此删除失败的提示,若执意要删除则需要使用以下命令
git branch -D dev # 强制删除名为 dev 的分支
3.4 回退
对于以下提交记录
使用reset
可实现节点的回退,假设 "123" 提交记录对应的 SHA1 哈希值是71d3c8667
3.4.1 软回退
git reset --soft 71d3c8667 # 软回退,回退的内容以未跟踪变更的形式存在
软回退对应的节点图如下
3.4.2 硬回退
git reset --hard 71d3c8667 # 硬回退,回退的内容将直接消失,因此这种操作比较危险
硬回退对应的节点图如下
注意
- 以上均为在不存在远程分支的情况下执行
reset
回退后的效果,若存在远程分支,执行硬回退后仍然可以通过git pull origin xxx
或者git rebase origin/xxx
来实现更新。 - 凡事具有两面性,不要因为操作危险就因噎废食而不去使用,存在即合理,正确的使用回退功能以及前文的强制推送功能可以在解决某些问题时提升效率。
3.5.1 何为基?
基(Base)即基准点,是可以自由指定的某一次提交,对于图3.1所表示的分支结构,dev
分支和 master
分支在第一次提交后即发生分离,所谓变基 rebase
就是将发生分离的待变基分支整合到指定的基上。例如,在图3.1中我们希望将 dev
分支的内容变基至最新的 master
上,就意味着将第一次提交后 dev
分支相较于 master
分支产生的偏离所包含的所有提交记录整合至最新的 master
上,即希望实现图3.3的效果。
3.5.2 具体操作
git checkout dev # 切换至 dev 分支
git rebase master # 将当前分支 (dev) 变基至 master 分支
对于 git rebase
操作,如果想让基不是一个具体的分支,而是某一个指定的提交,也可使用该提交对应的 SHA1
哈希值来代替分支名,例如
git rebase e26fadb33c
命令如下
git rebase -i xxx # xxx 可以是指定的分支、标签或者节点 SHA1 哈希值
使用交互式变基,可以实现以下功能
- 重命名提交信息
- 编辑某次提交的变更内容
- 压缩多次提交为一个提交
- 删除指定的提交
- ……
其中变基为基本用法,原理与普通的 git rebase
完全一致,但在 git rebase
的基础上增加了前 4 点内容。每一点的具体使用不多赘述,在键入交互式变基命令后,会自动弹出相关编辑器,并弹出对应功能的使用方法。对于以下提交记录
输入以下命令
git rebase -i 54d92ee7
则会弹出以下编辑器信息,可根据提示信息完成对应操作。
3.6 标签
这里只介绍最常使用的,使用以下命令可以对某一次提交打上标签。
git tag -a 1.0.0 -m "版本 1.0.0 已发布"
其中 1.0.0
是标签名,用 -a
来指定,-m
与提交的 -m
意义相同,这里表示标签对应的信息。
若需要将标签推送至远程端,其操作方法与分支的推送完全一致,可参考以下命令。
git push origin 1.0.0
如果想在推送分支 master
的时候一并将所有标签推送至远程端,可简化为以下命令。
git push origin master --tags