打 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 +0800v1
diff --git a/init b/init
new file mode 100644
index 0000000…626799f
— /dev/null
+++ b/init
@@ -0,0 +1 @@
+v1
show
命令除了能查看tag
具体信息之外,还可以查看tree
、commit
、blob
对象。
切换标签
$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 也为该体系提供了一套基本的团队协作流程。根据职责主要分为 项目负责人
、团队开发人员
及其他成员。
项目负责人
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、添加远程仓库并配置别名
远程仓库主涉及到 remote
、push
、pull
、fetch
等常用指令。
$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。
远程跟踪分支
在 Git 本地仓库 push 到远程仓库实现同步之后,会根据本地仓库的分支附带生成远程跟踪分支。
远程跟踪分支对应本地工作的分支【默认 origin/master
分支】,意义就在于远程分支与本地分支保持同步工作,而若本地新建了一个 branch 分支,且 push 到 origin
远程仓库之后,也会相应的创建 origin/develop
远程跟踪分支。
若是使用
checkout
命令切换到远程跟踪分支,则会出现HEAD 分离头指针
的情况,这是因为checkout
指令只移动 HEAD 指向到origin/master
,而分支的指向还是在develop
上,导致了 HEAD 与 分支指向不同步。如图:
解决的办法是:在当前提交上重新创建一个分支,让 HEAD 指向 新分支,新分支指向 commit ,完成统一。
6、邀请成员加入团队,开始协同开发
在没有加入某个团队之前,你是没有任何权限的。
开发人员
1、克隆远程仓库到本地
$git clone [git 地址]
注:默认克隆时为远程仓库起的别名为 origin
在一开始 clone
远程仓库下来之后,在本地 master
分支没有做任何提交之前,是无法查看到任何信息的:
当你发生过一次提交之后,clone
会自动创建对应的远程跟踪分支并做一个 HEAD 变更的工作,被 git reflog
记录下来:
远程仓库名字 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
。
工作流程
简述
在 clone
克隆远程仓库时,Git 通常会自动创建一个名为 master
的本地分支来跟踪 origin/master
远程分支。这正是 git push
和 git pull
一开始就能正常工作的原因。
此时,
origin/master
跟踪分支会与master
本地分支同时存在并相互关联。
假设你有一个 Git 地址 [https://gitee.com/hkjGitee/test_remote.git] 。若执行
git clone
,clone
命令会自动将该远程仓库命名为origin
,拉取它的所有数据,创建一个指向它的master
远程分支的指针,并且在本地将其命名为origin/master
。Git 也会给你一个与origin/master
远程分支同步的master
本地分支,这样你就能在此基础上工作。
Local branch
是你工作的基础,当你在本地 master
分支做出一些修改工作时,它会继续向前行进,但是在此期间若你不与远程仓库通信,那么 origin/master
还是会在原来的位置上:
且如果有其他开发人员也从这条线开始 commit,那么你们的提交历史记录则会是不同的节点。
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
的,因为本地分支不知道要提交到哪里去。
如图:
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 也准备这么做时,会报出如下错误:
表示我们需要先
pull
拉取最新分支数据下来。
当 pull
之后,Git 首先发现当前工作区的 a.txt
与远程分支的 a.txt
同一位置的代码有冲突,于是需要我们手动解决冲突位置:
择优处理:
HEAD:本地分支的代码,94f1:远程分支的代码
解决冲突之后,直接
add
->commit
->push
正常提交流程即可。
覆盖
当我们 clone
了一个远程仓库,且工作期间有人 push
了新分支的数据,那么我们必须在 push
之前先 pull
拉取一下;此时,若我们要 push
的代码与远程分支上的已有代码产生冲突时,可能会导致 pull
中 merge
合并失败,并产生覆盖问题;那么我们必须先解决冲突,之后才能 push
。
- 单人
push
远程分支的已有代码而导致冲突,可能产生覆盖现象。
当 pull
之后,Git 首先发现当前工作区的 a.txt
与远程分支的 a.txt
同一位置的代码有冲突,于是便报出合并失败,可能会覆盖的问题:
解决方法:先将本地修改未 push 的代码执行
add commit push
一系列流程之后,再进行 pull 操作。此时,
pull
下来的代码与本地仓库的代码具有冲突问题:
需要手动择优处理,与上述问题的解决方案是一样的。
最后,再执行一次
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
等一系列操作上,develop
与 master
是不冲突的两个操作对象,但是最终 push 之后的却是同一个远程仓库,其中存储的内容也会被另一个本地分支的 push
提交所覆盖,另外其他分支 pull
的也是被覆盖的内容。
-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
不指定目标仓库及分支,则会出现混乱的问题:
这里的 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 -u
或 git 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)来让他们的改动进入源版本库。
基本流程
-
从 master 分支中创建一个新分支 (自己 fork 的项目)
-
提交一些修改来改进项目 (自己 fork 的项目)
-
将这个分支推送到 GitHub 上 (自己 fork 的项目)
-
创建一个合并请求
-
讨论,根据实际情况继续修改
-
项目的拥有者合并或关闭你的合并请求
注意点
每次在发起新的 Pull Request 时 要去拉取最新的源仓库的代码,而不是自己 fork 的那个仓库。
-
git remote add <shortname 源仓库> <url 源仓库>
-
git fetch 远程仓库名字
-
git merge 对应的远程跟踪分支