Git¶
远程仓库和本地仓库名字的区别:
origin 远程库名
main 本地分支名
origin/main 远程库中的远程分支
Git¶
Setup¶
sudo apt install git
配置¶
每个仓库的 Git 配置文件都放在当前目录下的 .git/config
文件中。
/etc/gitconfig 文件
:系统中对所有用户都普遍适用的配置。若使用git config
时用--system
选项,读写的就是这个文件。~/.gitconfig 文件
:用户目录下的配置文件只适用于该用户。若使用git config
时用--global
选项,读写的就是这个文件。当前文件夹/.git/config 文件
: 这里的配置仅仅针对当前项目有效。使用git config
# 查看当前配置信息
git config --list
git config --global --list
# 修改用户信息
git config --global user.email "zhaisilong@outlook.com"
git config --global user.name "zhaisilong"
# 添加 GPG 密钥 要先上传公钥
#E GPG 用于签名验证 注释
git config --global user.signingkey D482B92E13D3FCBA
# 自动验证签名 自动加上 -S
git config --global commit.gpgsign true
# 文本编辑器
git config --global core.editor emacs
# 差异分析工具
git config --global merge.tool vimdiff
# 开启界面颜色
git config --global color.ui true
配置自动换基¶
自动换基,保持开发线的整洁。
git config --global pull.rebase true
git config --global rebase.autoStash true
配置 ssh key¶
配置文件的编辑¶
vim ~/.ssh/config
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/git.rsa
# gitee
Host gitee.com
HostiName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/git.rsa
常用命令¶
# 初始化仓库
git init
# 增加文件
git add [file1] [file2]
# 增加所有文件
git add -A
# 提交到本地仓库 并附加说明
# `-m`后面输入的是本次提交的说明
git commit -m "wrote a readme file"
# 签名验证,需要配置 gpg
git commit -S -m "..."
# -M, --move --force:
git branch -M main #重命名分支名
# 列出所有分支
git branch -a
# 查看远程库的信息
git remote -v
# 添加远程库
## 可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
git remote add {{remote_name}} {{remote_url}}
git remote add origin https://github.com/xxzhai123/PbootCMS.git
git remote remove {{remote_name}}
git remote rename {{old_name}} {{new_name}}
# 将本地库推到远程
## 当只有一个分支名时,简写成git push
git push {{remote_name}} {{local_branch}}
# 指定远程分支名将本地库上传
git push {{remote_name}} -u {{remote_branch}}
# 删除远程库中的一个分支
git push {{remote_name}} --delete {{remote_branch}}
# 拉取远程仓库
git fetch # 拉取
git merge # 合并
git pull # 拉取并合并
git pull origin master # 指定远程库的分支拉取
# 查看状态
git status
git diff # 命令查看文件是如何被修改
git log # 查看合并日志,以及 Head 信息
git log --oneline --decorate --graph
删除远程仓库的文件¶
git rm -r -n --cached data/
git rm -n --cached data/
git commit -m "delete"
git push
大容量¶
git config --global http.postBuffer 524288000
分支的创建与合并¶
注意 iss53
从未出现在远端
git checkout -b iss53 # 在当前分支,创建新分支
# 等价于下面两条
git branch iss53
git checkout iss53
# 然后修复 bug
# 修复好回到 main
git checkout main
git merge iss53
# 最后删除 iss53
git branch -d iss53
如果不允许不想干分支合并请用
git merge iss53 --allow-unrelated-histories
如何更换 git 的远程库¶
ssh 地址:git@github.com:zhaisilong/software.git
https 地址:https://github.com/zhaisilong/software
git remote set-url origin <ssh地址> | <https地址>
配置命令别名¶
# 告诉Git,以后st就表示status:
$ git config --global alias.st status
忽略特殊文件¶
不需要从头写.gitignore
文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
.gitignore
文件的格式规范如下:
#
注释不允许行内注释
可以使用标准的 glob 模式匹配
!
开头表示不忽略/
开头表示根目录,/
结尾表示目录/*.js
可以匹配app.js
,但无法匹配js/app.js
。**
表示匹配零到多级目录
子模块¶
子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。默认情况下,子模块会将子项目放到一个与仓库同名的目录中。
创建名为 .gitmodules
的文件。该配置文件保存了项目 URL 与已经拉取的本地目录之间的映射
git submodule add
克隆带有子模块的仓库¶
正常 clone 包含子模块的函数之后,由于.submodule 文件的存在 someSubmodule 已经自动生成。但是里面是空的。还需要执行 2 个命令。
# clone 父仓库的时候加上 --recursive,会自动初始化并更新仓库中的每一个子模块
git clone --recursive https://github.com/chaconinc/MainProject
# 或者分步拉取
## 用来初始化本地配置文件
git submodule init
## 从该项目中抓取所有数据并检出父项目中列出的合适的提交(指定的提交)。
git submodule update
# 更新子模块
## Git 将会进入子模块然后抓取并更新,默认更新 master 分支
git submodule update --remote
标签管理¶
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。
git tag # 查看标签信息
git tag -a v1.0
git tag -a v0.9 85fc7e7 # 追加标签,忘记了的话
git log --oneline --decorate --graph
# 指定标签信息
git tag -a v1.0 -m "runoob.com标签"
# 用 gpg 指定标签信息
Gitee¶
使用 GitHub 时,国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况(原因你懂的)。
如果我们希望体验 Git 飞一般的速度,可以使用国内的 Git 托管服务——Gitee
git-lfs¶
# 安装
sudo apt-get install git-lfs
# 关联 git,这一步的目的是改变 git 的全局配置,查看 .gitconfig 文件
git lfs install
用 LFS 追踪的文件,这一步的目的是下面的文件变成 LFS 文件,支持通配符。操作完成后会生成或更新 .gitattributes 配置文件
git lfs track "*.sql"
git lfs untrack "文档.doc"
git lfs ls-files
git add .gitattributes
git commit -m "add .gitattributes"