官网文档: https://git-scm.com/doc

1.git clone 地址

克隆所有文件的历史记录

2.git clone 地址 —depth 1

克隆默认分支master最近一次commit

3.git clone 地址 —depth 1 —branch dev

克隆dev分支最近一次commit

第三种方式克隆下来只存在指定的分支,如果想要切换分支
git remote set-branches origin ‘remote_branch_name’
git fetch —depth 1 origin remote_branch_name
git checkout remote_branch_name

git remote -v
查看当前地址

常用命令

  1. 显示所有提交过的用户,按提交次数排序

    1. git shortlog -sn
  2. 显示指定文件是什么人在什么时间修改过 ```bash git blame [file]

eg: git blame README.md

  1. <a name="en9B2"></a>
  2. ### 👉本地仓库同时关联多个远端仓库(gitee, github, gitlab)
  3. 因为git本身是**分布式版本控制系统**,可以同步到另外一个远程库,当然也可以同步到另外两个远程库。
  4. 使用多个远程库时,我们要注意,git给远程库起的默认名称是**origin**,如果有多个远程库,我们需要用**不同的名称**来标识不同的远程库。
  5. 1. 我们先删除已关联的名为origin的远程库:
  6. ```bash
  7. git remote rm origin
  1. 然后,先关联GitHub的远程库:

    1. git remote add github git@github.com:all-smile/pc-web.git

    注意: 远程库的名称叫github,不叫origin了。

  2. 接着,再关联Gitee的远程库:

    1. git remote add gitee git@gitee.com:hey-u/pc-web.git

    同样注意,远程库的名称叫gitee,不叫origin。

  3. 现在,我们用git remote -v查看远程库信息,可以看到两个远程库:

    1. git remote -v
    2. gitee git@gitee.com:hey-u/pc-web.git (fetch)
    3. gitee git@gitee.com:hey-u/pc-web.git (push)
    4. github git@github.com:all-smile/pc-web.git (fetch)
    5. github git@github.com:all-smile/pc-web.git (push)
  4. 如果要推送到GitHub,使用命令:

    1. git push github master

    如果要推送到Gitee,使用命令:

    1. git push gitee master

    git 相关问题 - 图1

将远程 URL 从 HTTPS 切换到 SSH

将远程 URL 从 SSH 切换到 HTTPS

Git 中的分支是指向提交的指针,是从特定时间点开始的项目及其更改的快照

删除本地分支:

git branch -d local_branch_name

设置git提交用户信息

github/gitlab/gitee 个人主页无法统计提交记录
git config —list
git config —global user.name “xxx”
git config —global user.email “xxx@123.com”

如何查看”.gitconfig”文件
在”Git Bash”命令行工具中输入“cd && ls -a”便可以看到如下信息
再通过“view .gitconfig”命令打开.gitconfig文件,即可查看该配置文件内容:
image.png

git log 不能正确显示中英文

git 相关问题 - 图3
git config —global core.quotepath false

git 相关问题 - 图4
git config —global core.pager more

tag 标签

image.png

  1. git tag -a <tagnamev1.0.0> -m "标签描述"
  2. # 将tag显示的推送到远程仓库
  3. git push origin v1.0.0
  4. #-------------------
  5. # 打 tag (tag指向commit ID)
  6. git tag -a <tagnamev1.0.0> -m "标签描述"
  7. eg: git tag -a v1.0.0 -m "test"
  8. # 推送tag
  9. git push github v1.0.0
  10. git push gitee v1.0.0
  11. # 获取tag
  12. git tag
  13. # 删除本地`tag`
  14. git tag -d 标签名
  15. eggit tag -d v3.1.0
  16. # 删除远程`tag`
  17. git push origin :refs/tags/标签名
  18. eggit push origin :refs/tags/v3.1.0

更新tag(不建议使用)

  1. git tag -a -f <tag名称> <新的commit ID>

0f88b52dde0d5223c6f317e767901ed.jpg
image.png

git commit 的类型

  • feat: 新功能、新特性
  • fix: 修改 bug
  • perf: 更改代码,以提高性能
  • refactor: 代码重构(重构,在不影响代码内部行为、功能下的代码修改)
  • docs: 文档修改
  • style: 代码格式修改, 注意不是 css 修改(例如分号修改)
  • test: 测试用例新增、修改
  • build: 影响项目构建或依赖项修改
  • revert: 恢复上一次提交
  • ci: 持续集成相关文件修改
  • chore: 其他修改(不在上述类型中的修改)
  • release: 发布新版本
  • workflow: 工作流相关文件修改

https://zhuanlan.zhihu.com/p/276458191

fatal: refusing to merge unrelated histories

git pull 的时候报错 拒绝合并无关历史记录
粗暴解决:

  1. 使用强制命令
  2. git pull origin master --allow-unrelated-historie

配置git bash

1。vscode配置bash
右键git bash here
执行命令: where bash : 获取bash应用程序路径

  1. vs中打开设置,搜索 shell,选择Automation Shell: Windows, 在setting.json中编辑
  2. 添加配置项

“terminal.integrated.shell.windows”: “填写获取到的bash路径”,
“terminal.integrated.automationShell.windows”: “填写获取到的bash路径”

where bash 命令在安全账户(多账户下)有兼容问题
去掉usr路径
D:/Git/usr/bin/bash.exe -> D:/Git/bin/bash.exe

👉必要的配置

  1. git config --global user.name "xxx"
  2. git config --global user.email "xxx@123.com"
  3. git config --global core.autocrlf false // 不同平台mac/windows/linux下换行符(\n, \r\n, \r)不一致的问题
  4. git config --global core.longpaths true
  5. git config --global core.quotepath false
  6. git config --global i18n.logoutputencoding utf-8
  7. git config --global i18n.commitencoding utf-8
  8. git config --global gui.encoding utf-8
  9. echo "export LANG=zh_CN.UTF-8" >> ~/.bash_profile
  10. echo "export LESSCHARSET=UTF-8" >> ~/.bash_profile

换行符问题

参考另一篇: https://www.yuque.com/allblue-byynd/izub4k/osk3wg
上面的都是通过规范个人的行为来保持版本库的统一,但团队开发中还是会有人不遵守规范,导致出现一些问题,所以最终的处理方案应该是跟随项目提供一个配置文件(.gitattributes),并且给以最高的优先级(像eslint配置一样),这里提供了一系列针对各种开发环境,已经写好了的 .gitattributes 文件。
参考: https://www.jianshu.com/p/fa4d5963b6c8
参考另一篇详解: https://www.yuque.com/allblue-byynd/izub4k/za3qkt

  • .gitattributes 具有最高的优先级,无论你是否设置相关的换行符风格转化属性,你都可以和团队保持一致;
  • 使用 * text=auto 可以定义开启全局的换行符转换;
  • 使用 *.bat text eol=crlf 就可以保证 Windows 的批处理文件在 checkout 至工作区时,始终被转换为 CRLF 风格的换行符;
  • 使用 *.sh text eol=lf 就可以保证 Bash 脚本无论在哪个平台上,只要被 checkout 至工作区,始终被保持 LF 风格的换行符;
  • 使用 *.jpg -text 可以禁止 Git 将 jpg 文件识别为文本文件,从而避免由于换行符转换引入的数据损坏;
Windows Linux/Mac Old Mac(pre-OSX)
CRLF LF CR
‘\n\r’ ‘\n’ ‘\r’

Windows 提交时转换为LF,检出时转换为CRLF

  1. git config --local core.autocrlf true

生成密钥对

右键 git bash
ssh-keygen -o -t rsa -C “your.email@example.com” -b 4096
一路回车
拷贝公钥到剪切板
cat ~/.ssh/id_rsa.pub | clip
登录gitlap配置公钥

多个github账号下,生成的key不能同时在两个github下面使用,导致添加失败:Key is already in use

image.png
这时候在执行ssh-keygen -o -t rsa -C “your.email@example.com” -b 4096命令的时候就不能默认回车了
可以修改生成key的文件名,默认文件名是id_rsa,生成多个不同文件命名的key就可以添加使用了。

添加ssh之后 git clone xxx还不行

image.png
87bfd508aef9451f3ae223f00ee83cc.jpg

尝试一:

配置ssh config

  1. # gitcode - csdn
  2. Host gitcode.net
  3. HostName gitcode.net
  4. PreferredAuthentications publickey
  5. IdentityFile ~/.ssh/gitcode
  6. # gitlab
  7. Host gitlab.com
  8. HostName gitlab.com
  9. PreferredAuthentications publickey
  10. IdentityFile ~/.ssh/gitlab-rsa
  11. # github
  12. Host github.com
  13. HostName github.com
  14. PreferredAuthentications publickey
  15. IdentityFile ~/.ssh/id_rsa
  16. # gitee
  17. Host gitee.com
  18. HostName gitee.com
  19. PreferredAuthentications publickey
  20. IdentityFile ~/.ssh/id_rsa
  21. # 公共配置
  22. # Host *
  23. # key value
  24. # 其它密钥对说明
  25. # 18143945157 : github-cli 使用的
  26. # gh-pages : hexo deploy_key 设置

再次测试连接

  1. ssh -T git@gitlab.com

尝试二

  1. ssh-keygen -R 你要访问的IP地址
  2. ssh-keygen -R git@gitlab.com:all-smile/gitbook.git
  3. Host git@gitlab.com:all-smile/gitbook.git not found in /c/Users/xiao/.ssh/known_hosts

修改 known_hosts 的文件名字,也就是让它不起作用。(host)

重新clone ,生成新的 known_hosts

  1. ping gitlab.com

切换分支

1.将远端分支拉取到本地(本地切换到远程分支,存在远端分支,需要在本地)
git checkout -b dev origin/dev

2.创建远程分支(本地新建分支,推送到远端)

删除本地分支
git branch -d

修改commit提交信息

情况一、修改最后一次的提交信息

git commit —amend
然后再vim编辑器里面修改保存即可
git push

情况二、修改指定commit的提交信息

https://blog.csdn.net/qidi_huang/article/details/61915654

  1. git log 查看信息,获取到commmit-id

  2. git rebase -i 6579ghjk^

变基到指定的commit-id版本, 并进入到一个可编辑的界面。在编辑区顶部,会列出这次 rebase 操作所涉及的所有 commit 提交记录的摘要,它们每一行默认都是以 pick 开头的。找到你想要修改的那个 commit,将行首的 pick 关键字修改为 edit。然后保存并退出。这么做可以在执行和指定 commit 有关的 rebase 操作时暂停下来让我们对该 commit 的信息进行修改

  1. git commit —amend 修改commit信息

  2. 执行 git rebase —continue 命令完成剩余的 rebase 操作。

如果需要修改多个提交记录的信息,则重复执行 2、3步骤,直到出现以下输出:

  1. $ git rebase --continue
  2. Successfully rebased and updated refs/heads/develop

到这里已经完成了变基操作的所有节点,

  1. 执行 git log 命令查看我们刚才的修改情况,确认已修改的内容和预期一致。

  2. git push

关联远程分支

将本地新建的分支与远程分支相关联(在当前分支下输入以下命令)
git branch -u origin/分支名 其中origin/xxx xxx为远程分支名
eg: git branch -u origin/master 本地分支关联远程master分支
或者使用 git branch —set-upstream-to origin/xxx 同样可以关联

查看本地分支与远程分支的映射关系(查看关联效果)

git branch -vv
git 相关问题 - 图11

撤销本地分支与远程分支的关系

git branch —unset-upstream

合并分支

git checkout master //切换到master分支上
git pull origin master //把远程分支pull下去,及时更新
git merge dev //把dev分支的代码合并到master上
git status // 查看状态
git push origin master //push到远程分支

Git本地有四个工作区域

工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)、git仓库(Remote Directory)。文件在这四个区域之间的转换关系如下
image.png

  • Workspace: 工作区,就是你平时存放项目代码的地方
  • Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
  • Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

重置提交

情况一、没有push到远程的情况(只是在本地commit)

  1. git reset --soft|--mixed|--hard <commit_id>
  2. git push develop develop --force (本地分支和远程分支都是 develop)

—mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。只是将git commit和index 信息回退到了某个版本。
—soft 保留源码,只回退到commit信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可。
git reset —soft HEAD
—hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交。

情况二、已经push到远程的情况

对于已经把代码push到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上线下代码保持一致,你要用到下面的命令

  1. git revert <commit_id>

revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新。
git revert是用一次新的commit来回滚之前的commit

HEAD 说明:

  • HEAD 表示当前版本
  • HEAD^ 上一个版本
  • HEAD^^ 上上一个版本
  • HEAD^^^ 上上上一个版本
  • 以此类推…

可以使用 ~数字表示

  • HEAD~0 表示当前版本
  • HEAD~1 上一个版本
  • HEAD^2 上上一个版本
  • HEAD^3 上上上一个版本
  • 以此类推…