官网文档: 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. ​打造企业自己代码规范IDEA插件(上)

    "交流互鉴是文明发展的本质要求.只有同其他文明交流互鉴.取长补短,才能保持旺盛生命活力." 这说的是文明,但映射到计算机技术本身也是相通的,开源代码/项目就是一种很好的技术交流方式 ...

  2. switch分支

    说明: 当表达式的值等于case中的常量,则会执行其中包含的语句块 break用于跳出循环,如果不写,则直接执行下一个常量的语句块,不再去判断表达式的值是否等于下一个case的常量(case穿透) 最 ...

  3. Mysql三种日志(binlog,redolog,undolog)的作用和区别

    Mysql有三种很重要的日志也是面试经常涉及到的考点,分别是 binlog .redo log和undo log, 这里面binlog 是server层实现的日志,而redo log 和undo lo ...

  4. 我的 Kafka 旅程 - 文件存储机制

    存储机制 Topic在每个Broker下存储所属的Partition,Partition下由 Index.Log 两类文件组成. 写入 Log 由多个Segment文件组成,每个Segment文件容量 ...

  5. C++自学笔记 面向对象程序设计OOP(Object Oriented Programming)

    什么是对象? Objects = Attributes + Services Data : The properties or status Operations: the fuctions C语言中 ...

  6. JVM中的方法区

    JVM中的方法区 方法区存储什么? 用于存储已被虚拟机加载的类型信息.常量.静态变量.即时编译器编译后的代码缓存 1.类型信息 对每个加载的类型(类class.接口interface.枚举.注解)jv ...

  7. 齐博X1-新建一个空模板并在后台选择

    本节实际操作建立一个空模板,并且让后台识别,选择该风格 先在index_style中建立一个目录,命名mystyle并上传我们在mystyle目录中建立一个info.php文件,代码如下:上传后,后台 ...

  8. 齐博X1-栏目的调用5

    本节继续说明栏目的调用父级.同级.子级三层的栏目调用 父级.同级.子级三层的栏目调用 fun('sort@family',$fid,'cms') 比如下面栏目10利用这个函数,就可以调用出 父级9 同 ...

  9. 齐博x1直播要设置回调地址才能播放

    因为通过扫码或推流网址给第三方用,也能让圈子实现直播,所以系统就改为必须要设置回调地址才能播放视频了.下面阿里与腾讯的都是大同小异的.腾迅的有多项,阿里的只有一项,不过阿里其实还有另一项,就是录制的时 ...

  10. IDEA& Android Studio 配置

    1.配置环境 首先要安装好JDK,但不需要单独下载SDK,只需在IDEA或AS的"设置->外观与行为->->系统设置->Android SDK"中下载相应版 ...