Featured image of post 1-git使用教程&github使用教程

1-git使用教程&github使用教程

git&github使用指南

git基本使用

简单常用命令

# 绑定本地分支和远程分支
git branch --set-upstream-to=origin/<远程分支> <本地分支>

%%设置用户签名%%
git config --global user.name [username]      
git config --global user.email [useremail]

%%设置对于非ASCII字符的显示方式%%
git config--global core.quotepath false

%%设置init分支名%%
git config --global init.defaultBranch main

%%初始化本地库%%
git init

%% 设置远端库别名
git remote add <别名> <网址>

%% 查看远端库
git remote -v


%%查看本地库状态%%
git status

%%追踪文件,放入暂存区%%
git add [filename]
git add .  #所有文件放入暂存区
%%撤销追踪%%
git restore 【file】

%%删除暂存区的文件%%
git rm --cache 【filename】

%%提交本地库%%
git commit -m "[提交信息]" 【文件名(可以不加)】

%%撤销commit提交%%
git reset --soft HEAD     


%%推送远程库
git push [<远程主机名>] [<本地分支>:<远程分支>] #如果不加分支对应信息就默认上次记录的全部分支

%%拉取远程库%%
git pull [<远程主机名>] [<远程分支>:<本地分支>]   # 从远程仓库(名为 origin)的 main 分支拉取代码并自动与本地的 main 分支合并 ,如果方括号里面的不加就默认拉去上一次的



%%查看引用日志版本信息%%
git reflog 
%%查看详细日志%%
git log

%%版本穿梭%%  一般用soft多一点
git reset --hard  【版本号】

--.gitignore--------------------
test* 忽略以test开头的文件

复杂命令

pull

git pull origin master --allow-unrelated-histories    # 无视没有共同历史合并  

remote


# 仓库路径查询
git remote -v

#添加远程仓库:
git remote add <远程仓库名> <你的项目地址> 

#删除指定的远程仓库
git remote rm origin

# 修改远程仓库地址
git remote set-url origin <remote-url>

branch

# 重命名分支
​ git branch -m oldName newName


---
# 2、 远程分支重命名
# 重命名远程分支对应的本地分支
git branch -m oldName newName
#删除远程分支
git push --delete origin oldName
#上传新命名的本地分支
git push origin newName
#把修改的本地分支与远程分支关联
git branch --set-upstream-to origin/newName
---


#3、查看当前代码仓库源
#查看当前源
git remote -v

#重设
git remote set-url origin xxxx_url

checkout

# 切换分支
git checkout <分支名>
# 创建分支并切换
git checkout -b <分支名>
# 删除分支

bundle 用于备份

https://blog.csdn.net/penriver/article/details/126579266

# 打包
git bundle create <打包名>.bundle HEAD <分支名>

# 验证文件合法
git bundle verify <打包名>.bundle

# 恢复
git clone <打包名>.bundle

merge

# 合并分支
git merge feature

# 如果是远程分支合并
git merge origin/feature

关于merge的详解可见参考git merge

tag

# 创建标签
git tag <tagname>                          # 轻量标签
git tag -a <tagname> -m "<message>"       # 带注释标签
git tag <tagname> <commit-hash>           # 为特定提交打轻量标签
git tag -a <tagname> <commit-hash> -m "<message>" # 为特定提交打注释标签
git tag -s <tagname> -m "<message>"       # 创建带 GPG 签名的标签

# 查看标签
git tag                                   # 列出所有标签
git tag -l                                # 同上
git tag -l "<pattern>"                    # 按模式查找标签(如 v1.*)
git show <tagname>                        # 显示标签详细信息
git tag -v <tagname>                      # 验证签名标签

# 推送标签
git push origin <tagname>                 # 推送单个标签
git push origin --tags                    # 推送所有标签

# 删除标签
git tag -d <tagname>                      # 删除本地标签
git push origin --delete <tagname>        # 删除远程标签

# 切换到标签
git checkout <tagname>                    # 检出标签(进入分离头指针状态)

一些问题解决

在本地开发环境检查远程是否更新

第一种方法

git log --oneline --graph --all

第二种方法

# 设置跟踪远程分支
git branch --set-upstream-to=origin/<branch> <branch>  # git branch --set-upstream-to=origin/main main


# 查看是否跟踪
git branch -vv


# 下载数据
git fetch origin

# 查看是否有更新
git status 

是否跟踪对比

未跟踪 已经跟踪

可以看见本地和远程分支状态

git clone 远程项目,同步远程项目更新

git fetch origin #查看远程项目更新
git pull origin 远程分支:本地分支

git 版本标签

  1. 什么是版本标签? 标签(Tag) 是 Git 中的一个引用(reference),指向某个特定的提交。 它通常用于标记一个稳定的发布版本,比如 v1 表示第一个正式版本。 在 GitHub 上,标签还会显示在 Releases 页面,便于用户下载或查看。 两种标签类型 轻量标签(Lightweight Tag):只是一个简单的指针,指向某个提交,不包含额外信息。 附注标签(Annotated Tag):包含额外元数据(如创建者、日期、描述),更常用于正式发布。
# 假设你已经完成代码更改并提交
git add .
git commit -m "Finalize version 1.0"

# 创建一个轻量标签(简单标记当前提交)
git tag v1

# 或者创建一个附注标签(带描述信息,推荐用于正式发布)
git tag -a v1 -m "Release version 1.0"

# 查看所有本地标签
git tag

# 推送单个标签到远程仓库(如 GitHub)
git push origin v1

# 或者推送所有标签到远程仓库
git push origin --tags

# (可选)如果需要删除本地标签
git tag -d v1

# (可选)如果需要删除远程标签
git push origin --delete v1

git merge详解

如果没有冲突,Git 会自动完成合并,并创建一个合并提交(merge commit,如果需要的话)。如果有冲突,Git 会暂停合并,提示你解决冲突(后面会讲怎么处理)。

  1. 无冲突的合并(Fast-forward)

如果 main 分支没有额外改动,而 feature 分支只是基于 main 增加了提交,Git 会执行“快进合并”(fast-forward)。这时候历史记录会变成一条直线,看起来像是直接在 main 上开发了一样。

  1. 有额外提交的合并(Merge Commit)

如果 main 和 feature 都有各自的提交,Git 会创建一个新的合并提交,保留两个分支的历史。 命令一样:

git merge <分支名>

但是,合并后,Git 会自动生成一个 Merge commit,这样,从历史上看,分支信息就非常清楚。

  1. 冲突的合并 当两个分支修改了同一文件的同一部分,Git 无法自动决定用哪个版本,就会报冲突。这时你需要手动解决:

运行 git merge feature 后,Git 会提示冲突文件。 打开这些文件,冲突部分会被标记为:

<<<<<<< HEAD
(main 分支的内容)
=======
(feature 分支的内容)
>>>>>>> feature

编辑文件,保留你想要的部分,删除标记。 解决完后,标记文件为已解决:“git add ",然后提交:“git commit -m ‘解决冲突’

  • 实用技巧 查看合并状态:用 git status 检查当前是否在合并过程中。 中止合并:如果合并出了问题,想放弃,可以用:

git merge –abort

  • 指定合并策略:默认情况下 Git 会自动选择合并方式,但你可以用选项调整,比如强制非快进合并:

git merge –no-ff feature

|git pull|merge| git 多人协作的时候怎么解决冲突?

使用git-pull 然后git-commit 最后git-push

如果有冲突可以看get merge使用

alt text

|公式 | github | github不显示md文件中的公式

第一种方法:使用github推荐的公式写法(推荐) 在写md的时候,使用

$`  和  `$  

来包围行内公式

```math  
	```

来包围单行公式,如下

alt text

第二种方法: 插件

但是还是会有一部分显示不正确 alt text

解决方法:安装插件:https://chrome.google.com/webstore/detail/mathjax-plugin-for-github/ioemnmodlmafdkllaclgeombjnmnbima/related 插件名

git 使用ssh密钥登录github

注意一个密钥只能登录一个github,如果你想要在新的github账户上面添加旧的ssh密钥,就会报错 准备工作:本地先下载安装好git,注册并登陆github账号 在注册好后的github账号中先创建一个仓库 在本地git创建SSH key 第一步:设置全局的用户名和邮箱(这样主要是不用总是重填)

git config --global user.name '用户名' // 切换到你的github用户名上
git config --global user.email 'github账号注册用的邮箱'

第二步:生成密钥,有可能提示没有这个库,需要安装一下,去搜索一下

ssh-keygen -t rsa -C "你的邮箱地址"

第三步:查看自己本地的密钥,执行以下命令

ls -al ~/.ssh // 查看本机是否有秘钥文件 没有秘钥文件生成秘钥文件
cd ~/.ssh
ls  // 查看 .ssh 中有什么文件
cat id_rsa.pub // 查看本地的公钥
cat id_rsa // 查看本地的私钥
(如果是windows系统可以直接到C盘的对应用户名文件夹下的.ssh文件夹中查看

第四步:将公钥复制粘贴到github上

github上点击头像,点击Settings,进入后点击 SSH and GPS keys,接着点击 New SSH key 将公钥粘贴在key输入框那里,Title则随便输入可以就行

github ssh

git 使用token登录github 并拉取项目 (如果电脑上已经登录过了,需要把账户信息清除掉。如果是用ssh密钥登录的也不行,清除token账户信息请看下面“清除电脑上已经登录的github账户信息”)

图1 打开设置图2 开发者设置图3 点击Token
图4 生成classic Token图5 设置命名和权限

最后一步: 在新设备上pull或者push的时候,会让你登录,有两种方式,一种是账号密码,另一种就算token,选择token,然后粘贴上一步生成的token就可以了

github 要求2FA认证

今天上线的时候突然发现,github要求我设置2FA认证,不然就不能登录,手机号我必然是没有的,只能用安全密钥控制 具体的github说明在这里:https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa/configuring-two-factor-authentication

一句话说,就是需要用TOPT密钥管理工具生成动态密码,然后输入动态密码登录,然后第一次登录会给你一个github-recovery-codes.txt,如果更换设备需要使用这个恢复码登录新设备,然后登录新设备之后也是会给你一个新的恢复码

如果是第一次登录,看到github要求进行2FA,可以安装如下 chrome插件:Github 2FA(去chrome商店搜索)

Github 2FA应用图标

然后你回到github页面刷新,在上面图片红框的那个位置就会出现一个30s的密码,输入就可以确认,确认好之后会让你下周恢复密钥,记得下载保存

github 清除电脑上已经登录的github账户信息

step1: 进入控制面板点击用户账户

控制面板-用户账户

step2:管理windows凭证

windows凭证

step3:删除github相关的凭证

删除github凭证

git clone 出现以下问题:fatal: unable to access XXX: gnutls_handshake() failed: The TLS connection was non-properly terminated.

git clone 出现以下问题:fatal: unable to access 'https://github.com/QwenLM/Qwen.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.

可以参考stack overflow里面的Stack 我是执行下面两行代码解决(ubuntu系统)

apt-get update
apt-get install curl

[git push] ssh: connect to host github.com port 22: Connection timed out fatal: Could not....

最有可能是防火墙问题,可以参考github官方的解决方法 用443端口解决 https://docs.github.com/en/authentication/troubleshooting-ssh/using-ssh-over-the-https-port

第一步,用以下代码测试443端口是否可用

ssh -T -p 443 git@ssh.github.com

如果出现这样就是可用的,那么恭喜,十拿九稳了! 在这里插入图片描述 用如下ssh地址替代原来的

git clone ssh://git@ssh.github.com:443/YOUR-USERNAME/YOUR-REPOSITORY.git

注意是替代,直接用原来的地址加端口是不行的。 在这里插入图片描述

拿下!

远程分支是v3版本,本地的v2版本,但是本地修改了文件还没有add也没有commit,应该怎么更新本地?

1. 第一步:首先保存你的本地修改:

git stash

这会将你当前的修改暂时保存起来

2. 第二步:拉取远程更新

git fetch origin

3. 第三步:更新本地分支到远程版本

git merge FETCH_HEAD

4. 第四步,恢复你之前的本地修改

cpp git stash pop

5. 如果在恢复 stash 时遇到冲突,你需要手动解决这些冲突。解决完冲突后,你可以:

添加解决冲突后的文件 git add .

提交你的修改 git commit -m “your commit message”

提示:

如果你想在应用 stash 前查看保存了什么内容,可以用 git stash list 查看 stash 列表 如果你想查看具体改动,可以用 git stash show -p 如果合并时遇到问题,随时可以用 git status 查看当前状态 如果想放弃当前操作回到起点,可以用 git reset –hard HEAD(注意这会丢失未提交的修改)

用git hooks解决github大文件报错,100M限制或50M限制|大文件|50M|git hooks|git

见:zata csdn

如果你已经commit了大文件,并且报错了,可以

# 1. 把大文件取消追踪
git rm --cached "path/to/large/file"   # 引号括起来的是大文件地址
# 2. 把大文件加入.gitignore
echo "path/to/large/file" >> .gitignore
# 3. 更改提交  (当然不commit直接git push  XXX 也是可以的)
git add .gitignore
git commit -m "Update .gitignore to exclude large files"
git push XXX main:main --force

如果上面不起作用,可以使用以下方法

# 1. 撤销最近的提交,但保留更改
git reset --soft HEAD~1
# 如果大文件在更早的提交(比如倒数第二次),用 HEAD~2 或具体哈希:
# git reset --soft abc123^  # abc123 是包含大文件的提交

# 2. 移除大文件
git rm --cached "大文件名"

# 3.重新提交
git commit -m "Remove large file XXX"

# 4. 强制推送
git push XXX main:main --force

我写了一个git hooks 文件,在commit大于设定size的文件的时候,拦截commit,并且把大文件名写入.gitignore ,同时从缓存区中移除大文件 进行版本控制的时候,经常会由于大文件导致上传github出问题,并且版本回退也比较麻烦。 实际上我们很少代码文件会超过50M,而往往是由于数据文件过大导致错误,这些数据文件往往我们可能都不需要进行版本控制 于是,不如直接通过脚本,默认不对这些大文件进行版本控制

代码 (文件名设置为pre-commit,防在.git/hooks目录下,注意文件名要一致,这涉及到git hooks的逻辑,不做过多解释)

#!/bin/python
import subprocess
import os


if __name__ == "__main__":
    files = subprocess.check_output(['git', 'diff', '--cached', '--name-status'], text=True, encoding='utf-8').split('\n')
    for file in files:
        if len(file.split("\t")[0]) > 0 and file.split("\t")[0] != 'D':
            file_path = file.split("\t")[-1]
            file_size = os.path.getsize(file_path)
            size_in_mb = file_size / (1024 * 1024)
            if size_in_mb >= 50:
                with open('.gitignore', 'a', encoding='utf-8') as f:
                    f.write(file_path + '\n')
                try:
                    # Remove the file from the Git index (staged area)
                    subprocess.check_output(['git', 'rm', '--cached', file_path])
                    print("Removed {} from stage".format(file_path))
                except subprocess.CalledProcessError as e:
                    print("Error removing file from stage: {}".format(e))
                
                try:
                    # Reset the file to unstage changes
                    subprocess.check_output(['git', 'reset', file_path])
                except subprocess.CalledProcessError as e:
                    print("Error while resetting file: {}".format(e))

                print("The file is larger than 50MB and has been added to .gitignore. Please confirm and recommit!")
                print(file_path + "\n")
                exit(1)

演示

下面可以配置全局Git 钩子

LINUX平台

# 创建全局 Git 钩子目录
mkdir -p ~/.git-template/hooks

# 创建并编辑 pre-commit 钩子脚本
cat > ~/.git-template/hooks/pre-commit << 'EOF'
#!/bin/bash
MAX_SIZE=$((50 * 1024 * 1024)) # 50MB in bytes

# 获取暂存区所有文件的列表
files=$(git diff --cached --name-only --diff-filter=ACM)

for file in $files; do
    # 检查文件是否存在
    if [ -f "$file" ]; then
        # 获取文件大小(字节)
        size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null)
        if [ "$size" -gt "$MAX_SIZE" ]; then
            echo "错误:文件 '$file' 超过 50MB(大小:$((size / 1024 / 1024))MB)"
            exit 1
        fi
    fi
done
exit 0
EOF

# 赋予执行权限
chmod +x ~/.git-template/hooks/pre-commit

# 配置 Git 使用全局钩子模板
git config --global init.templatedir ~/.git-template

# (可选)为现有仓库手动复制钩子(替换 /path/to/your/repo 为实际路径)
# cp ~/.git-template/hooks/pre-commit /path/to/your/repo/.git/hooks/pre-commit
# chmod +x /path/to/your/repo/.git/hooks/pre-commit

WINDOWS平台

需要 POWERSHELL 因为环境变量

# 创建全局 Git 钩子目录
$templateDir = "$env:USERPROFILE\.git-template\hooks"
New-Item -ItemType Directory -Force -Path $templateDir

# 创建 pre-commit 钩子脚本
$hookPath = "$templateDir\pre-commit"
Set-Content -Path $hookPath -Value @'
#!/bin/sh
MAX_SIZE=$((50 * 1024 * 1024)) # 50MB in bytes

# 获取暂存区所有文件的列表
files=$(git diff --cached --name-only --diff-filter=ACM)

for file in $files; do
    # 检查文件是否存在
    if [ -f "$file" ]; then
        # 获取文件大小(字节)
        size=$(wc -c < "$file")
        if [ "$size" -gt "$MAX_SIZE" ]; then
            echo "错误:文件 '$file' 超过 50MB(大小:$((size / 1024 / 1024))MB)"
            exit 1
        fi
    fi
done
exit 0
'@

# 赋予执行权限(Windows 下无需 chmod,但确保 Git Bash 支持)
# 配置 Git 使用全局钩子模板
git config --global init.templatedir "$env:USERPROFILE\.git-template"  # 如果你不用变量,那么就赋绝对路径

# (可选)为现有仓库手动复制钩子(将以下路径替换为实际仓库路径)
# $repoPath = "C:\path\to\your\repo"
# Copy-Item -Path $hookPath -Destination "$repoPath\.git\hooks\pre-commit"

也可以按照下面进行手动配置

  1. 首先创建一个文件夹,然后git init,可以手动将上面代码粘贴修改pre-commit文件

配置文件夹

  1. 配置全局钩子,需要绝对路径

配置全局

  1. 可以测试一下,原理就是git init的时候,把设置的这些配置复制一份

创建的新本地git仓库

测试大文件

云服务器无法访问Github导致git失败方案

可以先去这个网站,哪些ip可用

https://ping.chinaz.com/github.com

然后要修改服务器端的HOSTS

例如:

20.205.243.166 github.com
20.205.243.166 raw.githubusercontent.com

hosts位置在 /etc/hosts

使用 Hugo 构建
主题 StackJimmy 设计