PUSH 提交
在Github上创建远程库后,进入仓库页面,获取HTTPS / SSH 。Git支持多种协议,但通过ssh
支持的原生git
协议速度最快。
如果是已创建的仓库,可以在Clone or download 按钮下获取
根据github的提示,创建一个新库时的操作如下:
//…or create a new repository on the command line
git init
git add README.md
git commit -m "first commit"
git remote add origin 【这里换成远程库的 HTTPS/SSH】
git push -u origin master
git push origin与git push -u origin master的区别
- $ git push origin 将当前分支推送到origin主机的对应分支。
- $ git push 不带任何参数的git push,默认只推送当前分支,这叫做simple方式。
- $ git push -u origin master 将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。
此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。
保存远程库地址别名
提交到远程库
CLONE 克隆
git clone [远程库地址 HTTPS/SSH]
效果:
- 完整地将远程库下载到本地
- 自动创建远程地址别名
- 初始化本地库(/.git 文件夹)
关于使用SSH连接时报错
问题描述
//错误信息
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
上面以SSH方式访问用项目出现权限问题
设置SSH免密登录
1.首先,如果你没有ssh key的话,在git.bash窗口输入
ssh-keygen -t rsa -C [邮箱地址] //注意大小写
途中会让你输入密码啥的,不需要管,一路回车即可,会生成你的ssh key。(如果重新生成的话会覆盖之前的ssh key)
操作成功后会在C:\Users\Administrator用户目录下生成一个.ssh目录,Id-rsa是你的私钥,id_rsa.pub是公钥,内容如下:
2.然后再ternimal下执行命令:
ssh -v [email protected]
最后两句会出现:
3.这时候再在ternimal下输入:
ssh-agent -s
然后会提示类似的信息:
4.接着再输入:
ssh-add ~/.ssh/id_rsa
这时候应该会提示:
Identity added: ...(这里是一些ssh key文件路径的信息)
如果出现错误提示:
Could not open a connection to your authentication agent.
请执行命令:
ssh-agent bash
再执行即可。
关于 ssh-agent 和 ssh-add 命令
ssh-agent是管理多个ssh key的代理,受管理的私钥通过ssh-add来添加
好处1:不用重复输入密码。
好处2:不用到处部署私钥
5.打开你刚刚生成的id_rsa.pub,将里面的内容复制,进入你的github账号,在settings->SSH and GPG keys->new SSH key,title随便取一个名字,然后将id_rsa.pub里的内容复制到Key中,完成后Add SSH Key。
6.验证Key
在ternimal下输入命令:
ssh -T [email protected]
提示:Hi xxx! You've successfully authenticated, but GitHub does not provide shell access. 表示配置成功。
PULL 拉取
git pull
命令其实是 git fetch
和 git merge
操作的结合。
git fetch
git fetch origin master //将远程仓库内容下载到本地库,但未合并分支
将更新git remote 中所有的远程仓库所包含分支的最新commit-id, 将其记录到.git/FETCH_HEAD文件中
git fetch更新远程仓库的方式如下:
git fetch origin master:tmp
//在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支
git diff tmp
//来比较本地代码与刚刚从远程下载下来的代码的区别
git merge tmp
//合并temp分支到本地的master分支
git branch -d temp
//如果不想保留temp分支 可以用这步删除
FETCH_HEAD: 是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。
commit-id:在每次本地工作完成后,都会做一个git commit 操作来保存当前工作到本地的repo, 此时会产生一个commit-id,这是一个能唯一标识一个版本的序列号。 在使用git push后,这个序列号还会同步到远程仓库。
git pull
git pull <远程主机名> <远程分支名>:<本地分支名>
//取回远程主机某个分支的更新,再与本地的指定分支合并。
多人协作
加入团队
大多数情况我们是需要多人完成同一个项目。当另外你的同事在另外一台电脑上clone了你的项目,忙碌了一天后准备把他的劳动成果push到远程库时,会发现报如下错误:
这是因为该账户还没有加入团队,此时你可以在项目的远程仓库下邀请该账号加入
需要将邀请链接发给你的同事,并在他的github账号下登录后访问该链接,点击同意就可以了。
此时再输入git push origin master
命令时发现不需要再输入密码了。这里需要解释一下,其实Git本身并不保存密码,而是windows自带的凭据管理器保存了该信息,可以在控制面板搜索该功能进行修改。
解决冲突
如果不是基于Github最新版所做的修改,不能推送,先用git pull
把最新的提交从origin/dev
抓下来,然后,在本地合并,解决冲突,再推送。
多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
总结
- 查看远程库信息,使用
git remote -v
; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; - 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。
跨团队合作
需要先以乙方团队的账号对项目仓库进行Fork操作,这时该项目相当于在乙方团队账号下进行了备份,该库就相当于乙方团队的,操作和之前都一样。
当乙方团队需要将自己的远程库版本信息退送给甲方团队时,可以使用Pull request 进行推送。
参考文献
git push origin与git push -u origin master的区别
Permission denied (publickey). fatal: Could not read from remote repository.1
Permission denied (publickey). fatal: Could not read from remote repository.2
Permission denied (publickey). fatal: Could not read from remote repository.3