Git日常使用以及问题记录

一、安装

在macos中安装,使用xcode工具或者brew直接安装;
在ubuntu/redhat中使用apt/yum安装,yum可能需要设置epel源安装最新的版本;

二、配置

git配置文件主要放在三个位置,针对的范围不同,分别是所有用户,当前用户、当前仓库;

命令行是使用git config读写,例如git config –global xxx=xxx

范围 配置文件 配置参数
所有用户 /etc/gitconfig –system
当前用户 ~/.gitconfig 或者 ~/.config/git/config –global
当前仓库 .git/config –local 或者空(默认值)

优先级:当前仓库 > 当前用户 > 所有用户,同样的配置会覆盖。

按照上述的优先级,我们可以直接给某个仓库设置提交用户的身份。

使用该命令可以列出配置项,以及生效的文件:

git config --list --show-origin

三、git目录下的文件说明

每一个git仓库下面都会有一个.git的文件夹,这个文件夹存储这个整个git的配置和每个版本的信息;我们简单看下有哪些文件:

.git/config

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[remote "origin"]
        url = git@github.com:gslnzfq/test.git
        fetch = +refs/heads/master:refs/remotes/origin/master
[branch "master"]
        remote = origin
        merge = refs/heads/master
[branch "feature/test"]
        remote = origin
        merge = refs/heads/feature/test
[user]
        name = zhangsan
        email = zhangsan@qq.com

我们可以在该文件中看到远程的仓库地址,还有就是每个分支的信息;

.git/HEAD

ref: refs/heads/feature/test

该文件存储的是当前分支的信息;

四、删除忽略的文件

修改ignore文件后,重新整理文件:git rm -r –cached .

git rm -r --cached .
git add .
git commit -m 'update .gitignore'

五、git常用命令

git status 命令的输出十分详细,但其用语有些繁琐。Git 有一个选项可以帮你缩短状态命令的输出,这样可以以简洁的方式查看更改。如果你使用 git status -s 命令或 git status –short 命令,你将得到一种格式更为紧凑的输出。

$ git status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

拉取所有的分支
git fetch –all

打标签
git tag <tagName>

推送所有标签
git push –tags

删除标签
git tag -d <tagname>

删除分支
git branch -d <branch>

删除远程分支
git push -D origin <branch>

强制使用远程代码
git rebase –hard origin/master

六、git文件夹占用过大

发现占用了281MB

➜  welcome git:(master) du -h -d1
1.7M    ./app
426M    ./cdn
8.0K    ./test
1.1M    ./dist
4.2M    ./bower_components
325M    ./node_modules
2.4M    ./.tmp
281M    ./.git
 36K    ./.idea
1.0G    .

清理

git gc –aggressive

对本地git库进行更彻底清理和优化,这个指令花费的时间也会更长。

git gc –auto

这是一个设置的指令,并不会进行gc操作。如果有 7,000 个左右的松散对象或是 50 个以上的 packfile,Git 才会真正调用 gc 命令,即是这里设置了阈值,当然也可以通过修改配置中的 gc.auto 和 gc.autopacklimit 来调整这两个阈值。

清理以后,好像并么有减少多少,看看.git文件夹的大小

➜  welcome git:(master) du -h -d1
1.7M    ./app
426M    ./cdn
8.0K    ./test
1.1M    ./dist
4.2M    ./bower_components
325M    ./node_modules
2.4M    ./.tmp
276M    ./.git
 36K    ./.idea
1.0G    .

参考:
https://www.cnblogs.com/lykbk/p/dfdfvdfd343434.htmlhttps://blog.csdn.net/leebruce_/article/details/82776117

七、删除所有的历史记录

具体步骤

  1. 切换不保留历史记录的新分支
  2. 提交代码(否则新的分支是不存在的)
  3. 删除旧分支
  4. 修改分支名称为要删除历史记录的分支
  5. 强推到远端
# 切换一个不保留历史记录的分支
git checkout --orphan new_branch
# 提交代码
git add -A
git commit -am "feat: clean code."
# 删除旧的分支
git branch -D master
# 修改当前分支名称为旧分支名称
git branch -m master
# 强推
git branch --set-upstream-to origin/master master
git push -f origin master

八、npm下载github仓库提示失败

The unauthenticated git protocol on port 9418 is no longer supported.

stackoverflow解决方案

git config --global url."https://github.com/".insteadOf git://github.com/

九、在git目录启动服务在网页上查看git的信息

# 打开
git instaweb --httpd=webrick
# 关闭
git instaweb --httpd=webrick --stop

十、使用tag管理版本号

获取git仓库的最新tags,下面命令得到的是一个tag列表

# 更新远程的tags到本地
git fetch origin --tags

使用nodejs获取最新的版本号后自增,小版本累加到9,前面的版本+1

// 获取本地的tag并且排序拿到最新的版本号
function getLastVersion() {
    return require('child_process')
    .execSync(`git tag`, { cwd: path.resolve("../../build") })
    .toString()
    .split("\n")
    .filter(Boolean)
    .sort((a, b) => semver.compare(a, b))
    .pop()
}

// 保证版本号不超过10
// 版本号变更 1.0.9 => 1.1.0  1.9.0 => 2.0.0
const lastVersion = getLastVersion();
let nextVersion = semver.inc(lastVersion, "patch");

const patchVersion = semver.patch(lastVersion);
const minorVersion = semver.minor(lastVersion);

if (patchVersion >= 9) {
  nextVersion = semver.inc(lastVersion, "minor");
} else if (minorVersion >= 9) {
  nextVersion = semver.inc(lastVersion, "major");
}

十一、push的时候自动追踪远程的分支

将当前分支推到远端,如果没有track会提示错误,如下所示

pasted-20230829142851

我们可以先获取本地当前分支,然后在推送的时候添加上分支名称就可以了

# git branch --show-current 会获取当前的分支
git push -u origin "$(git branch --show-current)"

十二、获取最近一个提交用户的邮箱

有时候需要通过提交触发ci流程,ci完成之后给提交者发送邮件,可以通过下面的脚本来获取提交邮箱。

git log --pretty=format:"%ae" -1

十三、删除空文件夹

git clean -fd

留下回复