安装
Windows
此处下载 双击exe 一直下一步安装
Linux
Linux 默认安装的Git 版本一般为1.8*, 可以通过以下方式升级
- 首先,把老版本的 Git 卸掉。
|
|
- 添加 End Point 到 CentOS 7 仓库
yum -y install https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo.x86_64.rpm
yum -y install git
- check version
git version
- 配置Git
- Set your name.
git config --global user.name "Your Name"
- Set your email address.
git config --global user.email "user@exmample.com"
- Verify the settings.
git config --list
Git 配置SSH key 连接Github
HTTPS URL 和 SSH URL
在使用 git clone 项目时,可以使用仓库的 HTTPS URL 也可以 使用 SSH URL
HTTPS URL,例如:https://github.com/<username>/<repo name>.git
SSH URL,例如:git@github.com:<username>/<repo name>.git
这两种方式的主要区别在于:使用 HTTPS URL 克隆时,每次 fetch 和 push 代码都需要输入账号和密码(可以通过下面缓存的方式避免),而使用 SSH URL 在配置好 SSH Key 后,每次 fetch 和 push 代码都不需要输入账号和密码。
初次运行 Git 前的配置
Git 环境变量
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。而正是由这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
/etc/gitconfig
文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 –system 选项,读写的就是这个文件。~/.gitconfig
文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 –global 选项,读写的就是这个文件。- 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量
配置用户信息
初次运行 Git 前需要配置用户信息,一个是你个人的用户名称,一个是你的电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录:
|
|
如果用了 –global 选项,那么更改的配置文件就是位于你用户主目录下的 ~/.gitconfig 文件,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者邮箱,只要去掉 –global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
查看配置信息
要检查已有的配置信息,可以使用 git config –list 命令:
|
|
有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig ),不过最终 Git 实际采用的是最后一个。
也可以直接查阅某个环境变量的设定,只要把特定的环境变量名称跟在后面即可,例如:
git config user.name
检查是否已有 SSH Key
看是否存在 id_rsa 和 id_rsa.pub 文件(或者是其它文件名),如果存在说明已有 ssh key,可以直接跳过生成密钥,其中 id_rsa 为私钥,id_rsa.pub 为公钥。
ls ~/.ssh/
生成 SSH key
ssh-keygen -t rsa -C "reid@example.com"
-t
: 指定密钥类型,默认是rsa,可以省略
-C
: 设置注释文字,比如邮箱
-f
: 指定密钥文件存储文件名
以上代码省略了 -f 参数,因此在运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的 SSH key,例如:
|
|
当然,你也可以不输入文件名,直接回车使用默认文件名(推荐),那么就会生成 id_rsa 和 id_rsa.pub 两个密钥文件。后续的一些配置也可以使用默认参数。
添加SSH到Github
登录 github,点击头像,点击 Settings 进入设置页面。
然后点击菜单栏的 SSH and GPG keys 进入页面添加 SSH Key。 点击 New SSH Key 按钮后进行 Key 的填写,其中 Title 随意, Key 为刚刚生成的公钥,公钥在文件 id_rsa.pub 文件中,直接 copy 文件中的内容粘贴即可。
测试 SSH key
在终端 输入 ssh -T git@github.com
, 出现
|
|
这是正常的,直接输入 yes 回车既可。如果你创建 SSH key 的时候设置了密码,接下来就会提示你输入密码,如:Enter passphrase for key '~/.ssh/id_rsa':
成功显示:
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
如果用户名是正确的,你已经成功设置 SSH 密钥。如果你看到 “access denied” ,者表示拒绝访问,那么你就需要使用 HTTPS 去访问,而不是 SSH 。
Git 多用户配置(个人和公司)
公司和github,经常会遇到要多用户使用git的情况,以下为配置信息,以下拿 zhangs & zhangs2 举例
设置ssh-key
ssh-keygen -t rsa -C "zhangs@mail.com"
- 会提示存储的文件名,输入, 第二份ssh-key 生成是一定一定要输入 防止覆盖
- 如果需要push时确认的密码,可在该步骤输入
|
|
- 上传到GitHub或者GitLab参考上面测试添加SSH-Key到Github
SSH 配置文件
使用 ~/.ssh/config 作为我们的配置文件,如果文件不存在,我们就创建它。
vim ~/.ssh/config
|
|
配置文件中的 HostName 是远程仓库的访问地址,这里可以是 IP,也可以是域名。Host 是用来拉取的仓库的别名,配不配置都行。如果 HostName 没配置的话,那就必须把 Host 配置为仓库 IP 地址或者域名,而非别名。
其实这里的User并不会有我们预期的效果,比如你在公司的gitlab用户名一般会取实名的名字,而github是一个随意的昵称。这里并不会让你以后推送代码到gitlab时取 你在这里配置的 gitlab用户名,同样也不会推送到github时取你在这里配置的 github用户名。因为这个其实只是针对ssh key的配置的User,并不会影响你之前通过 git config --global user.name
“公司gitlab用户名” 设置的git账户名
可以分别测试一下了你的ssh 是否能连通了
|
|
设置user.name
前面提到 ~/.ssh/config 文件中的User 并不等同于我们的git账户名。
有可能你之前设置过
git config --global user.name "公司gitlab实名"
然后你发现你传代码到github的时候,也是显示的这个实名,让你觉得有点不爽。
你可以继续到你本地的github仓库项目文件夹下去设置一个本地的用户名
git config --local user.name "github用户名"
再推送,就可以显示对应的用户名了。
邮箱同样git config --local user.email "github 邮箱"
这里什么时候用global 什么时候用local 其实取决于你自己用哪个账户用得多一点,比如你在公司的电脑上,你就可以把公司的gitlab用户名加 –global 配置,而自己个人的github加 –local。如果你是在你自己家里的电脑上,就可以是相反的操作了。
问题
- 由于公司Gitlab 不是走标准的21端口 而是走18888 端口,导致用上述方式配置好之后,在测试SSH Key 的时候无效。
|
|
此时需要联系运维做域名映射,如下把 gitlab.xx.com:18888
映射到21 端口,比如proxygitlab.xx.com
, 把~/.ssh/config
下面的HostName 改为映射后的即可。
|
|
|
|
- 用https方式 git clone 项目代码时用户名和密码的问题
换了新的开发机,通过上述方式配置好之后,clone github 上项目没有问题,可以clone 公司的项目时,发现由于ssh url 不能用(端口不标准),使用https url 的时候 一直需要输入账号密码很烦。
听同事说要执行一个命令:git credential-manager uninstall
,这个命令的作用是 清除掉缓存在git中的用户名和密码。
在我机器上没有作用,出现了 git: ‘credential-manager’ is not a git command. See ‘git –help’. 的错误
清除掉缓存在git中的用户名和密码后,以后每次用 https 方式拉取代码都需要输入用户名和密码。执行下面的命令可以解决这个问题。
|
|
第一个命令清除凭证助手,使用 git config –list 命令这是展示配置属性,只要不存在credential.helper表示清除成功
第二个配置凭证助手(命令将密码明文保存在~/.git-credentials
)
Github 配置多用户
参考此处
Clone 新的仓库
|
|
这里以上面的配置为例,假设要克隆 15wylu 账号的一个项目,原来使用的命令如下:
git@github.com:15wylu/15wylu.github.io.git
但是经过配置,我们已经将 15wylu 的 Host 设为了 15wylu.github.com
,而不再是原来的 github.com
,所以相应地 clone 的命令也变成如下:
git@15wylu.github.com:15wylu/15wylu.github.io.git
已经Clone 下来的仓库
首先使用 git remote -v 列出本地仓库对应的远程库,检查该 URL 是否与要使用的 GitHub 主机匹配,否则更新远程原始 URL, 以 15wylu 账号的仓库为例:
git remote set-url origin git@15wylu.github.com:15wylu/15wylu.github.io.git
对于本地创建新的仓库
在项目文件夹中使用 git init 中初始化目录为一个 Git 仓库。然后在 GitHub 帐户中创建新的仓库,将其作为远程库添加到本地仓库中:
同样以 15wylu 账号为例:
git remote add origin git@15wylu.github.com:15wylu/remote_repo_name.git
确保 @ 和 : 之间的字符串与我们在 SSH 配置中指定的主机(Host)匹配。将初始提交推送到 GitHub 仓库。
Git 常见操作记录
git remote 相关
git remote add <repo name> <repo url>
repo name 为远程仓库的本地名称,可自定义,相当于给 url 对应的仓库起了个别名,对于 git clone 的仓库在本地的名称默认为 origingit remote -v
查看上传协议是 SSH/HTTPSgit remote
查看远程仓库名称git remote show origin
查看远程仓库名为origin 的详情git remote rm <repo name>
删除远程仓库git remote set-url [--push|--add|--delete] <repo name> <new url> [<old url>]
修改远程仓库, 例如git remote set-url origin git@github.com:username/reponame.git
|
|
git merge
git merge dev
把dev 分支合并到当前所在分支。注意,需要先checkout 到某个分支上在执行。
git submodule (子模块)
添加Submodule
Git 子模块(Git submodules)允许你将 git repo 保留为另一个 git repo 的子目录。Git 子模块只是在特定时间快照上对另一个 repo 的引用。Git 子模块使 Git repo 能够合并和跟踪外部代码的版本历史。
命令 git submodule add <repo url> [submodule path]
=> git submodule add https://github.com/****/hugo-PaperMod themes/PaperMod
默认情况下,如果没有指定子模块存放路径,子模块将会放到一个与仓库同名的目录中。如果你想要放到其他地方,那么可以在命令结尾添加一个不同的路径,本例中子模块将会 clone 到 “themes/next” 目录下。
命令执行完成后,会在当前工作仓库根目录下生成 .gitmodules 文件,内容如下:
|
|
该文件保存了项目 URL 与已经拉取的本地目录之间的映射,如果有多个子模块,该文件中就会有多条记录。 要重点注意的是,该文件应像 .gitignore 文件一样受到(通过)版本控制,和该项目的其他部分一同被拉取推送。有了映射关系,克隆该项目的人就知道去哪获得子模块了。
添加子模块完成后,当在父仓库时,Git 仍然不会跟踪 submodule 的文件, 而是将它看作该仓库中的一个特殊提交。
推送到远程仓库后,远程仓库中 submodule 会和指定的 commit 关联起来。如果需要指定分支,可以在 “.gitmodules” 文件中加上 branch 配置,如 branch = develop。
克隆含有submodule的项目
接下来我们将会克隆(clone)一个含有子模块的项目。 当你在克隆这样的项目时,默认会包含该子模块目录,但其中还没有任何文件,你需要执行两个命令以拉取子模块:
|
|
git submodule init 用来初始化本地配置文件,而 git submodule update 则从子项目中抓取所有数据并检出父项目中列出的合适的提交。
或者:
|
|
删除子模块
- 把子模块从版本控制系统中移除
git rm --cached <submodule path>
- 删除子模块目录
rm -rf <submodule path>
- 编辑 “.gitmodules”,移除相应 submodule 节点内容
- 编辑 “.git/config”,移除相应 submodule 配置
- 如果有 “.git/modules” 目录,还应删除其下的相应子模块的目录
例子:
|
|
然后删除 “.gitmodules” 中如下内容:
|
|
最后删除 “.git/config” 中如下内容:
|
|
要把此次修改同步到远程库,还需要 push 一下。