前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Git 知识总结

Git 知识总结

原创
作者头像
willsonchen
发布2024-01-22 14:38:27
1580
发布2024-01-22 14:38:27

  What:开源的分布式版本管理系统。   Why:相较于 svn,有以下主要优势:

  • 完全分布式,不依赖于中央服务器,支持离线开发。
  • 本地存储了一个完整的代码库,且用元数据方式存储,体积小克隆速度快。
  • 处理分支更加简单,大部分情况可以自动合并,出现冲突时也更容易解决。
  • 命令行工具更加丰富,功能强大。

安装

代码语言:javascript
复制
git version #查看 git 版本
yum remove git #如有旧版本先卸载
#安装其他源
yum install -y http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm 
yum install -y git #安装新版本 git

git 信息流

image
image

  通过 git 信息流,可以了解 git 的主要流程及操作命令。   主要概念:

  • 工作区(workspace):当前工作目录。
  • 暂存区(index):保存临时改动文件。
  • 仓库(repository):本地仓库,存放提交的修改和历史变更。
  • 远程仓库(remote):远程仓库,在统一管理代码的服务器上。

git 命令

基本操作命令

代码语言:javascript
复制
#克隆远程仓库
git clone git@github.com:userid/reponame.git
#查看远程仓库
git remote -v
#查看所有分支
git branch -a
#切换分支
git checkout feature/v1.0
#添加所有变更文件到暂存区
git add .
#提交暂存区到仓库
git commit -m "commit message"
#拉取最新代码,自动合并到本地当前分支
git pull
#拉取最新代码,不合并
git fetch
#合并 master 分支到当前分支
git merge master
#推送代码到远程仓库
git push
#查看仓库状态
git status

配置命令

代码语言:javascript
复制
#列出当前配置
git config --list
#列出当前仓库配置
git config --local --list
#列出全局配置
git config --global --list
#配置用户名
git config --global user.name "your name"
#配置邮箱
git config --global user.email "your email"

初始化命令

  git init 用于初始化一个本地仓库,初始化完成后会生成一个 .git 隐藏目录,包含所有元数据。

代码语言:javascript
复制
#在当前目录初始化仓库
git init
#在test_dir目录下初始化仓库
git init test_dir

克隆命令

  git clone 用于克隆一个仓库,克隆完成后会生成一个与远程仓库同名的目录,包含所有元数据。 克隆时支持 ssh、git、https 协议。   使用 https 协议时需要账号密码登录。   使用 ssh 协议时可以使用公钥认证,方法是:使用 ssh-keygen在本地生成密钥对,然后在~/.ssh目录下将pub后缀的公钥复制到远程仓库配置中。

代码语言:javascript
复制
#使用ssh协议地址
git clone git@github.com:userid/reponame.git
#使用https协议地址
git clone https://github.com/userid/reponame.git
#使用git协议地址
git clone git://github.com/userid/reponame.git

提交命令

  git 相比 svn 增加了暂存区,文件变更在提交前需要先添加到暂存区。   另外,如果上一次提交未 push,则允许修改上一次提交。

代码语言:javascript
复制
#添加变更文件到暂存区
git add file1 file2
#添加所有变更文件到暂存区
git add .

#提交暂存区到仓库
git commit -m "commit message"
#自动添加所有变更文件到暂存区,然后提交到仓库
git commit -am "commit message"

#修改上次提交,修改提交信息
git commit --amend -m "commit message"
#自动添加所有变更文件到暂存区,然后提交到仓库,修改上次提交,修改提交信息
git commit --amend -am "commit message"

查看状态

  git status 用于查看当前仓库状态,包括变更文件、暂存区文件、未跟踪文件、忽略文件。可以增加参数 -s 缩略显示。绿色表示暂存区变更,红色表示工作区变更。   符号说明:

  • A(Added):添加的文件
  • M(Modified):修改过的文件
  • D(Deleted):删除的文件
  • R(Renamed):重命名的文件
  • ??(Untracked):未追踪的文件

拉取命令

  git fetch 是安全拉取代码的命令,仅拉取最新代码,不会合并到当前分支,不会修改到工作目录的文件。fetch 之后远程跟踪分支 origin/<branch_name> 会更新到最新。   git pull 是拉取代码且合并到当前分支的命令,会自动合并代码,会修改到工作目录的文件。pull 相当于先 fetch 再 merge 远程跟踪分支到当前分支。

代码语言:javascript
复制
#假设当前的分支是 feature_v1.0
git pull
#等同于
git fetch 
git merge FETCH_HEAD
#等同于
git fetch 
git merge origin/feature_v1.0

推送命令

  git push 是推送本地仓库代码到远程仓库的命令。省略分支名可以将当前分支推送到远程的对应分支。   push 执行时会自动检查远程分支的最新提交点,如果有新提交则会 push 失败。此时需要先 pull 合并远程变更后再 push。   push 执行后 origin/<branch_name>(远程跟踪分支)会更新到最新。

分支管理命令

  git 仓库的分支包括本地分支和远程跟踪分支。远程跟踪分支是对远程仓库分支的引用,在 fetch 时更新为最新。   远程跟踪分支名称为 origin/<branch_name>。   本地分支与远程跟踪分支存在关联关系,在首次 checkout 创建本地分支时自动建立关联。

代码语言:javascript
复制
#查看本地分支
git branch
#查看远程跟踪分支
git branch -r
#查看所有分支
git branch -a
#查看本地分支与远程跟踪分支的关联关系
git branch -vv

#切换本地分支,如不存在会根据远程跟踪分支创建
git checkout feature_v1.0
#切换到远程跟踪分支
git checkout origin/feature_v1.0

#创建本地分支
git branch feature_v1.1
#删除本地分支
git branch -d feature_v1.1
#清理本地不存在的远程追踪分支
git remote prune origin

分支合并

  git merge <branch_name> 用于分支合并,merge 后是对方分支名称。   git merge --abort 在合并冲突时使用,会抛弃合并过程并尝试重建合并前的状态。如果合并前未 commit 的文件,该命令并不能保证完全还原。一般建议合并前先 commit,或者用 stash 命令将未 commit 的文件暂存起来,合并完成后再 stash pop 出来。   git merge --no-commit 在合并冲突时使用,会合并冲突文件,但不会自动 commit。便于在提交前人工检查。   git merge --ff-only 除非当前可以使用 fast-forward 合并,否则会失败。   git merge --squash 用于压缩提交记录,从共同祖先节点到对方分支的顶点都会压缩在一起,产生一个新的节点。   git rebase 用于重设基底,合并对方分支的最新提交,并将最新提交作为当前分支的基底。   git cherry-pick <commitid> 用于合并某一个提交。

  分支冲突的表示:<<<<<<< 当前更改 ======= 传入的更改 >>>>>>>   分支冲突的解决:选择采用当前更改,或选择传入的更改,或选择保留双方更改,或人工修改。

还原与回退

  还原是将暂存区或工作区的文件还原为版本库的内容,不会修改到提交历史。   回退将当前分支回退到指定节点,会修改提交历史,是提交的逆向操作。回退也涉及暂存区或工作区文件内容的变更。   HEAD指针指向最近一次提交,表示当前版本。并且:

  • HEAD^:表示上一个版本
  • HEAD^^:表示上上个版本
  • HEAD~n:表示上 n 个版本
代码语言:javascript
复制
#还原工作区文件,还原后与暂存区内容一致
git checkout file1 file2
#还原工作区所有文件变更
git checkout .

#还原暂存区,工作区不变
git reset HEAD
#还原暂存区与工作区,工作区变更丢失
git reset --hard HEAD

#回退到上一次提交,暂存区也回退,工作区不变
git reset HEAD^
#回退到上一次提交,暂存区和工作区都回退,工作区变更丢失
git reset --hard HEAD^
#回退到上一次提交,暂存区与工作区都不变
git reset --soft HEAD^

#回退到上一次提交(增加一个提交节点来回退)
git revert HEAD^ 

stash 堆栈

  stash 用于临时存储工作现场(包括工作区和暂存区),为切换到其他分支开发再还原回来提供支持。stash 命令执行后暂存区和工作区被还原成版本库内容,所有变更消失。   stash 是堆栈结构,允许多次 stash ,再 pop 按照后进先出还原。

代码语言:javascript
复制
#存储工作现场
git stash
#存储工作现场,并指定名称
git stash save "work1"
#查看 stash 列表
git stash list
#恢复最近一个工作现场
git stash pop
#恢复指定工作现场
git stash apply stash@{0}
#删除指定工作现场
git stash drop stash@{0}
#删除所有工作现场
git stash clear

查看历史记录

代码语言:javascript
复制
#查看提交历史
git log
#查看提交历史,单行缩略显示
git log --oneline
#查看提交历史,包含文件变更统计
git log --stat
#查看提交历史,图形化显示
git log --graph
#查看提交历史,单行缩略显示,图形化显示
git log --oneline --graph

#查看file1文件的第 300 到 350 行的变更历史
git blame -L 300,350 file1

命令别名

  全局设置命令别名后,可以直接用别名替代命令,提高输入效率。

代码语言:javascript
复制
#设置命令别名
git config --global alias.st "status"
git config --global alias.co "checkout"
git config --global alias.ci "commit"
git config --global alias.md "commit --amend"
git config --global alias.br "branch"

git 工作流

gitflow 工作流

  gitflow 是一种常用的 git 工作流,用于管理大型项目,其分支结构如下:

gitflow流程图
gitflow流程图

  其中:

  • master:主干,保持与线上运行版本一致。
  • develop:开发分支,保持最新的开发代码。
  • hotfix:热修复分支,从master创建,合并回master和develop。
  • feature:功能分支,从develop创建,开发完成合并回develop再从develop创建release分支。
  • release:发布分支,从develop创建,主体功能测试完成等待发布。发布完成后合并回 develop和master。
  • tag:从master分支打的标签,用于发布。

  注意:hotfix、feature、release在完成开发合并回develop和master后可以删除。

forking 工作流

  forking 工作流用于开源项目,其流程图如下:

forking工作流
forking工作流

  forking 工作流中,项目的官方仓库只有维护者自己有权限写,其他开发者只能 fork 维护者的仓库,然后提交 pull request。项目维护者可以查看所有 pull request,并决定是否合并。

忽略文件

  .gitignore 文件用于忽略某些文件,避免提交无用的文件。

约定式提交

  约定式提交是一种基于提交消息的轻量约定,提供了一组用于创建清晰提交历史的简单规则。便于通过自动化工具提取变更历史。   格式如下:

代码语言:javascript
复制
<类型>[可选的作用域]: <描述>
[可选的正文]
[可选的脚注]

//注意:用英文冒号,且后面有一个空格。

  其中:

  • 类型:必须,包括feat(新功能)、fix(bug 修复)、docs(文档)、style(样式)、refactor(重构)、perf(性能改进)、test(测试)、build(构建)、ci(ci 配置或脚本)等。
  • 作用域:可选,表示影响范围,如组件名或模块名等。
  • 描述:必须,简短描述。
  • 正文:可选,详细描述。
  • 脚注:可选,如记录不兼容改动以 BREAKING CHANGE 开头加描述,如关闭 issue。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • git 信息流
  • git 命令
    • 基本操作命令
      • 配置命令
        • 初始化命令
          • 克隆命令
            • 提交命令
              • 查看状态
                • 拉取命令
                  • 推送命令
                    • 分支管理命令
                      • 分支合并
                        • 还原与回退
                          • stash 堆栈
                            • 查看历史记录
                              • 命令别名
                              • git 工作流
                                • gitflow 工作流
                                  • forking 工作流
                                  • 忽略文件
                                  • 约定式提交
                                  相关产品与服务
                                  命令行工具
                                  腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档