04-远程库操作

04-远程库操作

远程库操作

为了能和其他的开发者在任意 Git 项目上协作,就需要知道如何管理自己的远程仓库。

远程仓库是指托管在因特网或其他网络中的项目的版本库。

远程仓库管理一般包含以下内容:

  • 添加远程仓库
  • 移除无效的远程仓库
  • 管理远程分支
  • 推送或拉取数据
  • ...

一个开发者可以同时管理多个远程仓库。根据项目角色的不同或远程库开放权限的不同,可以操作的范围也不同。

1. Github 帐号

一般选用 Github码云 作为远程库代码托管平台。

创建远程库首先需要在代码托管平台上进行帐号注册,这里以 Github 为例,注册时正常填写自己喜欢的用户名和常用邮箱即可。

2. 密钥及作用

Git 命令可以使用 https 协议和 git 协议操作在代码托管平台上搭建的远程库。如果使用 https 协议,每次操作都要输入密码,会比较麻烦。但是如果使用 git 协议,然后配合使用 ssh 密钥,这样可以省去每次的身份验证环节,会更方便一些。

ssh 密钥是分公钥和私钥的。

公钥和私钥都是可以由特定的命令生成。其中公钥是存放在服务器,私钥存放在本地。当本地需要对服务器远程库进行操作时,服务器会要求本地出示私钥与服务器存放的公钥进行配对,验证是否由本人进行操作。如果配对成功则允许进行相关操作,配对失败则会拒绝。

大多数 Git 平台服务器都会选择使用 SSH 公钥来进行仓库管理的授权及身份验证。系统中的每个用户都必须提供一个公钥用于授权。

具体使用时,公钥和私钥实际配对的是本地设备。

2.1 创建密钥

命令均在 'Git Bash' 打开的 Git 命令行工具中运行,后同。

使用命令:

$ ssh-keygen

可以得出如下示例结果:

Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):

提示要求输入将要生成的密钥文件的路径,可以不输入,使用默认路径即可。按下回车进入下一步,可以得出如下示例结果:

Created directory '/c/Users/Administrator/.ssh'.
Enter passphrase (empty for no passphrase):

显示密钥文件已经生成,提示是否需要使用密码,不输入则不使用密码。这里选择不输入,按下回车进入下一步后会要求再次进行密码询问,保证两次输入密码一致,防止输入错误。

Enter same passphrase again:

由于不输入密码,则继续按下回车进入下一步,可以得出如下示例结果:

Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:ktZ5LH8nKCZia1t7EM+zWOrXNNRMbsgtbcJRWLNG7s8 Administrator@Q6YRWT1PKZOT7ZV
The key's randomart image is:
+---[RSA 3072]----+
|           +=    |
|          oo.o   |
|         o X+    |
|      .o oBoO    |
|      ++S.o=.    |
|     ...=+o. o   |
|    o o=o=o.o E  |
|   ..+o++... o   |
|   .oooo         |
+----[SHA256]-----+

显示密钥已经生成。此时打开 'C:\Users\Administrator' 目录,可以看到一个 .ssh 文件夹,内部包含两个文件,其中 id_rsa 是私钥文件,id_ras.pub 是公钥文件。

2.2 配置密钥账户关联

登录 Github 帐号后,在个人中心中 ++setting++ 页面选择 ++SSH and GPG keys++ 配置,点击 ++New SSH key++ 进入添加公钥表单页面。

  • Title:为公钥添加描述标题,可以随意填写。推荐写入配有私钥文件的设备名称
  • Key:填入生成的公钥,即 id_ras.pub 文件的内容(可以先将公钥文件后缀修改为 .txt 获取内容后再修改回去)

填写完成后保存即可。

Git 账户关联实际是账户和设备之间的关联,在公钥文件的最后会添加当前设备名称。所以,设备名称中不能有中文。

3. 远程库基础操作

远程库虽然创建在代码托管平台,但是操作一般还是在本地执行相关命令。

3.1 创建远程库

在新增中选择 ++New Repository++ 进入新建仓库页面。

根据提示填写仓库名称(一般为项目名称)、项目描述,选择仓库类型(共有仓库和私有仓库)、选择初始化仓库时需要添加的文件(推荐选择 readme.md 和 .gitignore)。

选择完成后点击 ++Create repository++ 按钮即可进入仓库页面。查看 Code 下拉菜单即可获取远程库地址。

3.2 克隆远程库

在本地第一次获取远程库代码时应使用 克隆 方式。

使用命令:

$ git clone [远程库地址]

例如:

$ git clone https://github.com/[用户名]/[仓库名].git
$ git clone git@github.com:[用户名]/[仓库名].git

克隆完成后,会在本地生成名为 ++项目名称++ 的文件夹,内部即为项目代码。若想进一步进 git 操作,需要进入项目文件夹后才能执行。

默认仅获取远程库主分支(master/main)分支代码。

使用克隆时无需进行本地 Git 初始化。下载并生成项目文件夹后会自动获取远程库对应 .git 配置文件,也无需再进行初始化。相应的,还会默认关联对应的远程库,默认别名为 origin。

下载远程库

使用提供的 ++Download ZIP++ 功能即可直接下载远程库代码。

不推荐使用这种方式获取自己的远程库代码,因为无法获取记录 git 提交控制的 .git 隐藏文件夹,并且,只能获取到主分支代码。若只是希望查看别人的仓库代码,可以使用这种方式。

3.3 远程库关联

将本地库与指定远程库进行关联后,才可以进行代码更新的推送和拉取。

在本地指定文件夹中依次执行如下命令:

  1. 本地初始化仓库
$ git init
  1. 关联远程库
$ git remote add [远程库别名] [远程库地址]

例如:

$ git remote add origin git@github.com:[用户名]/[仓库名].git
  • 远程库别名用于表示远程库地址;若只是关联单一远程库,一般使用 origin
  • 远程库地址优先使用 git 协议地址

同一本地库可以添加多个远程库关联

3.4 查看远程库信息

3.4.1 查看本地库已关联的远程库

使用命令:

$ git remote

可以查看到所有关联的远程库的别名。

3.4.2 查看已关联的远程仓库的地址信息

使用命令:

$ git remote -v
$ git remote --verbose

可以查看到所有关联的远程库的具体地址,示例结果如下:

origin  git@github.com:[用户名]/[仓库名].git (fetch)
origin  git@github.com:[用户名]/[仓库名].git (push)

3.4.3 查看某个远程库的详细信息

使用命令:

$ git remote show [远程库别名]

得到如下示例结果:

* remote origin
  Fetch URL: https://github.com/[用户名]/[仓库名].git
  Push  URL: https://github.com/[用户名]/[仓库名].git
  HEAD branch: master
  Remote branches:
    master                   tracked
    dev-branch               new (next fetch will store in remotes/origin)
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

可以看到远程仓库的 URL 地址与跟踪分支的信息。

具体可以看出哪些分支已经被本地库跟踪,哪些远程分支存在更新在可以在下次代码拉取获取,n哪些本地分支相较于远程库存在代码更新,在提交时与哪些远程库对应分支进行合并。

3.5 重设远程库

使用命令:

  • 重设别名
$ git remote rename [远程库原别名] [远程库新别名]
  • 重设远程库地址
$ git remote set-url [远程库别名] [远程库新地址]

3.6 同步远程库

若远程库代码更新(分支、分支代码等)本地是无法及时查看到的,需要及时进行更新后才会方便后续操作。

使用命令:

$ git remote update [远程库别名]
$ git fetch [远程库别名]

命令 1 本质本质执行的还是命令 2

同步远程库是将远程库在最后一次同步后的更新拉取到本地库,将更新分别对应合并在本地远程分支中,在进行本地分支操作时,可以选择是否合并最新更新。

3.7 删除远程库关联

使用命令:

$ git remote rm [远程库别名]

4. 分支关联

分支关联 refspec 是 Reference Specification 的缩写,字面意思就是具体的引用。它其实是一种格式,git 通过这种格式来表示本地分支与远程分支的映射关系。

当本地分支与远程分支产生关联后,就可以进对应的推送和拉取代码更新。

4.1 本地远程分支

git 中其实有三种分支:本地分支、本地远程分支、远程分支。

可以这样理解:本地远程分支是远程分支的一个镜像,并且在本地仓库与远程仓库之间起到一个桥梁的作用,本地分支与远程分支通过本地远程分支互相交换代码时从而产生关联效果。

  [远程分支]   <--------->   [本地远程分支]   <--------->   [本地分支]
------------              -----------------------------------------------
   远程库                                       本地库

本地远程分支也是存储在本地库中,分支名称以 [远程库别名]/[分支名] 格式保存。

如:远程库和本地库的 master 分支对应的本地远程分支名为 '++origin/master++'。

当拉取远程库更新时,会先将更新内容全部合并在本地远程分支中,最新的提交指向由 FETCH_HEAD 表示。

FETCH_HEAD 指的是: ++某个 branch 在服务器远程库上的最新状态++。这个列表保存在 .Git/FETCH_HEAD 文件中, 其中每一行对应于远程服务器的一个分支。

4.2 关联设置

4.2.1 远程库分支关联本地分支

由更新远程库获取的分支会自动与本地的同名分支产生关联,即使本地分支暂时未创建。

4.2.2 本地分支关联远程库分支

若分支是由本地主动创建并推送至远程库,需要在第一次推送时通过以下命令产生关联效果,并且仅设置一次即可:

  • 推送本地指定分支到远程库与并创建同名远程分支,然后对应跟踪关联
$ git push --set-upstream [远程库别名] [本地库指定分支名称]

upstream 意味上游,代指远程分支。

初次关联提交必须填写分支名称,即使是提交当前分支

  • 推送本地指定分支到远程库与并创建指定名称远程分支,然后对应跟踪关联
$ git push --set-upstream [远程库别名] [本地库指定分支名称]:[远程库指定分支名称]

不推荐这种方式,因为分支的异名关联只会在创建异名分支的本地库中显示,在其他本地库中不会有这种异名关联显示。

当产生分支关联后,后续无论是推送还是拉取当前分支更新时,都无需再指明远程库及远程库对应分支,使用简写命令即可。

# 分支关联 前 对于当前分支每次推送或获取更新时执行的命令
$ git push [远程库别名] [当前分支名称]
$ git pull [远程库别名] [当前分支名称]

# 分支关联 后 对于当前分支可使用以下简写命令
$ git push
$ git pull

若是推拉指定分支(非当前分支)时,还是正常书写远程库别名及对应分支命名,然后可以根据是否添加 --set-upstream 配置决定是否进行关联即可。

本地新建仓库与远程新建仓库关联后无法合并的解决方式

5. 远程库分支基础操作

5.1 查看远程库分支

使用命令:

  • 仅查看远程库分支列表
$ git branch -r
  • 查看远程库所有分支并及最新的提交信息
$ git branch -rv

最新提交信息为每一个分支最后一次提交历史的前 6 位 hash 值及相应的提交描述

  • 查看本地分支对应的远程分支
$ git branch -vv

可以得到如下结果示例:

* [本地分支名称] [commit_id] [对应远程库名称/对应远程分支名称] [最新一次提交描述]
  • 查看本地、远程所有分支及最新的提交信息
$ git branch -a
$ git branch -av

5.2 推送本地库分支更新到远程库

当本地项目开发完成一个确定版本项目,或某分支完成一个特定版本功能时,需要将代码变化推送到远程库,与多人协作开发的代码进行合并,推进整个项目的开发进程。

代码推送的核心是推送分支更新,推送命令完整结构如下,不同的参数填写情况,可以有不同的推送方式:

$ git push [--command] [远程库别名] [本地库分支名称]:[远程库分支名称]

5.2.1 远程库无关联分支

根据是否产生分支关联添加 --set-upstream 配置。

使用命令:

  • 仅推送分支更新,但不设置分支关联
$ git push [远程库别名] [本地库分支名称]
  • 仅推送分支更新到指定远程分支,但不设置分支关联
$ git push [远程库别名] [本地库分支名称]:[远程库分支名称]
  • 推送分支更新,并设置同名分支关联
$ git push --set-upstream [远程库别名] [本地库分支名称]
  • 推送分支更新到指定远程分支,并于对应远程分支设置关联
$ git push --set-upstream [远程库别名] [本地库分支名称]:[远程库分支名称]

分支推送时,若远程库没有对应远程分支,则自动创建

5.2.2 远程库有关联分支

当远程库存在关联分支时,使用简单推送方式即可。

使用命令:

  • 推送当前分支到远程关联分支
$ git push [远程库别名]
  • 第一次推送时,设置默认远程库
$ git push -u [远程库别名]
  • 推送默认分支到默认远程库
$ git push
  • 推送指定分支到远程关联分支
$ git push [远程库别名] [本地库指定分支名称]
  • 推送指定分支到远程指定分支
$ git push [远程库别名] [本地库指定分支名称]:[远程库指定分支名称]

将本地库指定分支推送至远程库(同名/指定)分支合并,若后者不存在,则自动创建。

不推荐这样做,因为本地被合并的分支并不会对应添加这次提交。本地对应的分支需要使用 git pull 命令拉取更新后才会得到最新的结果。

5.2.3 推送模式

在进行分支关联推送时,若不指定本地库分支名称,则默认只会推送当前分支,这叫做 simple 方式。此外,还有一种 matching 方式,会推送所有有对应的远程分支的本地分支。Git 2.0 版本之前,默认采用 matching 方法,现在改为默认采用 simple 方式。如果要修改这个设置,可以采用 git config 命令。

$ git config --global push.default matching
// 或者
$ git config --global push.default simple

不推荐修改,因为有些分支只是在本地开发使用,没有必要生成远程全局分支

5.2.4 其它分支推送方式

使用命令:

  • 全部推送
$ git push --all [远程库别名] [本地分支名称]

不管是否存在对应的远程分支,将本地的所有分支都推送到远程库。不推荐,原因见上。

  • 强制推送
$ git push --force [远程库别名] [本地分支名称]
$ git push --force-with-lease [远程库别名] [本地分支名称]

远程分支在被本地拉取更新后,由其它开发者推送更新,导致远程分支进度超过本地进度,这时推送时 Git 会报错。如果一定要推送,则可以 --force 命令做强制推送覆盖远程分支代码,这样可能会删除其它开发这推送的更新。

但是如果想要安全的覆盖推送,则可以使用 --force-with-lease 配置,该配置的作用是自行判定远程分支和本地分支的进度,如果远程分支较新,则不进行覆盖推送,拒绝合并。一般做法是先在本地使用 git pull 或 git fetch + merge 合并差异,处理冲突,然后再提交推送到远程库,这时就不会拒绝覆推送了。

除非你很确定要这样做,否则应该尽量避免使用 --force 选项。

  • 推送分支标签
$ git push [远程库别名] --tags [本地分支名称]

普通推送不会添加分支标签(tag),需要使用 --tags 选项。

5.3 拉取远程库更新

在进行本地开发之前,都需要先将远程库更新拉取到本地,在新的进度下进行项目开发推进。

拉取更新的实际操作是拉取远程分支更新,拉取命令完整结构如下,不同的参数填写情况,可以有不同的拉取方式:

$ git pull/fetch [--command] [远程库别名] [远程库分支名称]:[本地库分支名称]

由远程库拉取下来的分支会自动产生关联。

5.3.1 合并远程库更新

在获取到远程库分支更新后希望直接合并在本地分支时,可以使用 pull 命令。

使用 pull 命令会将远程更新与本地分支直接合并,最后结果与远程库最新代码为准,忽略代码冲突,所以需要根据实际情况选择使用。pull 命令的默认模式是 fetch + merge 命令的组合

使用命令:

  • 拉取指定远程库所有分支更新合并至本地分支、本地远程分支
$ git pull [远程库别名]

若本地分支与远程分支存在关联,则更新直接合并在本地分支中;若不存在关联关系,则更新合并在本地远程分支中。

  • 若只有一个关联远程库,则可不需要填写远程库名称
$ git pull
  • 拉取远程库指定分支更新与本地当前分支进行合并
$ git pull [远程库别名] [远程库分支名称]
  • 拉取远程库指定分支更新与本地指定分支进行合并
$ git pull [远程库别名] [远程库分支名称]:[本地分支名称]
  • 合并更新时会产生一条新的提交记录,容易产生提交记录的混乱,可以添加 rebase 配置优化提交记录
$ git pull [远程库别名] --rebase [远程库分支名称]

6.2 拉取远程库更新

fetch 命令与 pull 命令参数用法基本一致,只是需要更多的命令组合完成远程更新的合并。

fetch 命令更新本地库的基本流程:

  1. 拉取远程库分支更新合并在本地远程分支中
$ git fetch [远程库别名] [远程库分支名称]

本地远程分支命名结构为:[远程库别名]/[远程库分支名称]

  1. 在切换到合并分支后手动合并更新分支
$ git merge [本地远程分支名称]

若触发冲突,则处理冲突,再次手动提交。

7. 删除远程库分支

使用命令:

$ git push [远程库别名] --delete [需要删除的远程库分支名称]
$ git push [远程库别名] :[需要删除的远程库分支名称]

基本上这个命令做的只是从服务器上移除这个指针。 Git 服务器通常会保留数据一段时间直到垃圾回收运行,所以如果不小心删除掉了,通常是很容易恢复的。

第二个命令可以看做是推送一个空分支合并到指定分支,合并结果就是空,达到删除的效果。

posted @ 2023-11-15 10:39  讨厌敲代码的老郭  阅读(41)  评论(0编辑  收藏  举报