初始化设置

配置用户名

git config --global user.name "Your Name"

配置邮箱

git config --global user.email "mail@example.com"

存储配置

git config --global credential store

新建仓库

创建⼀个新的本地仓库(省略project-name 则在当前目录创建)

git init <project-name>

克隆⼀个远程仓库

git clone <url>

工作区域

工作区(Working Directory)

就是你在电脑⾥能实际看到的⽬录

暂存区(Stage/Index)

暂存区也叫索引,⽤来临时存放未提交的内容,⼀般在.git ⽬录下的index 中。

本地仓库(Repository)

Git 在本地的版本库, 仓库信息存储在.git 这个隐藏⽬录中。

远程仓库(Remote Repository)

托管在远程服务器上的仓库。 常⽤的有GitHub, GitLab, Gitee。

文件状态

已修改(Modified)

修改了但是没有保存到暂存区的⽂件

已暂存(Staged)

修改后已经保存到暂存区的⽂件

已提交(Committed)

把暂存区的⽂件提交到本地仓库后的状态

文件名称

main/master 默认主分支
Origin 默认远程仓库
HEAD 指向当前分支的指针
HEADA 上一个版本
HEAD~ 上四个版本

添加和提交文件

git add <file

添加⼀个⽂件到暂存区,⽐如git add . 就表示添加所有⽂件到暂存区。

git commit -m "message"

提交所有暂存区的⽂件到本地仓库

git commit -am "message"

提交所有已修改的⽂件到本地仓库

删除 撤销 恢复

git mv <file><new-file>

移动一个文件到新的位置。

git rm <file>

从工作区和暂存区删除一个文件,并且将这次删除放入暂存区。

git rm --cached <file>

从索引/暂存区中删除文件,但是本地工作区文件还在,只是不希望这个文件被版本控制。

git checkout <file> <commit-id>

恢复一个文件到之前的版本。

git revert <commit-id>

创建一个新的提交,用来撤销指定的提交,后者的所有变化将被前者抵消,并且应用到当前分支。

git reset --mixed <commit-id>

重置当前分支的HEAD为之前的某个提交,并且删除所有之后的提交。

hard参数表示重置工作区和暂存区,
soft参数表示重置暂存区,
mixed参数表示重置工作区。
git restore --staged <file>

撤销暂存区的文件,重新放回工作区(git add的反向操作)。

git diff查看差异

git status [-s]

查看仓库状态,列出还未提交的新的或修改的文件。$-s$是查看简略模式

git log --oneline

查看提交历史,--oneline表示简介模式。

git diff

查看未暂存的文件更新了哪些部分。

git diff <commit-id> <commit-id>

查看两个提交之间的差异。

git diff HEAD

比较工作区与暂存区之间的关系

git diff cached

比较暂存区和版本库之间的关系

git diff HEAD~ HEAD

比较当前版本和上个版本

git diff HEAD~x HEAD fil1

可以用来比较前x个版本和现版本的区别,后面添加文件名只会查看该文件的区别

.gitignore忽略文件

需要在git过程中忽略掉一些文件

.git Git仓库的元数据和对象数据库
.gitignore 忽略文件,不需要提交到仓库的文件
.gitattributes 指向当前分支的指针
.gitkeep 使空目录被提交到仓库
.gitmodules 记录子模块的信息
.gitconfig 记录仓库的配置信息
.gitignore
*.log //忽略某种文件
temp/  //忽略文件夹,后面是以/结尾的

就起到了忽略所有log结尾的文件,如果已经被提交到了版本库中忽略是没有作用的,需要从暂存区删除,需要仅仅将远程库中删除则使用git rm xxx --cached

如果一个文件夹下无文件不会被添加至仓库

gitignore文件的匹配规则

  • 空行或者以#开头的行会被Gt忽略。一般空行用于可读性的分隔,#一般用作注释
  • 使用标准的Blob模式匹配,例如:

    星号*通配任意个字符
    问号?匹配单个字符
    中括号[]表示匹配列表中的单个字符,比如:[abc]表示a/b/c

  • 两个星号**表示匹配任意的中间目录
  • 中括号可以使用短中线连接,比如:

    [0-9]表示任意一位数字,[a-z]表示任意一位小写字母

  • 感叹号!表示取反
#忽略所有的.a文件
*.a
#但跟踪所有的lib.a,即便你在前面忽略了.a文件
!lib.a
#只忽略当前目录下的TODO文件,而不忽略subdir/T0D0
/TODO
#忽略任何目录下名为build的文件夹
build/
#忽略doc/notes.txt,但不忽略doc/server/arch.txt
doc/*.txt
#忽略doc/目录及其所有子目录下的.pdf文件
doc/**/*.pdf

常用忽略模板

SSH配置

  1. 命令行输入ssh-keygen,一路回车,如果要重新生成别的密钥,请注意修改,并且在某些指定程序修改识别密钥

    如果更换了名称,则需要在.ssh文件夹创建config文件,当我们使用github过程中就会验证test这个密钥

    # github
    Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/test
  2. 右上角头像的setting
  3. 页面左侧SSH and GPG keys
  4. 页面中间New SSH key
  5. xxx.pub输入到ssh对话框

同步到远程仓库

git push

拉取到本地仓库

git pull <remote>

克隆仓库

git clone repo-address

关联远程仓库和本地仓库

添加远程仓库

#Step 1
git remote add <远程仓库别名> <远程仓库地址>
#Step 2
git push -U <远程仓库名> <分支名>

在github创建一个仓库

点上方的ssh并将代码复制到本地的终端运行

git remote add origin git@github.com:geekhall-laoyang/first-repo.git
git branch -M main //指定分支名称
git push -u origin main:main //本地main分支与远程main分支关联,前面的是本地,后面的是远程

查看远程仓库

git remote -v

拉取远程仓库

git pull <远程仓库名><远程分支名>:<本地分支名>

相同可以省略冒号后面的

分支操作

  • 查看分支列表:
git branch
  • 创建分支:
git branch branch-name
  • 切换分支:

    • git checkout branch-name
    • git switch branch-name
    • 较为推荐第二种
  • 合并分支
git merge branch-name
  • 删除分支:

    • [已合并]
    • git branch -d branch-name
    • [未合并]
    • git branch -D branch-name

合并

合并步骤

在提交命令加上-a参数即可同时完成暂存和提交两个操作
  1. 切换到要被合并的分支
  2. 输入git merge xxx,xxx为要合并进来的分支
  3. 使用git status查看冲突文件
  4. 使用git diff查看冲突内容
  5. 手动编辑冲突文件后再次提交

    解决合并冲突

  • 两个分支未修改同一个文件的同一处位置:Gt自动合并
  • 两个分支修改了同一个文件的同一处位置:产生冲突

    • 解决方法:

      • Step1-手工修改冲突文件,合并冲突内容
      • Step2-添加暂存区$ git add file
      • Step3-提交修改$ git commit -m "message"
    • 中止合并:当不想继续执行合并操作时可以使用下面的命令来中止合并过程:$ git merge --abort

rebase

git rebase dev

例如这个指令就会将dev合并到当前分支,rebase的作用就是把命令中的分支合并到当前位于的分支

请输入图片描述

  • 如果当前在main分支,执行git rebase dev
    请输入图片描述
  • 如果当前在dev分支,执行git rebase main

请输入图片描述

分支管理和工作流模型

请输入图片描述

版本号规则

  • 主版本(Major Version):主要的功能变化或重大更新;
  • 次版本(Minor Version):一些新的功能、改进和更新,通常不会影响现有功能;
  • 修订版本(Patch Version):一些小的bug修复,安全漏洞补丁等。通常不会更改现有功能和接口。

分支命名

推荐使用带有意义的描述性名称来命名分支

  • 版本发布分支/Tag示例:v1.0.0
  • 功能分支示例:feature-login-page
  • 修复分支示例:hotfix-#fissueid-desc

分支管理

  • 定期合并已经成功验证的分支,及时删除已经合并的分支
  • 保持合适的分支数量
  • 为分支设置合适的管理权限
最后修改:2023 年 11 月 25 日
如果觉得我的文章对你有用,请随意赞赏