Git 使用和技巧

新装 Git

新装 Git 后缺少一些必要的配置,可以通过运行命令查看当前 git 有关配置信息,打开 git bash 或其它控制台应用运行

git config --list

也可以搭配 --system/global/local 来区分配置级别,分别对应系统级、用户(全局)级和本地(项目)级,从左到右即从低到高级,高级别如有配置会覆盖低级别配置

git config --global --list

以 windows10 为例,安装 git 后会在用户文件夹下创建 .ssh 文件夹保存 git 本身的一些配置内容,新装的 git 是没有 user.name 和 user.email 的,可以通过设置查看或设定

# 查看
git config user.name
# 设置
git config --global user.name "这里写名字"

配置 SSH key

如果通过 https 方式与远程仓库进行联系则需要每次都提供用户名和密码,ssh 方式比较 geek 范儿也更为方便,其道理是在本地生成非对称的 rsa 密钥对,将 public key 提供给 git 服务方保存,以后只要密钥正确即可通过 ssh 方式进行对话,一个 ssh 方式的仓库地址可能是这样的 git@gitee.com:user/reposname.git,首先检查本地是否有存在的密钥,windows 系统进入 .ssh 文件夹,如果没有 id-rsa 类似文件和 id-rsa.pub 文件就没有,检查方式如下

# 打开 git bash
cd ~/.ssh
ls

使用指定文件名创建密钥文件,本例以配置多 git 源为例(即本地要与多于1个的 git 服务方联系,比如又有 gitee 的仓库又有 github 的仓库)

# 使用用户 email 创建文件名为 gitee_id-rsa 的密钥文件
# user.email 要替换为当前用户的真实 user.email
# gitee_id-rsa 是自定义的文件名,能区分出不同 git 源即可
ssh-keygen -t rsa -C "user.email" -f ~/.ssh/gitee_id-rsa

# 再创建一个与 github 对应的密钥
ssh-keygen -t rsa -C "user.email" -f ~/.ssh/github_id-rsa

到 .ssh 文件夹下,打开同名的 .pub 文件并将所有文本复制,粘贴到远程仓库的 ssh key 管理功能中,以 gitee 为例,标题是为用户方便记忆起个名字,内容粘贴到公钥框中,保存即可,这样远程 git 源就有了与本地对应的密钥对

因此有了多个密钥文件,下面要进行一定配置来指导 git 如何与不同远程仓库联系,在 .ssh 目录下建立 config 文件名的文件,没有扩展名哦,将下面内容复制并保存

# 配置github.com
Host github.com                 
HostName github.com
IdentityFile C:\\Users\\{current user}\\.ssh\\github_id-rsa
PreferredAuthentications publickey
 
# 配置gitee.com
Host gitee.com 
HostName gitee.com
IdentityFile C:\\Users\\{current user}\\.ssh\\gitee_id-rsa
PreferredAuthentications publickey

很好理解,就是配置不同的主机使用不同的密钥文件,别用乱了。

测试一下连通性

ssh key 也创建好了,远程仓库密钥也保存了,本地配置也有了该试一下了,使用命令来看一下是否能正确抵达 git 源

# 输入并运行
ssh -T git@gitee.com

# 首次运行可能会输出结果 xxxx[yes/no] 提示是否continue,输入 yes 并继续即可
# xxxx [yes/no] yes
The authenticity of host 'gitee.com (212.64.62.174)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'gitee.com,212.64.62.174' (ECDSA) to the list of known hosts.
Hi 试试手气! You've successfully authenticated, but GITEE.COM does not provide shell access.

检查

见过 ssh 有关一番操作后,.ssh 文件夹应该有 6 个文件

  • config
  • gitee_id-rsa
  • gitee_id-rsa.pub
  • github_id-rsa
  • github_id-rsa
  • known_hosts

前5个上文介绍过是手动创建出来的,known_hosts 是在运行 ssh -T 时 continue 后创建的,用于缓存 git 仓库源与ip地址和私钥的数据。极端情况下如果出现因 dns解析、网络问题导致与 git 仓库无法连接时可修改或删除文件

试一下

都配置好,试一下从 gitee 远程 clone 一个仓库到本地,打开 vs code 切换到 git 栏目点击 克隆存储库,输入远程仓库的 ssh 地址如 git@gitee.com:cinlap/learngit.git,选择目标文件夹,如无意外很快就 clone 到本地了

ssh 操作中的一些补充

  • 添加私钥(作用?)

ssh key 创建后添加私钥运行

ssh-add ~/.ssh/gitee_id-rsa $ ~/.ssh/github_id-rsa $ xxx

如果提示 Could not open a connection to your authentication agent 可以先执行以下命令再重新运行 ssh-add

ssh-agent bash
  • 查看私钥列表和删除
# 查看
ssh-add -l
# 清空
ssh-add -D

实操

How:新建项目时如何操作 git

以 vscode 操作为例,分为以下步骤:

  • 在 git 服务平台(以gitee为例)创建项目,命名如 xxx-git-test

  • vscode 打开项目目录
    如 projectA,在源代码管理侧栏执行初始化源代码管理存储库

  • 配置远程仓库
    选择远程、添加远程存储库为当前项目指定远程关联的 git 项目,vscode 会提醒要提供仓储库的 URL 和远程存储库名称 git-test。远程存储库名称是本地给远程仓储库起的别名,因此当远程仓储库名字比较长时可以起一个简要默认的本地昵称,执行命令时也会好输入的多,比如默认本地把远程库都叫做 origin,以后在命令中 origin 就代表要对远程某库进行操作,但有多远程库时要小心,都叫一个名字可不行。

  • 创建并签出到本地目标分支
    默认初始化的本地仓库的默认分支是 master,但也许我们并不需要在 master 分支,因此可以新建并签出到一个新的分支比如 develop,意思是正在开发的分支,等我搞好了,再合并到 master 或其它

  • 从远程仓库拉去自并选择要拉取的分支到本地
    选择拉取、拉取自功能,将远程内容 Pull 到本地(所选分支),vscode 会以提示方式选择或键入远程目标仓库和远程目标分支,意思是要从哪个仓库、哪个分支取回
    image
    image

  • 执行本地更改到暂存
    因为是空项目因此不会造成本地更改,即使是本地已存在文件。本地文件在编辑后会变成 U即有更改状态,使用暂存更改或 git 命令使这些文件进入暂存区,比如 git add . 提交所有更改到暂存。暂存区文件也可以撤销暂存退回到 U

  • 提交到本地仓库保存并给出备注
    自觉项目完成当前目标比如完成了一个版本或一个 feature 就可以保存了,这个保存是 git 中的提交即 commit,可以当做是一个阶段的保存,执行了 commit 就会将暂存区内容保存到本地仓库,这样就有了一个阶段性胜利成果。commit 时可以提供简要信息说明,如提交版本1.0.0,增加了xxx功能

  • 将提交推送到远程
    已提交的内容就可以推送到远程仓库保存,使用推送或推送到执行。默认就会从本地仓库的当前分支 develop 推送到远程仓库的刚才执行拉取成功的分支

  • 查看远程目标分支,已经成功,本地没有了未更改、未提交
    image
    未关联的远程分支是没有内容的
    image

How:要尝试新功能、新更改怎么办

按照 git 的推荐要善用分支,最好一个 feat/bug/hotfix/xxx 就弄一个分支,即一个分支表示一个版本、一条支线甚至是要解决的一个问题,以便好追溯、好回退、好管理。开始

  • 新建一个 foo 功能
    新建并签出到 foo分支,使用命令签出到或
git branch foo
git checkout foo

image

  • 添加 foo.js
    编辑代码如添加一个 foo.js 文件并保存,源代码管理中即呈现
    image

  • 执行暂存、提交,注意检查分支名是否正确
    image
    image
    image

  • 推送到远程分支
    现在本地有 foo 分支远程没有怎么办,两种情况,第一远程照我本地来,创建并推送到远程 foo 分支,点击 Publish Changes推送git push xxx-git-test foo(意思是把我本地 foo 分支推送到远程仓库 xxx-git-test)。第二推送到远程某个已有分支,git push xxx-git-test foo:master(意思是把我本地 foo 分支推送到远程仓库 xxx-git-test 的 master 分支)。
    image
    image

  • 验证
    切换回 develop 分支看到在 foo 分支下创建、暂存、提交、推送的 foo.js 已经不存在了,说明刚才的一切只在 foo 分支下生效,因此使用分支来进行代码的管理还是挺方便的,可以不影响已有代码,发生错误可以随时将本地新分支删除或切换回上一级分支,随时可以在任何的分支下再建立分支而不影响父级内容。缺点是。。。分支可能会特别多,引入了分支管理的问题,做好 commit 时候的说明甚至是单独的文档记录是比较好的,怎么说管理分支也比管理所有代码文件要轻松。
    image
    image

  • vscode 看不到新建的远程分支

git remote update 项目本地名如origin --prune

How:新建的分支做好了想要合并到已有分支怎么办

foo 分支基础上创建一个 merge 分支,编辑完成合并回 foo。使用分支功能中的创建分支从原分支基础上建立新分支并编辑,而后完成本地的暂存和提交。
image
image
切换到源分支(当前编辑分支的来源分支)foo,选择分支、合并分支功能并选择 merge 分支,将 merge 的改动合并到 foo,这里边的逻辑是要先站在主线上然后把旁支的改动合并到主线上来。合并完成后,即可将 foo 推送到远程仓库完成更新。
image

posted @ 2020-05-15 14:15  试试手气  阅读(177)  评论(0编辑  收藏  举报