Contents

Git

摘要 简单使用git

关键词 git, git lfs

  • Git:适合管理文本文件和小型二进制文件,但对于大文件(如图片、视频、数据集等),Git 的效率较低,因为每次更改都会存储整个文件的副本。
  • Git LFS:通过将大文件存储在远程服务器上,并在 Git 仓库中仅保存指向这些文件的指针,从而减少仓库的大小和历史记录的负担。

1. Git 基础

起步

基础设置

# 无论何时初始化一个新的仓库,默认分支的名称都应该是 master
git config --global init.defaultBranch master

# 查看配置
git config --list

# 设置用户名和邮箱
git config --global user.name <user_name>
git config --global user.email <user_email>

# 取消配置
git config --global --unset xx

# 初始化仓库,并设置初始化分支为master
git init --initial-branch=master。

# 添加远程仓库地址
git remote add origin <link>

# 显示当前远程仓库链接
git remote -v

# 更改远程仓库地址,比如更改为 git@xxx
git remote set-url origin <link>

.gitignore

配置忽略项目

.vscode

# 忽略工作目录下的pkg目录
/pkg

# 慎用!忽略所有目录下的log目录
log

git 基础操作

基础操作

# 克隆仓库
git clone <link>

# 将工作空间的代码添加到缓冲区
git add .

# 将缓冲区的代码推送到本地仓库
git commit -am "init commit"
# 这时,如果想修改commit信息,可以
git commit --amend -m "新的提交信息"

# 将本底仓库的master分支推送到远程仓库的master分治
git push origin master:master

# 查看当前状态
git status

# 查看历史
git log
# --oneline:列表格式。
# --graph:以 ASCII 图形显示分支与合并历史。
# --stat:在每个提交后面显示修改的文件和修改的行的统计信息

# 当前分支对比 origin/dev 分支,只对比 src 文件夹,并排除 src/vendor, src/codec 文件夹
git diff origin/dev -- src ":(exclude)src/vendor" ":(exclude)src/codec"

git branch

分支操作

# 查看本地分支
git branch

# 获取远程仓库的信息
git fetch origin
# 查看远程分支
git branch -r

# 删除分支
git branch -d 分支名

# 删除远程仓库的分支
git push origin :分支名

# 切换分支
git checkout 分支名

# 创建并切换到新分支
git checkout -b 新分支名

# 切换到远程的 dev 分支
git checkout -b dev origin/dev

# 将远程 dev 分支的最新代码拉取到本地 dev 分支
git pull origin dev:dev
# 相当于
git fetch origin dev
git merge origin/dev

# 将远程 dev 分支直接覆盖本地 dev 分支
git reset --hard origin/dev

# 将当前分支重命名为main
git branch -m main

# --orphan 的作用一个是拷贝当前所在分支的所有文件
# 另一个是使新分支没有父结点,即没有历史记录,是一个完全独立背景干净的分支
git checkout --orphan new-branch

git tag

标签操作

# 创建标签并附带注释
git tag -s v1.0 -m "Release version 1.0"

# 获取远程分支信息
git fetch origin --tags

# 查看远程仓库的标签
git ls-remote --tags origin

# 切换到远程的 v1.0.0 tag
git checkout -b v1.0.0 tags/v1.0.0

2. Git 进阶

Git restore 回滚文件

# 撤销对工作目录中的修改,不影响暂存区
git restore test.txt

Git reset 回滚操作

# 保留工作区和缓存区,仅撤销 git commit, 文件的状态从“已提交”变为“已暂存”
git reset --soft HEAD~1

# (默认 --mixed)保留工作区,撤销 git add 和 git commit, 文件的状态从“已提交”变为“未暂存”
git reset HEAD~1

# 全部恢复到上一版本,什么都不保存
git reset --hard HEAD~1

HEAD:表示当前分支的最新提交。
HEAD~1:表示当前分支的倒数第2次提交。
HEAD~2:表示当前分支的倒数第3次提交。
HEAD~3:表示当前分支的倒数第4次提交。

Git stash

临时保存修改,以便切换分支

用于临时保存当前工作目录的更改,以便你可以切换到其他分支或进行其他操作,而不会丢失未提交的更改
# 将所有未提交的更改保存到一个栈中,并将工作目录恢复到最近一次提交的状态
git stash

# 查看 stash 列表
git stash list

# 应用最近一次保存的 stash
git stash apply
git stash apply stash@{n} # 应用特定的 stash

# 应用并删除最近一次保存的 stash
git stash pop
git stash pop stash@{n}

# 删除 stash
git stash drop
git stash drop stash@{n}
git stash clear # 清空

# 查看 stash 详细信息
git stash show stash@{0}

Git merge 合并

将变更合并进来,生成新的提交

# 处在 master 分支,把dev分支的内容合并进来
git merge dev

### 遇到合并冲突 ### 
# 标记已处理完冲突
git add .
git commit -am "merged dev"
# 取消合并
git merge --abort

Git rebase 变基

将变更内容重放

# 交互
git rebase -i [commitid]
git push -f origin master:master

# 处于 dev 分支
git rebase master
1. 找到 master 和 dev 的一个共同祖先。
2. 将 dev 相对于共同祖先的修改在 master 上进行重演。
3. 解决冲突:git add . 
4. 然后 git rebase --continue。

# 取消
git rebase --abort

# 将本地的修改在新的 master 上进行重演
git pull --rebase origin master
# 相当于
git fetch origin master
git rebase master

Git cherry-pick

将某个特定的提交(commit)从一个分支应用到当前分支上

git cherry-pick <commit-hash>

3. Git lfs

大文件操作

apt install git-lfs

git lfs track "*.mp4" # 跟踪
git lfs track # 查看当前跟踪的大文件

git add .gitattributes # 跟踪规则会保存在 .gitattributes 文件中
git commit -m "Track *.mp4 files with Git LFS"

# 后续可以像普通文件一样提交大文件了

git clone # 不会拉取大文件
git lfs ls-files # 查看跟踪了哪些大文件
git lfs install # 初始化 Git LFS
git lfs pull # 拉取大文件
git lfs pull --include="path/to/file" # 拉取指定大文件