Git使用详解

基础知识

裸仓库和工作区

特性 裸仓库(Bare) 工作区(Working Directory)
目录结构 只有 .git 目录内容,无工作文件 包含工作文件和隐藏的 .git 目录
文件可编辑性 ❌ 无法直接编辑文件 ✅ 可直接编辑、修改文件
主要操作 仅支持 pushpull 等远程操作 支持完整 Git 命令(addcommit 等)
命名约定 通常以 .git 结尾(如 repo.git 普通目录名(如 my-project
典型位置 服务器(如 GitHub、自建 Git 服务器) 开发人员本地电脑

两者通常配合使用:开发人员在本地工作区修改代码,然后推送到远程裸仓库;其他成员从裸仓库拉取更新到自己的工作区。

git 配置 ssh

1、设置姓名和邮箱

# 注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
git config --global user.name  "test"               # 配置全局用户名
git config --global user.email  "test@gmali.com"    # 配置全局邮箱
git config --list   # 查看配置信息

查看 git 配置信息:git config --list 注意:如果姓名、邮箱配置错了,在重复一遍命令就行了。

单仓库配置:如果某个仓库需要单独配置用户信息(如公司项目和个人项目分离),可以进入仓库目录后执行 git config user.name "xxx"(不加 --global)。

2、配置 ssh

cd ~/.ssh  
ls                # 看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key  
ssh-keygen -t rsa -C "xxx@xxx.com"     # 执行后一直回车即可
ssh-keygen -t rsa -C "xxx@xxx.com" -f ~/.ssh/id_rsa_tencent  
cat id_rsa.pub    #  复制其内容

打开 github—设置—ssh and GPG keys—创建一个新的 ssh key—把复制的内容粘贴进去

ssh -T git@github.com  # 测试SSH连接是否成功
Hi bluefoxqaq! You've successfully authenticated, but GitHub does not provide shell access.

注意:ssh-keygen -t rsa -C "xxx@xxx.com" 这里的邮箱仅作为密钥对的注释(comment),用于标识密钥的归属(例如用户或设备)。他不需要和 git 配置的全局邮箱一致

token 使用

将 token 保存到系统钥匙串

Mac(通过 osxkeychain):首次输入 Token 后,凭证会加密保存到 macOS 钥匙串。

git config --global credential.helper osxkeychain

Windows(通过 manager-core):

git config --global credential.helper manager-core

初始化仓库

git init  # 初始化当前目录
git init <directory>  # 指定目录初始化
git status  # 查看工作目录和暂存区的状态

git init --bare /git/blog.git # 创建裸仓库
# --bare 参数表明创建的是一个不包含工作目录的裸仓库,这是用于远程协作的标准仓库格式。

注意:当创建新的 Git 仓库时,系统默认使用 master 作为初始分支名称,但由于开源社区规范变化(如 GitHub 等平台已默认使用 main),会出现分支名称可能更改的警告提示。

解决:全局配置初始分支名称为 main git config --global init.defaultBranch main

我常用的 git 命令

# 1、创建本地仓库
git init  # 初始化当前目录
git init <directory>  # 指定目录初始化
git status  # 查看工作目录和暂存区的状态
# --bare 参数表明创建的是一个不包含工作目录的裸仓库,这是用于远程协作的标准仓库格式。
git init --bare /git/blog.git 

# 2、添加文件到暂存区
git add <文件名> # 添加指定文件
git add .       # 添加所有更改
git add *.txt   # 添加所有txt文件

# 3、提交更改
git commit -m "提交信息"

# 4、连接远程仓库
git remote add origin https://github.com/用户名/仓库名.git  # origin:远程仓库的别名(通常使用origin)
git remote add origin git@github.com:username/repo.git    # 使用ssh方式
git remote -v  # 查看远程仓库

# 5、推送代码到GitHub仓库
git push -u origin main  # 首次推送。-u:设置上游分支,以后可以直接使用git push
git push                 # 后续推送(无参数,因为首次推送已设置上游分支)

git config --list
git branch        # 查看本地分支。当前分支前面显示 * 
git fetch origin  # 先同步远程最新信息
git ls-remote --heads origin  # 查看远程分支
git branch -a     # 输出所有分支(本地+远程)
git branch --show-current  # 查看当前所在分支的名字

git branch -m master main      # 重名名分支。将本地master分支改为main
git branch -d localBranchName  # 删除本地分支
git push origin --delete remoteBranchName  # 删除远程分支

git branch -vv   # 显示本地分支对应的远程分支。如果未显示远程分支,说明该本地分支未设置跟踪(需手动关联)
git branch -u origin/main main  # 将本地 main 分支关联到 origin/main
# 查看提交历史
git log
git log --oneline  # 简洁显示
git log --graph    # 图形化显示分支
git remote rm origin #  删除之前的远程仓库  
git remote add origin  SSH(注意此ssh是你的ssh地址)# 重新添加远程版本库  
git push -u origin master  
​  
git config --global core.autocrlf true  
git push -u origin master -f  # 强制push上去,会覆盖远程仓库,慎用。  

git 强制覆盖命令, 从远程仓库拉取并强制覆盖本地代码

git fetch --all  
git reset --hard origin/main  
git pull

git 命令整理

git remote

git remote -v   # 显示所有远程仓库
git remote rm name  # 删除远程仓库,name 是远程仓库名,一般是 origin
git remote rename old_name new_name  # 修改仓库名

git push

git push <远程主机名> <本地分支名>:<远程分支名>

如果本地分支名与远程分支名相同,则可以省略冒号:

git push <远程主机名> <本地分支名>

git push origin master # 将本地的 master 分支推送到 origin 主机的 master 分支。  
git push origin master:master # 效果同上

如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 或者-f 参数:

git push --force origin master # 强制push上去,会覆盖远程仓库,慎用。  
git push -u origin master -f  # -u 选项指定一个默认主机,这样后面就可以不加任何参数使用git push。

git push --set-upstream origin master  # origin 是默认的远程版本库名称

# 将远程仓库URL更改为SSH格式
git remote set-url origin git@github.com:username/repository.git

git pull

问题

push 失败

Updates were rejected because the remote contains work that you do

hint: not have locally. This is usually caused by another repository pushing

hint: to the same ref. You may want to first integrate the remote changes

hint: (e.g., 'git pull ...') before pushing again.

hint: See the 'Note about fast-forwards' in 'git push --help' for details.

原因:本地仓库与远程仓库不一致

参考链接: https://blog.csdn.net/weixin_44713763/article/details/104640842

git push -u origin master -f  # 强制 push 上去,会覆盖远程仓库,慎用。

git 换行符错误

LF will be replaced by CRLF the next time Git touches it

进行 git 设置:git config --global core. autocrlf true

参考: https://blog.csdn.net/Babylonxun/article/details/126598477

子仓库问题

直接删除子仓库里的 . git 文件

git 基本使用

1、git 使用前的配置

git config --global user. name  提交人姓名
git config --global user. email  提交人邮箱

查看 git 配置信息:git config --list

注意:如果姓名、邮箱配置错了,在重复一遍命令就行了。

2、git 提交文件到仓库

git init:初始化仓库。会出现一个. git 的隐藏文件夹。这个文件很重要

git status:查看文件状态。红色表示这个文件被修改还没有提交或者表示这是个新增的文件还没有提交,绿色表示文件已经被提交到暂存区了。没有表示文件已提交到仓库。

git add 文件:将文件提交到暂存区。

git commit -m 提交信息:把暂存区的文件提交到仓库

git log:查看提交记录

例如:初始化一个文件夹作为仓库,在里面新建一个文件,并提交。

3、git 版本回退

分几次修改 text. txt 文件内容并分次提交到仓库。查看提交历史

查看当前 text. txt 内容

现在我想使用版本回退操作,我想把当前的版本回退到上一个版本,要使用什么命令呢?可以使用如下 2 种命令。第一种是:git reset --hard HEAD^ 那么如果要回退到上上个版本只需把 HEAD^ 改成 HEAD^^ 以此类推。

但是如果要回退到前 100 个版本的话,使用上面的方法肯定不方便,我们可以使用下面的简便命令操作:git reset --hard HEAD~100 即可。

再次查看提交历史,会发现对 text. txt 文件添加了一行 222222 内容我们没有看到了。

但是如果现在我想回退到最新的版本,如:有 22222 的内容要如何恢复呢?我们可以通过版本号回退,使用命令方法如下:

git reset --hard 版本号

但是现在的问题假如我已经关掉过一次命令行或者增加 2222 内容的版本号我并不知道呢?可以通过如下命令即可获取到版本号:

git reflog

操作如图:

4、远程仓库

首先在 github 创建一个仓库,然后将其与本地仓库关联起来。输入命令:

git remote add origin https://github.com/BluefoxQAQ/gittt.git  # 建议使用 ssh

git push -u origin master # 把本地库的内容推送到远程,使用 git push 命令,实际上是把当前分支 master 推送到远程。需要输入 github 的用户名和密码。

由于远程库是空的,我们第一次推送 master 分支时,加上了 –u 参数,Git 不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后,可以立刻在 github 页面中看到远程库的内容已经和本地一模一样了,如下所示:

从现在起,只要本地作了提交,就可以通过命令:git push origin master,把本地 master 分支的最新修改推送到 github 上了。

搭建 git 服务器

准备一台服务器

apt install git # 安装git
adduser git  # 创建一个git用户
mkdir /git   # 创建一个目录,存放仓库数据。这里是在根目录下创建
chown -R git:git /git  # 更改所属的用户和用户组为git用户
# 其他可选操作
# 将域名 git.lanhuli.top 解析到此服务器上

1)备份/镜像其他 git 仓库

# 切换git用户
su git
# 创建裸仓库,保留全部信息
git clone --mirror https://github.com/vulhub/vulhub.git
# 创建精简裸仓库(保留最新状态)
git clone --depth 1 --bare https://github.com/vulhub/vulhub.git vulhub-light.git
# 更新方法
cd vulhub-light.git
git fetch --depth 1

2)备份使用

创建空的裸仓库

# 切换为 git用户
su git
# 全局设置:初始化 Git 仓库时直接指定初始分支为 main(而非默认的 master)
git config --global init.defaultBranch main
# 创建一个裸仓库,后缀为 .git
git init --bare /git/blog.git

本地 PC

# 如果已经有git项目,直接将远程服务器的仓库关联起来
git remote add tengxun git@git.lanhuli.top:/git/blog.git
# 将本地项目推送到远程 git 服务器
git push tengxun main

另一台 PC

# 拉取项目
git clone git@git.lanhuli.top:/git/blog.git
# 推送

3)⚠️注意事项

  1. git@git.lanhuli.top:/git/blog.git 中,/git/blog.git 是服务器目录的绝对路径,如果路径不对或者不存在会报错
  2. 仓库分支名称问题:master 已经过时,推荐使用 main,如果有告警,需要将分支名称从 master 该改为 main,否则项目无法正常 pull。

使用 Gitea 搭建

创建目录

mkdir data config
chown 1000:1000 data config    # 必须修改,否则报错

rooless 版本的镜像默认使用 UID/GID 1000:1000 作为程序运行的用户组,为了保证 gitea 程序挂载权限正确的数据目录,我们在前面的步骤中预先创建了 data 和 config 目录。

version: "2"

services:
  server:
    image: docker.gitea.com/gitea:1.24.3-rootless
    restart: always
    volumes:
      - ./data:/var/lib/gitea
      - ./config:/etc/gitea
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2222:2222"

禁止用户注册

找到 app.ini 配置文件,修改 service 条目下 DISABLE_REGISTRATION 为 true,意思为禁用注册,之后只有管理员可以为用户创建帐户。

[service]
DISABLE_REGISTRATION = true  # 禁用注册
REQUIRE_SIGNIN_VIEW = true   # 仅允许已登录的用户查看探索页面

[openid]
ENABLE_OPENID_SIGNIN = false # 禁用openid登录
ENABLE_OPENID_SIGNUP = false # 禁用openid注册

其他配置选项:

  • REQUIRE_SIGNIN_VIEW: false: 仅允许已登录的用户查看探索页面。
  • DISABLE_USERS_PAGE: false: 禁用用户探索页面。
  • DISABLE_ORGANIZATIONS_PAGE: false: 禁用组织探索页面。
  • DISABLE_CODE_PAGE: false: 禁用代码探索页面。
  • SHOW_MILESTONES_DASHBOARD_PAGE: true 启用此项以显示里程碑仪表板页面 - 查看所有用户的里程碑

备份 Gitea 数据

使用 docker 搭建的话直接备份整个数据目录即可

可以使用 rsync 将服务器的数据备份到本地文件夹

rsync -a root@8.140.21.107:/git/ /srv/share/gitea
# 需要配置ssh免密登录
# /git/ :服务器上Gitea的数据目录,包含配置等
# /srv/share/gitea :本地的备份目录
# 可以将命令写入定时任务,自动运行

ignore 文件

git add . 命令执行之前创建 .gitignore 文件,因为 add 命令会开始跟踪当前目录下所有未被忽略的文件,在创建 .gitignore 就没有效果了。

如果晚了怎么办,补救措施:

# 向 .gitignore 文件添加内容
node_modules/

# 使用 git rm --cached 命令来让 Git 停止跟踪这个目录,但保留本地文件
git rm -r --cached node_modules

# 提交你的 .gitignore 文件和这次“移除跟踪”的操作
git add .gitignore
git commit -m "Add .gitignore and stop tracking node_modules"


git 常用方式

1、创建项目目录
crypto ejs fs-extra highlight.js klaw markdown-it markdown-it-anchor slugify
2、初始化
git init  # 初始化当前目录
git init <directory>  # 指定目录初始化

3、创建 .gitignore  文件

4、提交代码
git add .
git commit -m "hello"

5、关联远程仓库
git remote add origin https://xxxxxx/Hello-Java-Sec.git
git remote -v  # 验证关联

6、推送到远程仓库
# 您的本地主要分支是 main(如果您的分支是 master,请将 main 替换为 master)
git push -u origin main

# 后续推送可以简写
git push