Git 基础知识--打Tag、团队协作

打 Tag

简述

Git 可以给历史中的某一个提交打上标签 tag,以示重要。人们一般用 tag 功能来标记发布节点(v1.0…)。

tag 与 分支很像,区别在于:

  • 轻量标签 tag 是固定的,不能移动
  • 分支 是不固定的,可移动

创建标签

Git 主要使用两种标签:轻量标签、附注标签

轻量标签

特点:轻量标签 tag 很像一个不会移动的分支,它只是一个特定提交的引用。

语法:

给最新的提交打 tag

$git tag [name]

给指定提交打 tag

$git tag [name] [commit hash]
附注标签

顾名思义,就是可以加上备注的标签。

git tag -a [tagName] -m ['message']
$ git show v1.0
tag v1.0
Tagger: huangkaijun <1046129660@qq.com>
Date:   Thu Jan 6 00:15:03 2022 +0800

master version 2.0 # 打上备注的标签

查看标签

所有标签
$git tag
单个标签
$git tag -l|--list [name]
标签具体信息
$git show [tagName]

ommit ac163cefc4e7f0268069784ee99fb861b2be7ddf (tag: v1.1)
Author: huangkaijun 1046129660@qq.com
Date: Wed Dec 29 16:34:47 2021 +0800

v1

diff --git a/init b/init
new file mode 100644
index 0000000…626799f
— /dev/null
+++ b/init
@@ -0,0 +1 @@
+v1

show 命令除了能查看 tag 具体信息之外,还可以查看 treecommitblob 对象。

切换标签

$git checkout [tagName]

注:虽然说这会使你的仓库处于“分离 头指针(detacthed HEAD)”状态。在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化,但你的新提交将不属于任何 分支,并且将无法访问,除非访问确切的提交哈希。因此,如果你需要进行更改——比如说你正在修复旧版本的错 误——这通常需要创建一个新分支。

删除标签

$git tag -d [tagName]

远程标签

推送远程标签

默认情况下,git push 命令并不会传送标签到远程仓库上。在创建完标签之后你必须显式地推送标签到远程仓库中。

这个过程就跟推送远程分支一样。

git push origin [tagName]

Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (7/7), 603 bytes | 603.00 KiB/s, done.
Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
To https://gitee.com/hkjGitee/test_remote.git

  • [new branch] develop -> develop
  • [new tag] v2.0 -> v2.0

若要一次性推送多个标签,则使用 --tags 参数。这将会把所有不在远程仓库上的标签全部推送上去。

git push origin --tags

现在,当其他人从仓库中克隆或拉取,他们也能得到你的那些标签。

Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 165 bytes | 165.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
To https://gitee.com/hkjGitee/test_remote.git

  • [new tag] show -> show
  • [new tag] v1.0 -> v1.0
  • [new tag] v1.3.9 -> v1.3.9
  • [new tag] v1.4 -> v1.4
删除远程标签

-d 参数用于删除本地标签,但并不会移除远程仓库上的标签,必须使用 push 命令来完成:

方式一:

git push [remote-name] :refs/tags/[tagName]

# remote: Powered by GITEE.COM [GNK-6.2]
# To https://gitee.com/hkjGitee/test_remote.git
#  - [deleted]         v1.0

作用:将 : 冒号前面的空值推送到远程标签名,从而高效地删除它。

方式二:

git push [remote-name] --delete [tagName]

# remote: Powered by GITEE.COM [GNK-6.2]
# To https://gitee.com/hkjGitee/test_remote.git
#  - [deleted]         v1.3.9

团队协作

.gitignore 文件

文档官网:https://github.com/github/gitignore

简介

​ 一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。可以创建一个 .gitignore 的文件,列出要忽略的文件模式

简单来说,就是 push 的时候可以忽略某些文件

​ 注:它是一个文本文件。

格式规范

可以使用标准的 glob 模式匹配

  • * :代表匹配任意个字符:
  • :代表匹配任意一个字符

  • **: 代表匹配多级目录

  • # 注释

匹配模式前跟反斜杠(/) 这个斜杠代表项目根目录

匹配模式最后跟反斜杠(/)说明要忽略的是目录。

要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

示例
# 此为注释 – 将被 Git 忽略

# 忽略所有 .a 结尾的文件
*.a

# lib.a 除外
!lib.a

# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO

# 忽略 build/ 目录下的所有文件
build/

# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt

# 忽略 doc/ 目录下所有扩展名为 txt 的文件
doc/**/*.txt

远程仓库

​ 远程仓库【Remote Directory】是指托管在因特网或其他网络中的你的项目的版本库。你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。

相当于是把本地 Git 仓库放在了网上平台托管。

GitHub

​ GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心。大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实现 Git 托管、问题追踪、代码审查以及其它事情。

GitHub 是国外平台,Gitee 是国内平台。

​ GitHub 网址:https://github.com/

基本流程

​ 一个项目在 GitHub 平台上托管,就必须有对应的管理体系,根据职责不同,对应的 Git 可操作权限也不同,而 GitHub 也为该体系提供了一套基本的团队协作流程。根据职责主要分为 项目负责人团队开发人员 及其他成员。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ssPmPhEM-1657787834728)(git-media/三大分区的转换关系.png)]

项目负责人
1、 GitHub 上创建远程仓库

不初始化 README.md 文件,直接为空仓库。

GitHub 上的项目可通过HTTP或 SSH 访 问,格式是 :

  • HTTP : https://github.com//<project_name>
  • SSH : git@github.com:/<project_name>

Git 可以通过以上两种 URL 进行抓取和推送,但是用户的访问权限又因连接时使用的证书不同而异。

注:

通常对于公开项目可以优先分享基于 HTTP 的 URL,因为用户克隆项目不需要有一个 GitHub 帐号。 如果你分享 SSH URL,用户必须有一个帐号并且上传 SSH 密钥才能访问你的项目。 HTTP URL 与你贴到浏览器里查看项目用的地址是一样的。

SSH 方式
  • ssh-keygen –t rsa –C 你的邮箱:生成公私钥
  • .ssh 文件位置:C:\Users\Administrator\.ssh
  • ssh -T git@github.com :测试公私钥是否已经配对
2、创建本地库,并搭建项目的基本框架
$git init

现在的概念是远程搭建一个空仓库,本地搭建一个基本库,再将本地库 push 到远程库上实现联动。

3、配置本地项目级别的用户信息
$git config user.name="hkj"
$git config user.email="1046@qq.com"

注意:配置用户信息一定要在项目 commit 提交之前,否则引用的便是更改之前的全局配置

4、添加远程仓库并配置别名

远程仓库主涉及到 remotepushpullfetch等常用指令。

$git remote add <shortName> <git url>

# git remote add origin https://gitee.com/hkjGitee/test_remote.git

作用:根据 git 地址添加远程仓库到本地,同时设置一个别名。【若是 clone 则默认的远程仓库别名为 origin】。

可以通过 git remote -v 查看当前 git 地址的别名:

origin    https://gitee.com/hkjGitee/test_remote.git (fetch) # 拉取的远程仓库别名 -- git 地址
origin    https://gitee.com/hkjGitee/test_remote.git (push) # 推送的远程仓库别名 -- git 地址
5、推送本地仓库到远程仓库
$git push [remote-name] [branch-name]

#git push test master

将本地指定的分支推送到远程仓库中。

Windows 凭据

​ 在你的计算机首次建立一个 GitHub 或 Gitee 的远程仓库,并打算由本地仓库 push 到远程仓库时,GitHub / Gitee 平台为了安全保证,会首先在你的计算机中存入一个 Windows 凭据,该凭据的作用主要是用于验证你是否在 GitHub / Gitee 平台上有相关的账户,验证用户名密码通过之后,就可以让你将代码推送到它们的平台上进行托管,否则不可 push。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iSHlxL48-1657787834729)(git-media/Windows 凭据管理器.png)]

远程跟踪分支

​ 在 Git 本地仓库 push 到远程仓库实现同步之后,会根据本地仓库的分支附带生成远程跟踪分支。

​ 远程跟踪分支对应本地工作的分支【默认 origin/master 分支】,意义就在于远程分支与本地分支保持同步工作,而若本地新建了一个 branch 分支,且 push 到 origin 远程仓库之后,也会相应的创建 origin/develop 远程跟踪分支。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mNUq0GlZ-1657787834730)(git-media/Git 远程跟踪分支.png)]

若是使用 checkout 命令切换到远程跟踪分支,则会出现 HEAD 分离头指针 的情况,这是因为 checkout 指令只移动 HEAD 指向到 origin/master ,而分支的指向还是在 develop 上,导致了 HEAD 与 分支指向不同步

如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9yTb8xME-1657787834730)(git-media/Git 分离头指针.png)]

解决的办法是:在当前提交上重新创建一个分支,让 HEAD 指向 新分支,新分支指向 commit ,完成统一

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ENIoU4QH-1657787834730)(git-media/Git 分离头指针--解决办法.png)]

6、邀请成员加入团队,开始协同开发

在没有加入某个团队之前,你是没有任何权限的。

开发人员
1、克隆远程仓库到本地
$git clone [git 地址]

注:默认克隆时为远程仓库起的别名为 origin

在一开始 clone 远程仓库下来之后,在本地 master 分支没有做任何提交之前,是无法查看到任何信息的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xC5RCphp-1657787834731)(git-media/Git clone 未提交状态.png)]

当你发生过一次提交之后,clone 会自动创建对应的远程跟踪分支并做一个 HEAD 变更的工作,被 git reflog 记录下来:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qDTlGwQ7-1657787834731)(git-media/git clone 远程跟踪分支.png)]

​ 远程仓库名字 origin 与分支名字 master 一样,在 Git 中并没有任何特别的含义一样。 同时 master 是当你运行 git init 时默认的起始分支名字,原因仅仅是它的广泛使用,origin 是当你运行 git clone 时默认的远程仓库名字。

2、推送提交到远程仓库
$git push [remote-name] [branch-name]

注:只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送若有多人协同开发同一分支,则先 pull 自动合并后,再 push

3、项目负责人更新成员提交的内容
$git fetch [remote-name]

这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。必须注意 git fetch 命令会将数据拉取到你的本地仓库,它并不会自动合并或修改你当前的工作,需要你手动合并到你的工作中。

远程跟踪分支

概述

​ 根据仓库的环境不同,对应的仓库分支也不同,本地仓库有本地分支,远程仓库则有远程分支

​ 而为了实现本地仓库与远程仓库联动同步的效果,就需要远程跟踪分支来作为媒介起到一个桥梁的作用,将本地分支与远程分支的状态同步一致远程跟踪分支相当于是远程分支在本地分支上的映射体现。

跟踪分支是一种和某个远程分支有直接联系的不可移动的本地分支。当你做出任何网络通信操作时,它们会自动移动。

​ 它们以 (remote)/(branch) 的形式命名。例如:origin/master

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E8TpCZIz-1657787834732)(git-media/git clone 远程跟踪分支.png)]

工作流程
简述

​ 在 clone 克隆远程仓库时,Git 通常会自动创建一个名为 master 的本地分支来跟踪 origin/master 远程分支。这正是 git pushgit pull 一开始就能正常工作的原因。

此时,origin/master 跟踪分支会与 master 本地分支同时存在并相互关联。

​ 假设你有一个 Git 地址 [https://gitee.com/hkjGitee/test_remote.git] 。若执行 git cloneclone 命令会自动将该远程仓库命名为 origin ,拉取它的所有数据,创建一个指向它的 master 远程分支的指针,并且在本地将其命名为 origin/master。Git 也会给你一个与 origin/master 远程分支同步的 master 本地分支,这样你就能在此基础上工作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PjGgfDgo-1657787834732)(git-media/GIt  远程跟踪分支.png)]

Local branch 是你工作的基础,当你在本地 master 分支做出一些修改工作时,它会继续向前行进,但是在此期间若你不与远程仓库通信,那么 origin/master 还是会在原来的位置上:

且如果有其他开发人员也从这条线开始 commit,那么你们的提交历史记录则会是不同的节点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AbmspRY1-1657787834732)(git-media/Git origin-master 远程分支.png)]

fetch 抓取更新

​ 当多人协同开发同一个远程分支时,一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到 git fetch 命令。

git fetch 命令会首先查找对应的 Git 服务器【origin】,从远程仓库中抓取本地没有的数据,并且更新本地数据库,移动对应的远程跟踪分支(origin/master)指向新的、更新后的位置

git fetch origin
merge 合并

​ 最后,需要进行一次合并操作,因为 fetch 仅仅只是抓取数据的操作,要完成真正意义上的同步,需要再借助 merge 命令来实现 远程跟踪分支与 本地分支 状态完全一致

git merge origin/master

​ 总结:多人协同开发时,使用 fetch 抓取更新代码到远程跟踪分支,再通过 merge 合并到本地分支中

pull 简写

​ 前面的一系列流程,其实都可以通过 git pull 指令来一步完成,pull = fetch + merge 的简写。pull 指令会自动抓取远程分支的数据并合并到本地分支中。

git pull
远程/本地分支绑定

​ 前面说到,当 clone 一个 Git 远程仓库后,会自动创建一个 origin/master 远程跟踪分支,它是自动与 master 本地分支绑定在一起的,所以我们才能一开始就顺利的直接将修改的代码 push 上去。

注:

  • 如果是自己创建的分支,在 push 的时候会自动生成对应的远程跟踪分支
  • 如果是别人的分支,则需要第一次 fetch 才能拿到对应的远程跟踪分支

clone 会完全拿到远程仓库的所有远程跟踪分支

checkout 新建本地跟踪远程分支

当然你也可以在新建本地分支时,指定想要跟踪的远程分支,通过如下指令:

git checkout -b [branch] [remotename]/[branch]

//or

git checkout --track [远程分支]

此操作还有一个作用:当你尝试切换不存在的本地分支 a,恰好有一个名字与之匹配的远程分支 b,那么 checkout 就会帮你自动创建一个跟踪分支。

别名

如果想要将本地分支与远程分支设置为不同的名字,你可以增加一个不同名字的本地分支:

git checkout -b develop origin/serverfix

#Branch sf set up to track remote branch serverfix from origin.
#Switched to a new branch 'develop'

现在,本地分支 develop 会自动从 origin/serverfix 拉取。

branch 已有本地更改跟踪分支

​ 在实际工作中,常常会出现多个人对同一个远程仓库进行工作,假设 A 开发人员新建并 push 了一个远程分支 origin/a,那么其他人在 push 之前必须先 pull 更新同步一下远程仓库在本地没有的数据。同时在本地就会出现没有的远程分支 a,那么其他开发人员则需要建立对应的本地分支 a 来同步远程分支 origin/a,这种操作可通过 branch 命令来实现。

本地的分支(master 除外)是不会自动与远程分支进行绑定同步的,需要 -u 手动跟踪

作用:设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者修改一个正在跟踪的远程跟踪分支

git branch --set-upstream-to=origin/serverfix

# 简写

git branch -u origin/serverfix 

注:如果本地分支与远程分支不对应绑定,是无法 push 的,因为本地分支不知道要提交到哪里去

如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zyfT2eND-1657787834733)(git-media/git branch --set-upstream.png)]

upstream is gone 问题

当出现如下问题时:

git status
>Your branch is based on 'origin/home_branch', but the upstream is gone.

说明:基于远程分支 origin/home_branch 已经不见了,失去了关联依然还是可以提交和更新的,但是在效率上会差很多。这种情况一般是由于远程分支被删除了导致的。

解决方法:

1、通过 --set-upstream-to 让本地分支与远程分支重新建立关联

git branch --set-upstream-to=origin/home_branch

2、通过 git push -u 在提交时指定远程分支

git push -u origin home_branch

区别:

push -u--set-upstream-to 两者都可以达到本地分支关联远程分支的目的,但是前者更通用。

​ 原因:

​ 若我们在 push 时并没有对应的远程分支

  • 那么 --set-upstream-to 就不可行,因为它是基于已有远程分支基础上进行更改跟踪分支的指向
  • push -u 则是push 的同时若远程分支不存在,则会被新建
查看设置的所有跟踪分支
git branch -vv

# iss53 7e424c3 [origin/iss53: ahead 2] forgot the brackets
#  master 1ae2a45 [origin/master] deploying index fix
# * serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] 
# this should do it
#  testing 5ea463a trying something new
  • iss53 分支正在跟踪 origin/iss53 并且 “ahead” 是 2,意味着本地有两个提交还没有推送到服务器上
  • master 分支正在跟踪 origin/master 分支并且是最新的
  • serverfix 分支正在跟踪 teamone 服务器上的 server-fix-good 分支并且领先 3 落后 1,意味着服务器上有一次提交还没有合并入同时本地有三次提交还没有推送
  • testing 分支并没有跟踪任何远程分支
先抓取再查看

注意:branch -vv 只会抓取最后一次 fetch 的数据,即本地缓存的服务器数据,若想要统计最新的领先和落后数字,需要在 branch -vv 命令之前 fetch 远程仓库所有最新的数据。

$ git fetch --all
$ git branch –vv
删除远程分支

1、删除远程分支

git push [remote-name] --delete [branch-name]

注:在删除远程分支时,一定要保证有对应的跟踪分支存在。

remote: Powered by GITEE.COM [GNK-6.2]
To https://gitee.com/hkjGitee/test_remote.git

  • [deleted] develop

2、列出仍在远程跟踪但是远程已被删除的无用分支

git remote prune origin --dry-run

3、清除上面命令列出来的远程跟踪

git remote prune [branch-n ame]
重命名远程分支

1、先删除远程分支:

git push [remote-name] --delete [branch-name]

2、重命名本地分支:

git branch -m [old-branch-name] [new-branch-name]

3、将重命名之后的本地分支推送到远程仓库:【形成远程分支】

git push origin [new-branch-name]

冲突解决

冲突

​ 当涉及到多人协同开发时,经常会出现同一分支合并时产生冲突的问题,此时就需要我们来解决冲突。

​ 一般情况下,多人开发同一分支时出现冲突的情况都会是,开发人员 A 与 开发人员 B 在同一分支,同一文件都都编写了对应的内容,A或B 在 push 的时候无法与远程分支中的内容进行同步,此时就会产生冲突。

  • 多人同时修改并 push 同一分支中同一位置的代码而导致冲突

假设当 A 修改并 push 了某个文件,B 也准备这么做时,会报出如下错误:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJASCf9Q-1657787834733)(git-media/git push 冲突-1.png)]

表示我们需要先 pull 拉取最新分支数据下来。

pull 之后,Git 首先发现当前工作区的 a.txt 与远程分支的 a.txt 同一位置的代码有冲突,于是需要我们手动解决冲突位置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-suXzhWqL-1657787834734)(git-media/git push 冲突-3.png)]

择优处理:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z4ppJWdA-1657787834734)(git-media/git push 冲突-4.png)]

HEAD:本地分支的代码,94f1:远程分支的代码

解决冲突之后,直接 add -> commit -> push 正常提交流程即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zzl8cMpv-1657787834735)(git-media/git push 冲突-5.png)]

覆盖

​ 当我们 clone 了一个远程仓库,且工作期间有人 push 了新分支的数据,那么我们必须在 push 之前先 pull 拉取一下;此时,若我们要 push 的代码与远程分支上的已有代码产生冲突时,可能会导致 pullmerge 合并失败,并产生覆盖问题;那么我们必须先解决冲突,之后才能 push

  • 单人 push 远程分支的已有代码而导致冲突,可能产生覆盖现象

pull 之后,Git 首先发现当前工作区的 a.txt 与远程分支的 a.txt 同一位置的代码有冲突,于是便报出合并失败,可能会覆盖的问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fcamp3n4-1657787834735)(git-media/git push 覆盖冲突-1.png)]

解决方法:先将本地修改未 push 的代码执行 add commit push 一系列流程之后,再进行 pull 操作

此时,pull 下来的代码与本地仓库的代码具有冲突问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TcHcF54y-1657787834735)(git-media/git push 覆盖冲突-2.png)]

需要手动择优处理,与上述问题的解决方案是一样的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ewQC4e2h-1657787834736)(git-media/git push 覆盖冲突-3.png)]

最后,再执行一次 add commit push 操作,完成!

常用命令

clone 命令

clone 命令的作用是 克隆复制 某一个 Git 地址(ssh://, http(s)😕/, git://)上的远程仓库到本地。

-b 克隆分支
git clone -b [branch-name] [git 地址]

作用:克隆 git 远程仓库上的指定分支

-o 配别名
git clone -o [newName] [git 地址]

作用:克隆 git 远程仓库的同时为其配置别名【默认 origin

remote 命令
add 添加远程仓库
git remote add <别名> <git 地址>

作用:向本地添加一个 git 地址的远程仓库

注意:若一个本地仓库 add 两个相同 git 地址的远程仓库,假设设定了不同别名: origin \ test,一个 develop 指向 test 远程仓库,一个 master 指向 origin 远程仓库,对于这两个不同名但相同 git 地址的远程分支来说。在 add commit push 等一系列操作上,developmaster 是不冲突的两个操作对象,但是最终 push 之后的却是同一个远程仓库,其中存储的内容也会被另一个本地分支的 push 提交所覆盖,另外其他分支 pull 的也是被覆盖的内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LOie4Z50-1657787834736)(git-media/git remote add 情况.png)]

-v 显示别名
git remote -v

#origin  https://gitee.com/hkjGitee/test_remote.git (fetch)
#origin  https://gitee.com/hkjGitee/test_remote.git (push)

作用:显示远程仓库使用到 Git 别名及对应的 URL 地址

show 查看信息
git remote show [remote-name]

作用:查看 [remote-name] 远程仓库的更多信息

  • remote origin
    Fetch URL: https://gitee.com/hkjGitee/test_remote.git
    Push URL: https://gitee.com/hkjGitee/test_remote.git
    HEAD branch: master
    Remote branch:
    master tracked
    Local branch configured for ‘git pull’:
    master merges with remote master
    Local ref configured for ‘git push’:
    master pushes to master (up to date)
rename 更名
git remote rename [old-name] [new-name]

作用:重命名某个远程仓库

rm 删除
git remote rm [remote-name]

作用:移除某个 remote-name 远程仓库

fetch 命令

作用:拉取指定远程仓库最新的数据到本地中,等待下一步合并

git fetch [remote-name]

默认不加【remote-name】,则以 origin 为准进行拉取。

​ 注意:当抓取到新的远程跟踪分支时,本地不会自动生成一份可编辑的副本(拷贝)。 换句话说,这种情况下,不会有一个新的 serverfix 分支,只有一个不可以修改的 origin/serverfix 指针

–all 拉取所有
git fetch --all

作用:拉取所有远程仓库的最新数据

pull 命令

作用:拉取远程上有,本地没有的数据到本地中,并直接 merge 合并。等价于 fetch + merge 两个命令的合集

push命令
基本用法
git push

作用:向默认远程仓库(origin)推送数据

等同于 git push origin [branch]

指定远程仓库
git push [remote-name] [branch-name]

#git push origin master

作用:推送数据到目标远程仓库的指定分支上

详解

git push 其实是 Git 的简化写法;

​ 真实写法应该是 git push origin master:master,Git 会自动将分支名称 master 展开为 refs/heads/master:refs/heads/master。表示:推送本地的 master 分支,将其作为远程仓库的 master 分支

git push origin master ==> git push origin master:master

当然你也可以这样:

git push origin master:devMaster

表示:将本地的 master 分支推送到远程仓库的 devMaster 分支上

HEAD 写法
git push origin master:devMaster

这里的 master 其实可以用 HEAD 作为代替,表示推送当前引用的分支

git push origin HEAD:devMaster
问题案例

当存在多个 remote 在本地分支上时,在 push 提交的时候需要指明提交的目标远程仓库及对应的分支,若直接 push 不指定目标仓库及分支,则会出现混乱的问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YEYheko3-1657787834737)(git-media/git push remote HEADbranch.png)]

这里的 HEAD 就是 develop ,避免 HEAD 头指针与分支指针分离,可从 reflog 中查看。

由此可知:Git 所有的操作,不论是HEAD、分支【本地、远程】、标签、commit 提交,其实都是单独的个体对象,它们之间产生的关联都是可以随时任意改变的,只要符合 Git 系统的规定,随便玩

-u 提交指定远程分支
git push -u [remote-name] [branch-name]

作用:当新建了本地分支准备 push 时,通过 -u 参数来指定要关联未创建的远程分支,并创建对应的跟踪分支来顺利推送数据

  • branch --set-upstream-to 不同的是,前者需要已有远程分支,push -u 则会自己创建。
–set-upstream 指定远程分支

​ 场景:git 提交推送到远程出现 报错 The current branch xxx/xxxx has no upstream branch.【没有上游分支】

​ 原因:没有和远方的仓库关联 (找不到家)推送不上去。

​ 解决办法:通过 git push -ugit push --set-upstream [remote] [branch] 来解决。

名词解释:upstream => 上游

git push --set-upstream <remote> <branch>

git push -u <remote> <branch>

常见于:

​ 当 remote add 了若干个远程仓库而导致本地仓库的上游分支不知道是哪个远程分支时,就会导致 push 的时候不明确目标分支,而产生 The current branch master has no upstream branch. 问题【当前分支没有上游分支】,这种情况,需要我们在 push 的时候明确提交的目标分支。

这种情况,是因为本地分支提交时没有目标分支而导致无法自动创建跟踪分支进行同步绑定的问题

–delete 删除远程分支
git push [remote-name] --delete [branch-name]

作用:删除目标远程仓库的指定远程分支,下一步需要删除本地跟踪分支。

Pull Request

​ 如果你想要参与某个项目,但是并没有推送权限,这时可以对这个项目进行“派生”(Fork)。 派生的意思是指,GitHub 将在你的空间中创建一个完全属于你的项目副本,且你对其具有推送权限。通过这种方式,项目的管理者不再需要忙着把用户添加到贡献者列表并给予他们推送限。 人们可以派生这个项目,将修改推送到派生出的项目副本中,并通过创建合并请求(Pull Request)来让他们的改动进入源版本库。

基本流程
  1. 从 master 分支中创建一个新分支 (自己 fork 的项目)

  2. 提交一些修改来改进项目 (自己 fork 的项目)

  3. 将这个分支推送到 GitHub 上 (自己 fork 的项目)

  4. 创建一个合并请求

  5. 讨论,根据实际情况继续修改

  6. 项目的拥有者合并或关闭你的合并请求

注意点

每次在发起新的 Pull Request 时 要去拉取最新的源仓库的代码,而不是自己 fork 的那个仓库。

  • git remote add <shortname 源仓库> <url 源仓库>

  • git fetch 远程仓库名字

  • git merge 对应的远程跟踪分支

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值