Git基本用法

介绍

本文章主要记录Git基本知识,内容包括:

  1. Git的基本配置
  2. 暂存和提交
  3. 分支和合并
  4. rebase用法
  5. 远程库的操作
  6. 子模块的用法

Git的基础用法

Git的基础配置

创建一个本地Git版本库,可以使用以下命令:

1
2
git init 让当前文件夹变成 git 仓库(创建 .git 文件夹)
git init folder 创建一个名为"folder"新的文件夹并初始化为 git 仓库

进行Git账号配置,若添加global的话则是本地创建的所有版本库都会遵循这个配置,若想单独配置则需要在项目文件夹里输入同时不加--global

1
2
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"

可以用以下命令查看配置:

1
git config --list

Git的暂存

首先对文件夹内进行修改,比如在文件夹中加入file.txt文件,并且里面写入一些内容,随后可以使用以下命令加入到暂存区:

1
2
3
git add file.txt
或者
git add .

需要查看暂存库的内容则输入:

1
git status

其中的三种状态tracked,untracked,ignored,若新建文件了但是没有进行git add操作,则该文件为untracked,如下图所示。
untracked文件
如果需要进行删除的话:

  • 如果你想从本地和 Git 版本库中删除文件,使用 git rm -f文件,或者手动删除文件后用 git add 文件更新状态
  • 如果你已经将一个文件添加到暂存区,可以用 git rm --cached 文件将其移出暂存区。
  • 如果需要重命名或者更改路径,则可以输入:
    1
    git mv old_filename.txt new_directory/new_filename.txt
    其中old_filename.txt需要为tracked状态即在暂存区。

选择需要ignore的文件:
假设以经创建文件目录如图所示:
ignore演示
其中除了new文件夹之外的四个文件都没有进行add操作,创建.gitignore的命令如下:

1
vim .gitignore   创建一个.gitignore文件并且进入编辑

按下i,进入insert模式,输入*.c表示忽略.c结尾的文件,最后按下esc,输入:wq进行保存。
随后输入git status,得到如下所示。
ignore演示
随后可以输入命令进行查看是否被忽略以及忽略规则:

1
git check-ignore -v code1.c

常用的模板为github/gitignore

Git的提交

commit命令

Git的提交可以将暂存内容提交到本地仓库,形成一个新版本。将暂存的内容提交的命令为:

1
git commit -m "内容"

可以用log命令查看提交的日志:

1
2
3
4
5
git log
git log --oneline 用一行进行显示
git log --graph 显示分支
git log --stat 显示文件删改信息
git log -p 显示详细的修改内容

log演示
其中commit后面的数字为sha-1标识符,定位唯一的提交,可以通过以下命令显示信息(id不重复下可以写前几位):

1
git show id

其中checkout命令用于分支间的切换:

1
git checkout id

Angular规范

在合作项目中,commit message的书写规范十分重要,Angular规范里面大致包括更改的类型,范围,总结描述,详述,问题解决。

  • type:提交的类型,标识提交的目的。
  • scope:可选,提交的范围或模块,帮助指定影响的区域。
  • subject:简洁明了的提交说明,描述这次提交的内容。
  • body:可选,详细描述提交的内容和背景信息。
  • footer:可选,提及相关的问题追踪系统中的问题,例如关闭某个问题。

版本控制

可以通过git tag来创建轻量级标签,例如:

1
2
git tag v0.0.1
git tag -d tag_name 删除标签

随后就可以用git checkout v0.0.1切换到这一个分支,并且在log中也可以显示他的tag,其中图中我在添加了tag后又进行了一次提交,使用checkout即可切回上一个分支。
添加tag
想要添加一些说明,则可以采用附注标签:

1
git tag -a v0.0.2 -m "release v0.0.2"

标注后,采用git show v0.0.2显示如下,相比于直接创建tag,多了TaggerDate,以及附加的文字。
添加附注tag
其次,在版本号命名也需要遵守一般规范,一般为:
v主版本号.次版本号.修订号-预发布版本号

  • 修订号:兼容修改,纠正不正确的行为
  • 次版本号:添加新功能,保持兼容
  • 主版本号:不兼容的API修改且为0时表示还在开发阶段,不保证稳定性
  • 预发布版本号:alpha/beta/rc.1/rc.2/…

detached HEAD和分支

Detached HEAD 是 Git 中的一种状态,指的是当前的 HEAD(指向当前所在的分支的引用)不指向任何分支,而是指向一个具体的提交。这意味着你在这种状态下所做的任何更改和提交,都不会被记录在任何分支中,除非你明确地将它们保存到一个新的分支或现有分支中。
例如我退回版本v0.0.1,在这个情况下重新进行addcommit操作,这下HEAD不会指向任何分支,这个时候如果切回master分支,查看log,发现修改不会出现在log当中,所以这一次修改不能通过分支来切回去,只能通过提交时的id切回。
为了解决Detached HEAD问题,可以通过git checkout -b 分支名来创建并切换到一个新的分支上,此外还有命令:

1
2
3
4
5
6
7
git branch name 基于当前HEAD创建分支
git branch name id 基于id创建分支
git branch (带-a查看远程分支)
git show-branch 显示更加详细
git diff name 比较当前分支与name分支
git diff name1 name2 比较两个分支
git diff 比较工作区与暂存区

将别的分支合并到当前分支,可以使用:

1
git merge name1 name2

有新提交的情况下,合并后会生成一个新的提交。若合并有冲突则需要手动修改。

Git的进阶用法

修改提交历史

rebase 可以用在同一分支上,表现为修改提交历史,可以输入命令:

1
git rebase -i id

输入完会进入编辑页面,其中对各个节点前的状态更改可以进行不同的操作:

  • pick:保留该提交
  • edit:保留该提交,但会进入编辑状态
  • squash:将该提交和上一个提交合并
  • drop/ 删除整行:删除该提交
    保存退出后,根据提示输入git commit --amend,修改完成后输入git rebase --continue

远程版本库

通过命令将远程版本库克隆到本地:

1
git clone src dest

添加远程版本仓库:

1
git remote add <name> <url>

当你添加远程仓库后,使用 git remote -v可以确认远程仓库是否正确配置。
从远程仓库进行pull

1
git pull <远程仓库名> <分支名>

例如:git pull origin main 会从 origin 远程仓库的 main 分支拉取最新的更改,并将这些更改合并到你本地的当前分支。
对远程仓库进行push:

1
git push <远程仓库名> <分支名>

例如:git push origin main会将你本地的 main 分支的更改推送到 origin 远程仓库的 main 分支。
在克隆自己拥有的仓库时,你有权限推送到 origin,在协作或开源项目中,可能需要 fork 并推送到你自己拥有的 fork 仓库。

submodule子模块

在一些项目中,你可能会依赖于其他项目的代码库,这些代码库可能由不同的团队或开发者维护。为了保持这些依赖的独立性和版本控制,你可以使用git submodule将这些外部代码库嵌入到你的主项目中。比如原本的git版本库中里面也存在着另一个版本库,在内部的版本库中进行完add .commit操作后,切到大版本库目录进行add .操作会产生问题,此时需要先进行子模块的添加:

1
git submodule add url path

例如:git submodule add https://github.com/example/lib.git external/lib 这会将 lib仓库作为子模块添加到 external/lib 目录中。

封面

封面