0%

Git使用指南

Git是什么

Git是目前世界上最先进的一款分布式版本控制系统,可以对我们的代码进行很好的版本管理。全球最大同性交流网站(Github)是程序员必逛的网站,学会使用Git是一个合格成熟的程序员必须掌握的技能之一,本篇文章主要介绍了Git的一个基本原理和常用的使用技巧。

如果使用Window,有一个Git版本控制客户端TortoiseGit非常好用,特别是像我以前使用惯了TortoiseSvn的人来说。

工具推荐:下载地址

Mac下还没找到特别好用的,暂时就先不推荐了^_^

Git的原理

Git的代码管理原理可以简化如下图。

image-20211017101514515

1、我们在工作目录编辑代码,当觉得OK的时候我们可以git add files将我们的代码提交大暂存区。

2、然后继续编辑代码,如果没有问题我们可以将一个功能或者特性git commit提交到版本中,如果发现有问题我们可以git reset回退代码。

3、如果测试没问题,我们可以将代码提交到远程仓库。

提交规范

1
2
3
4
5
6
7
8
9
10
feat:新功能
fix:修复bug
docs:文档改变
style:代码格式改变
refactor:某个功能重构
perf:性能优化
test:增加测试
build:改变了build功能,如grunt变成了npm
revert:撤销上一次commit
chore:构建过程或者辅助功能的变动

基本操作

  • 初始化一个本地仓库。

    1
    git init
  • 添加远程仓库。有时候你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且将本地仓库同步到远程Git仓库。

    1
    git remote add origin git@github.com:HDMLOVE/Git_test.git
  • 查看分支

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看本地分支
    git branch

    # 查看远程分支
    git branch -av

    # 查看当前分支远程地址
    git remote -v
  • 下载(克隆)远程仓库代码

    1
    git clone git@github.com:Passion1121/Git_test.git
  • 查看代码提交记录

    1
    2
    3
    4
    5
    # 查看提交历史记录
    git log --graph

    # 查看代码详细修改
    git show HEAD(commitid)
  • 切换/创建分支

    1
    2
    3
    4
    5
    # 切换到Test分支,本地分支不存在该分支,则会自动从远端仓库下载分支代码。
    git checkout Test

    # 从master分支创建新的分支Git_test并切换到Git_test分支。
    git checkout -b Git_test master
  • 提交代码文件

    1
    2
    3
    4
    5
    6
    # 提交某个<file>文件到暂存区。
    git add <file>

    # 提交当前目录下已经跟踪到的所有文件到暂存区
    git add .
    git add -u
  • 配置相关信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # 查看当前用户全局(global)配置信息
    git config --global --list

    # 查看当前仓库配置信息
    git config --local --list

    # git status 没有颜色区分提示问题
    # Git显示颜色设置,也可以对其进行单独配置。
    git config --global color.ui true

    # git diff 中文显示乱码问题
    git config --global core.quotepath false # 显示 status 编码
    git config --global gui.encoding utf-8 # 图形界面编码
    git config --global i18n.commit.encoding utf-8 # 提交信息编码
    git config --global i18n.logoutputencoding utf-8 # 输出 log 编码
    export LESSCHARSET=utf-8

    # Git在检出代码时不要自动将行尾转换为CRLF(Windows风格的换行符),而是保留原来的LF(Unix风格的换行符)
    git config --global core.autocrlf false

    # 配置用户名、邮箱等信息
    git config --global user.name "张三"
    git config --global user.email "helloworl@outlook.com"

    # 设置完毕后可以通过下面命令来修正本次提交所用的用户身份信息
    git commit --amend --reset-author
  • 配置免密提交

    1
    2
    3
    4
    # 生成ssh key
    ssh-keygen -t rsa -C "helloworld@sangfor.com" -b 4096
    # 上传到git服务器上或者添加ssh key
    cat ~/.ssh/id_rsa.pub
  • 修改某个commit

    1
    2
    3
    4
    5
    6
    7
    8
    # 修改最近的一次的commit信息
    git rebase --amend

    # 显示最近的5次修改
    git rebase -i HEAD~5

    # 修改完成后,强制推送到远程分支 (慎用,会覆盖代码,小心找不回来!!!)
    git push origin <master> --force <==> git push master -f
  • 删除分支

    当我们不需要某个分支的时候我们可以使用以下命令进行分支删除,但是当我们处于该分支的时候是无法删除的,所以我们第一步应该是先使用git checkout <branch>切换到一个其他的分支。

    1
    2
    3
    # 删除本地分支
    git branch -d <branch> # 删除分支(本地还有代码没推送到本地分支时候是无法删除的)
    git branch -D <branch> # 强制删除分支(本地代码没有推送到远程也可以删除)
  • 分支重命名

    1
    2
    # 将分支old_branch重命名为new_branch
    git branch -m old_branch new_branch
  • 仓库太大下载单个分支。

    当您遇到 Git 仓库太大的情况,只想下载单个分支,可以使用 Git 的 clone 命令配合一些特定的选项来实现。

    1
    2
    3
    4
    5
    6
    7
    # 分批拉取,避免失败
    git fetch --depth 500

    # 浅克隆拉去指定分支代码
    git clone --depth 1 --branch feature-branch https://github.com/example/example-repo.git
    # 浅克隆:--depth 1 参数来创建一个浅克隆。这会克隆仓库的最近一次提交,从而减少数据量。
    # 指定分支:使用 --branch 参数来指定您想要克隆的分支。
  • 更新或者恢复某一个文件或者目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 可以直接使用命令对其进程恢复,或者先删除掉再使用该命令进行恢复
    git checkout -- test.c
    git checkout -- testdir

    # 撤销暂存区的文件,git add 之后想要撤销,恢复到某个提交的版本(HEAD)
    git reset --hard HEAD

    # 撤销所有则执行如下命令
    git reset
  • 查看修改比较

    1
    2
    3
    4
    5
    # 工作区(work dict)和暂存区(stage)的比较
    git diff

    # 暂存区(stage)和分支(所在)的比较
    git diff --cache
  • 忽略提交文件和类型

    1
    2
    3
    4
    5
    6
    # 项目中添加文件可以忽略不需要提交的文件和类型
    .gitignore
    内容为:
    *.sh
    *.d
    *.o
  • 统计代码行数

    1
    2
    3
    4
    5
    # 统计特定时间范围内的代码行数
    git log --author="AuthorName" --since="2022-01-01" --until="2022-12-31" --pretty=tformat: --numstat

    # 统计代码量
    git log --author="mengfanxiao" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
  • 暂时保存当前的修改而不(commit)提交,这种一般在需要切换分支的时候非常有用,有时候写了一半的代码,都还不能编译通过的,就被叫去改另一个分支的bug了。Git 会将当前工作目录和暂存区的修改保存为一条栈记录,以便稍后恢复。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    # 保存当前的代码(紧保存跟踪的文件)
    git stash
    #
    git stash save “修改的信息"
    #
    # 保存未跟踪的文件
    git stash -u 或 --include-untracked
    git stash save -u "备注信息"

    # 弹出(恢复)第一个保存的代码
    git stash pop

    # 查看当前暂存区的stash的内容
    git stash list

    # 恢复应用第1个
    git stash apply stash@{0}

    # 查看 stash 的内容
    git stash show
    git stash show stash@


    # 删除最近一次的 stash
    git stash drop
    # 删除指定的 stash
    git stash drop stash@
    # 删除所有的 stash
    git stash clear

常见问题

权限问题导致无法clone代码

linux普通用户无法使用git clone 克隆代码问题,一直报口令认证失败,公钥等其他问题均已排查过。

1
2
3
# 解决方案:修改tty权限。
ll /dev/tty
chmod 777 /dev/tty

window 提示告警

Git window 下提示告警:Windows git “warning: LF will be replaced by CRLF”, is that warning tail backward?

解决方法:

1
git config --global core.autocrlf false

reference

[1] https://www.conventionalcommits.org/en/v1.0.0/

小主,路过打个赏再走呗~