4

git相关问题解析,你想要的都有🔥 - 甜点cc

 1 year ago
source link: https://www.cnblogs.com/all-smile/p/16994701.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

官网文档: 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

将远端分支拉取到本地(本地切换到远程分支,存在远端分支,需要在本地)
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

1037867-20221213211709485-198093656.png

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

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到远程分支

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

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

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

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

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

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

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

  1. 查看远程库信息
git remote -v
gitee   [email protected]:hey-u/pc-web.git (fetch)
gitee   [email protected]:hey-u/pc-web.git (push)
github  [email protected]:all-smile/pc-web.git (fetch)
github  [email protected]: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

1037867-20221213211709886-34674661.png

将远程 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 [email protected]:USERNAME/REPOSITORY.git
  • 验证远程 URL 是否已更改。
git remote -v
origin  [email protected]:USERNAME/REPOSITORY.git (fetch)
origin  [email protected]:USERNAME/REPOSITORY.git (push)

将远程 URL 从 SSH 切换到 HTTPS

  • 打开 Terminal(终端)。
  • 将当前工作目录更改为您的本地仓库。
  • 列出现有远程仓库以获取要更改的远程仓库的名称。
git remote -v
origin  [email protected]:USERNAME/REPOSITORY.git (fetch)
origin  [email protected]: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文件,即可查看该配置文件内容:

1037867-20221213211710382-1113636816.png

git log 不能正确显示中英文

1037867-20221213211710878-806291617.png

git config --global core.quotepath false

1037867-20221213211711237-1137294567.png

git config --global core.pager more

tag 标签

1037867-20221213211711699-1456658586.png
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>
1037867-20221213211712823-1924500018.png
1037867-20221213211713331-1583356016.png

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 "[email protected]" -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 "[email protected]"
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

1037867-20221213211713752-1365366640.png

这时候在执行ssh-keygen -o -t rsa -C "[email protected]" -b 4096命令的时候就不能默认回车了

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

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

添加ssh之后 git clone xxx还不行

1037867-20221213211714159-941389231.png

1037867-20221213211714611-289161646.png

配置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 [email protected]
ssh-keygen -R 你要访问的IP地址

ssh-keygen -R [email protected]:all-smile/gitbook.git
Host [email protected]: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)。文件在这四个区域之间的转换关系如下

1037867-20221213211715082-1965262969.png
  • 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 上上上一个版本
  • 以此类推...

其它相关文章推荐

1037867-20221213211716037-1034940250.png

我是 甜点cc

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK