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

本地克隆远程代码仓库

  1. git clone 地址

本地同步全量历史数据,克隆所有文件的历史记录

  1. git clone 地址 —depth 1

本地同步默认分支最近n次的commit信息,克隆默认分支master最近一次commit

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

本地同步指定分支最近n次的commit信息,克隆dev分支最近一次commit

第三种方式克隆下来只存在指定的分支,如果想要切换分支,使用下面的命令

git remote set-branches origin 'remote_branch_name'
git fetch --depth 1 origin remote_branch_name
git checkout remote_branch_name

常用git命令(更新中...)

  1. 显示所有提交过的用户,按提交次数排序
git shortlog -sn
  1. 显示指定文件是什么人在什么时间修改过
git blame [file]

eg: git blame README.md

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

  1. 删除本地分支

git branch -d local_branch_name

  1. 切换分支

将远端分支拉取到本地(本地切换到远程分支,存在远端分支,需要在本地)

git checkout -b dev origin/dev

  1. 关联远程分支

将本地新建的分支与远程分支相关联(在当前分支下输入以下命令)

git branch -u origin/分支名

其中origin/xxx xxx为远程分支名

eg: git branch -u origin/master 本地分支关联远程master分支

或者使用 git branch --set-upstream-to origin/xxx 同样可以关联

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

git branch -vv

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

git branch --unset-upstream

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

本地仓库同时关联多个远端仓库(gitee, github, gitlab...)

因为Git本身是分布式版本控制系统,可以同步到另外一个远程库,当然也可以同步到另外两个远程库。

使用多个远程库时,我们要注意,git给远程库起的默认名称是origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库, 具体操作步骤如下:

  1. 先删除已关联的名为origin的远程库:
git remote rm origin
  1. 再关联GitHub的远程库:
git remote add github git@github.com:all-smile/pc-web.git

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

  1. 接着,再关联Gitee的远程库:
git remote add gitee git@gitee.com:hey-u/pc-web.git

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

  1. 查看远程库信息
git remote -v
gitee git@gitee.com:hey-u/pc-web.git (fetch)
gitee git@gitee.com:hey-u/pc-web.git (push)
github git@github.com:all-smile/pc-web.git (fetch)
github git@github.com:all-smile/pc-web.git (push)
  1. 本地修改推送到远端
  • 推送到GitHub
git push github master
  • 推送到Gitee
git push gitee master

也可以在使用NPM包管理工具的项目添加如下scripts脚本

"scripts": {
"pull": "git pull github master && git pull gitee master",
"push": "git push github master && git push gitee master"
},

拉取/推送的时候使用

npm run pull
npm run push

将远程 URL 从 HTTPS 切换到 SSH

  • 打开 Terminal(终端)。
  • 将当前工作目录更改为您的本地仓库。
  • 列出现有远程仓库以获取要更改的远程仓库的名称。
git remote -v
origin  https://github.com/USERNAME/REPOSITORY.git(fetch)
origin  https://github.com/USERNAME/REPOSITORY.git(push)
  • 使用 git remote set-url 命令将远程的 URL 从 HTTPS 更改为 SSH。
git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
  • 验证远程 URL 是否已更改。
git remote -v
origin  git@github.com:USERNAME/REPOSITORY.git (fetch)
origin  git@github.com:USERNAME/REPOSITORY.git (push)

将远程 URL 从 SSH 切换到 HTTPS

  • 打开 Terminal(终端)。
  • 将当前工作目录更改为您的本地仓库。
  • 列出现有远程仓库以获取要更改的远程仓库的名称。
git remote -v
origin  git@github.com:USERNAME/REPOSITORY.git (fetch)
origin  git@github.com:USERNAME/REPOSITORY.git (push)
  • 使用 git remote set-url 命令将远程的 URL 从 SSH 更改为 HTTPS。
git remote set-url origin https://github.com/USERNAME/REPOSITORY.git
  • 验证远程 URL 是否已更改。
git remote -v
origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
origin  https://github.com/USERNAME/REPOSITORY.git (push)

设置git提交用户信息

这里牵涉到提交代码的一些数据统计,了解一下会很有帮助的,可以看下我的这篇文章:

语雀:github/gitlab/gitee 个人主页无法统计提交记录

后来有次居家办公,跟同事公用一台虚桌,为了把一些“数据”做的好看些,不得不切换本地的ssh配置。发现gitlab上代码的数据统计采集数据的方式应该不唯一,具体描述如下:

  1. 我给后端项目设置了项目级的git用户配置,后端同事提交的时候直接提
  2. 前端项目提交使用系统级的git用户配置

    做完这些之后发现,gitlab上项目里的提交信息统计的是正确的(猜测就是取得commit信息而已),在profile主页确没有统计到提交记录(测试发现应该是跟推送远程仓库时使用得ssh密钥有关系),具体的设置请看常用的SSH,你了解多少?

如何查看".gitconfig"文件

在"Git Bash"命令行工具中输入“cd && ls -a”便可以看到如下信息

再通过“view .gitconfig”命令打开.gitconfig文件,即可查看该配置文件内容:

git log 不能正确显示中英文

git config --global core.quotepath false

git config --global core.pager more

tag 标签

git tag -a <tagname:v1.0.0> -m "标签描述"

# 将tag显示的推送到远程仓库
git push origin v1.0.0 #-------------------
# 打 tag (tag指向commit ID)
git tag -a <tagname:v1.0.0> -m "标签描述" eg: git tag -a v1.0.0 -m "test" # 推送tag
git push github v1.0.0
git push gitee v1.0.0 # 获取tag
git tag # 删除本地`tag` git tag -d 标签名 eg:git tag -d v3.1.0 # 删除远程`tag` git push origin :refs/tags/标签名 eg:git push origin :refs/tags/v3.1.0

更新tag(不建议使用)

有副作用,一般的做法是删除 tag, 重新打,或者递增tag值

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

git commit 信息的规范设置

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

如果想进一步设置代码的书写规范,请看这里:perttier+eslint+husky 使用

fatal: refusing to merge unrelated histories

git pull 的时候报错 拒绝合并无关历史记录

粗暴解决:

使用强制命令

git pull origin master --allow-unrelated-historie

生成ssh密钥对

  1. 右键 git bash

    ssh-keygen -o -t rsa -C "your.email@example.com" -b 4096一路回车

  2. 拷贝公钥到剪切板

cat ~/.ssh/id_rsa.pub | clip

3.登录gitlap配置公钥

vscose配置git bash

  1. vscode配置bash

    右键git bash here

    执行命令: where bash : 获取bash应用程序路径

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

  3. 添加配置项

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

"terminal.integrated.automationShell.windows": "填写获取到的bash路径"

where bash 命令在安全账户(多账户下)有兼容问题

去掉usr路径

D:/Git/usr/bin/bash.exe -> D:/Git/bin/bash.exe

必要的git bash配置

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

代码换行符告警问题

参考我的另一篇:Delete eslint(prettier/prettier) 错误的解决方案

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

  • .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

git config --local core.autocrlf true

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

这时候在执行ssh-keygen -o -t rsa -C "your.email@example.com" -b 4096命令的时候就不能默认回车了

可以修改生成key的文件名,默认文件名是id_rsa,生成多个不同文件命名的key就可以添加使用了。

不同的代码仓库平台可以采用设置 ssh config的方式,可以参考常用的SSH,你了解多少?自己尝试一下

添加ssh之后 git clone xxx还不行

尝试一:

配置ssh config

# gitcode - csdn
Host gitcode.net
HostName gitcode.net
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitcode # gitlab
Host gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitlab-rsa # github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa # gitee
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa # 公共配置
# Host *
# key value # 其它密钥对说明
# 18143945157 : github-cli 使用的
# gh-pages : hexo deploy_key 设置

再次测试连接

ssh -T git@gitlab.com

尝试二

ssh-keygen -R 你要访问的IP地址

ssh-keygen -R git@gitlab.com:all-smile/gitbook.git
Host git@gitlab.com:all-smile/gitbook.git not found in /c/Users/xiao/.ssh/known_hosts

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

重新clone ,生成新的 known_hosts

ping gitlab.com

修改commit提交信息

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

  1. git commit --amend

然后再vim编辑器里面(具体以什么方式打开要看git bash的配置,可以配置成 notepad++, 或者使用 Git Extensions)修改保存即可

  1. git push

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

  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步骤,直到出现以下输出:

git rebase --continue
Successfully rebased and updated refs/heads/develop

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

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

  2. git push

Git本地有四个工作区域

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

  • Workspace: 工作区,就是你平时存放项目代码的地方

  • Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息

  • Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

  • Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

重置提交

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

git reset --soft|--mixed|--hard <commit_id>
git push develop develop --force (本地分支和远程分支都是 develop)
  • --mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。只是将git commit和index 信息回退到了某个版本。

  • --soft 保留源码,只回退到commit信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可。

    git reset --soft HEAD

  • --hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交。

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

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

git revert <commit_id>

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

git revert是用一次新的commit来回滚之前的commit

HEAD 说明:

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

可以使用 ~数字表示

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

其它相关文章推荐

我是 甜点cc

微信公众号:【看见另一种可能】

专注前端开发,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。

git相关问题解析,你想要的都有🔥的更多相关文章

  1. git 相关

    github入门   一.先了解 相比CVS\SVN优势: - 支持离线开发,离线Repository- 强大的分支功能,适合多个独立开发者协作- 速度快 github 本地有仓库,储存着所有repo ...

  2. git 相关学习

    1.Git 的一些快捷键 第一次创建本git 本地仓库 :: git  init  //在本地创建一个 Git仓库 :要在该目录下 第一次 要配置GitHub 的 账号和邮箱: git config ...

  3. Git相关内容

    先聊一点关于gitlab的内容和github的内容 Gitlab和GitHub,都是我们可以存放代码库的地方.不过Gitlab可以免费的存储私人代码,GitHub需要花钱才能够存储私人代码库,不过我想 ...

  4. Git原理入门解析

    前言: 之前听过公司大佬分享过 Git 原理之后就想来自己总结一下,最近一忙起来就拖得久了,本来想塞更多的干货,但是不喜欢拖太久,所以先出一版足够入门的: 一.Git 简介 Git 是当前流行的分布式 ...

  5. awr相关指标解析

    awr相关指标解析 2016年11月11日 15:09

  6. MAC 相关操作解析

    MAC 相关操作解析 OS 显示桌面 f11 F1~F12 fn + F1~F12 撤销重做 command + z command + shift + z 图片预览 选择图片 空格 上下左右 svn ...

  7. Git——常用场景解析

    总结:本篇文章从初识GitHub.Git,实践GitHub的五种常用场景,分别是:git for windows安装,git配置,克隆远程代码到本地,上传本地代码到远程以及Git的常用指令.相信Jam ...

  8. Hadoop NameNode元数据相关文件目录解析

    在<Hadoop NameNode元数据相关文件目录解析>文章中提到NameNode的$dfs.namenode.name.dir/current/文件夹的几个文件: 1 current/ ...

  9. Git相关安装包打包下载

    Git相关软件偶尔需要***才能下载,故分享于此 1.Git-2.15.0-64-bit.exe 2.TortoiseGit-2.5.0.0-64bit.msi 3.TortoiseGit-Langu ...

  10. git相关整理

    title: git相关整理 toc: false date: 2018-09-24 20:42:55 git merge 和 git merge --no--ff有什么区别? git merge命令 ...

随机推荐

  1. Mysql 数据库SQL脚本导入

    1.进入mysql命令行窗口 mysql -uroot -p123456 2.展示所有数据库 show databases: 3.选择数据库 use 数据库名 4.展示选择的数据库中所有表 show ...

  2. 微信小程序开发优化

    一.开发优化一 1.使用Vant Weapp 1.1 什么是Vant Weapp Vant Weapp官网链接 Vant Weapp是有赞前端团队开源的一套小程序UI组件库,助力开发者快速搭建小程序应 ...

  3. IDEAidea导入Scala包

    IDEAidea导入Scala包 一.配置windows的scala的环境变量 二.IDEA导入scala插件 1.如图步骤导入IDEA的scala插件 三.添加本地的scala目录 这时候我们应该在 ...

  4. python批量加密文件

    1.文件名的加密与解密 #coding:utf-8 from docx import Document import os,sys from docx.oxml.ns import qn def fi ...

  5. 2.签名&初始化&提交

      Git设置签名 签名的作用是区分不同操作者的身份,用户的签名信息在每一个版本的提交信息中能够看到, 以此确认本次提交是谁做的,git首次安装必须设置用户签名,否则无法提交代码 这里设置的用户签名和 ...

  6. Windows 环境搭建 PostgreSQL 逻辑复制高可用架构数据库服务

    本文主要介绍 Windows 环境下搭建 PostgreSQL 的主从逻辑复制,关于 PostgreSQl 的相关运维文章,网络上大多都是 Linux 环境下的操作,鲜有在 Windows 环境下配置 ...

  7. python(27)反射机制

    1. 什么是反射? 它的核心本质其实就是基于字符串的事件驱动,通过字符串的形式去操作对象的属性或者方法 2. 反射的优点 一个概念被提出来,就是要明白它的优点有哪些,这样我们才能知道为什么要使用反射. ...

  8. 2.3 Goland快捷键

    1 新建 Alt + Insert Alt + Enter 2 移动 Alt + 上下箭头:以函数为单位移动 Ctrl + G : 定位到行 Ctrl + W :可以选择单词继而语句继而行继而函数Ct ...

  9. 快速构建一个简单的Springboot-web项目

    web项目基本的核心成分 数据落地 MYSQL数据库 登录标识 JWT :{Java web token } 记录有效登录状态 以及缓存常用数据: Redis 数据库与JAVA实体的快速自动映射ORM ...

  10. 更换linux的开机启动图片, 启动主题

    简述 之前就想更改开机的启动图片,但是后来简单查了一下,说要重新编译内核,听到编译我就望而却步了,今天发现只是个命令而已,注意这里我用的是 linux mint .这里更改不是 grub 主题, 是 ...