虽然日常工作中经常使用git,但是在面对一些特殊情况时仍会捉襟见肘。在这里整理一些常见操作和常见问题。对于更详细的介绍,建议参考官方文档
简介
我们都知道,git是一个版本控制工具,而github、gitlab等则是基于git的代码托管平台。Git中比较常见的概念有仓库、暂存区、工作区、分支等。
安装和配置
- 安装
对于Ubuntu和Mac OS来说,可以通过简易的命令行来安装(apt
和brew
)。对于Windows来说,则需要手动下载安装,并通过Git Bash来交互,或者通过安装posh-git来实现在PowerShell中的集成。 - 配置
配置SSH-Key
通常为了避免每次执行与远端仓库的操作的时候都需要验证,通常需要配置SSH-Key,通过SSH的方式与远端仓库进行通信。作为一种非对称加密方式,SSH-Key成对出现。
首先需要使用如下命令生成钥匙对:
生成的钥匙对默认会存放在ssh-keygen -t rsa -C "username@xxx.com"
~/.ssh/id_rsa
和~/.ssh/id_rsa.pub
两个文件中,需要将~/.ssh/id_rsa.pub
(公钥)中的内容复制到Github或者Gitlab相应的位置。
配置Git参数
Git 自带一个git config
的工具来帮助设置控制 Git 外观和行为的配置变量。
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:$ git config --global user.name "John Doe" $ git config --global user.email johndoe@example.com
基本操作
-
git clone
:将存储库克隆到新的目录中。 -
git init
:创建一个空的Git存储库或重新初始化现有的存储库。 -
git add
:将当前变化存储至暂存区或者跟踪新的文件。 -
git reset
:回到某一提交。 -
git rm
:从工作树和索引中删除文件。 -
git log
:显示提交日志。 -
git status
:查看工作区的状态。 -
git branch
:列出,创建或删除分支。 -
git checkout
:切换分支。 -
git commit
:提交变化。 -
git diff
:显示提交和工作树之间的更改。 -
git rebase [COMMIT|BRANCH]
在另一个基本提示之上提交,创建、列出标签。 -
git fetch
:从另一个存储库下载对象和引用。 -
git pull
:从另一个存储库或者本地分支中获取远程引用与关联对象并更新。 -
git remote
:设置远端分支。(可以设置多个) -
git push origin --delete <remote-branch>
:删除远端分支。 -
git reset --hard
:回退到上一次commit时的状态。 -
git reset --soft
:回退到commit前的状态,保留暂存区文件的改动。 -
git checkout <file>
:让某一个文件回退到commit时的状态。
大文件存储(Git LFS)
在一些工程中,可能会需要对一些大文件进行版本控制,比如二进制文件。如果像代码那样使用git进行管理,会导致工程文件空间过于庞大(git会默认存储所有的版本)。Git LFS应运而生。LFS是Large File Storage大文件存储的缩写,Git LFS是针对大文件存储开发的工具。
Git LFS可以通过apt
安装。
sudo apt install git-lfs
在工程中,可以通过如下命令开启git lfs功能:
git lfs install
需要使用Git LFS存储的文件可以通过git lfs track
命令,或者通过修改.gitattribute
文件设置。比如:
git lfs track "*.iso"
.gitattributes
文件同样需要被git跟踪:
git add .gitattributes
被跟踪的大文件可以像git下的其他文件一样跟踪、提交和推送:
git add file.iso
git commit -m "Add disk image"
git push
常见问题
忽略文件/目录
如果想在工程内忽略特定文件或目录(比如build
目录),可以通过编辑.gitignore
文件实现。注意,已经被跟踪的文件将不会被忽略。
管理多个SSH-Key
当本地有多个SSH-Key的时候,需要配置~/.ssh/config文件来区分不同Host使用的key,比如:
# ~/.ssh/config
#github
Host github.com
IdentityFile ~/.ssh/id_rsa_github
User MyUserName
#gitlab
Host gitlab.com
IdentityFile ~/.ssh/id_rsa_gitlab
User MyUserName
ssh-agent
ssh-agent是linux 系统上的一个程序,这个程序可以控制和保存公钥身份验证所使用的私钥程序。可以帮助我们管理ssh的密码。
启动方式如下:
eval `ssh-agent`
添加新的ssh-key:
ssh-add ~/.ssh/id_rsa
当 ssh-add 把私钥交给 ssh-agent 来管理时,其他程序需要身份验证的时候都可以申请交给 ssh-agent 来完成整个认证过程。(参考)
config优先级
git config
命令配置的变量存储在三个不同的位置:
-
/etc/gitconfig
文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。 -
~/.gitconfig
或~/.config/git/config
文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。 - 当前使用仓库的 Git 目录中的 config 文件(就是
.git/config
):针对该仓库。
每一个级别覆盖上一级别的配置,所以.git/config
的配置变量会覆盖/etc/gitconfig
中的配置变量。
更改commit的作者信息
git commit --amend --reset-author
ssh相关:
ssh使用非对称加密。类似于github等平台,我们可以设置让本地与另一台电脑或服务器的ssh连接免密码:在对方电脑~/.ssh/
目录下添加authorized_keys
文件,里面输入本机的公钥。