克隆远程仓库
-
通过https链接克隆
-
通过ssh链接克隆
使用ssh-keygen生成密钥对,此命令不带参数时默认生成RSA密钥对,此命令先是生成密钥,然后提示你输入密钥存放路径,
如果使用默认路径和密钥文件名称(/home/Administrator/.ssh/id_rsa)按下Enter键即可,接下来是提示你输入密码,
如果不想设置密码则按下Enter键即可,生成两个密钥如下:
然后将id_rsa.pub的内容复制,登陆到github,选择要添加公钥的仓库,点击该仓库的Setting:
点击Devlop Key:
添加完成后应该是这样:
然后使用ssh链接执行克隆命令:
注意:Git CMD工具中无法识别识别ssh命令,加了环境变量后可以识别,但是执行ssh-add命令总是失败,所以还是使用Git Bash
上面是创建密钥时使用默认路径和名称,如果使用自定义的文件路径和密钥文件名称则需要使用ssh代理,将密钥添加到ssh代理
中,否则,连接到github时总会被拒绝,因为本地找不到密钥首先对应的文件夹出打开GitBash:
生成一个名称为Test的无密码的密钥:
在接着使用eval $(ssh-agent -s)开起ssh agent:
然后使用ssh-add命令将密钥加入代理:
然后就可以使用ssh链接克隆了
注意:GitBash窗口一关闭,密钥代理也随之关闭,下一次打开GitBash窗口后需要重新添加Github也给出了如何通过ssh链接连接的方法和步骤:
https://help.github.com/en/articles/connecting-to-github-with-ssh
跟踪远程分支
克隆远程仓库后,远程仓库的名称默认为origin,本地当前分支和远程仓库中正在使用的分支是一样的。
例如:从Github上克隆一个库,并跟踪分支
此时GitHub上这个库虽然有多个分支,但正在使用的分支为v1.x,然后在本地执行克隆,然后查看状态:
可以看出远程库的名称默认为origin,并且本地当前分支为v1.x和Github上一致,虽然此项目有多个分支,但是克隆到本地后只有v1.x一个分支:
当我们切换到远程仓库中的其它分支时,git会在本地创建一个与远程仓库同名的分支:
如上图所示本地的master被设置为跟踪远仓库中的master分支,远程仓库中的master分支也就成为了本地master仓库的上游支。
还可以使用git checkout --track 远程库/远程分支
命令来告诉git跟踪远程仓库的某一个分支,此时Git的行为git checkout 远程分支
这个命令一致,也在本地创建一个与远程分支同名的本地分支,然后将本地仓库中的文与远程仓库中的文件保持一致;
例如:跟踪v0.6分支
上面两个跟踪命令都是在本地建立一个与远程仓库中分支同名的分支,如果想在本地建立一个分支跟踪远程仓库中的某个分支,但是又不想和要跟踪的远程分支同名,那么可以使用git checkout -b 本地分支名称 远程库/分支
命令来自由命名本地分支名称;
例:在本地建立一个名为xxxx的分支并使其跟踪远程库的v0.8分支
我个人觉得追踪远程分支时,本地分支名称最好和远程分支名称一样,这样可以知道清晰的对应关系,免得弄混
如果想修改本地某个分支所追踪的远程分支,可以先切到这个分支,然后使用git branch -u 远程库/远程分支
或者 git branch --set-upstream-to 远程库/远程分支
命令来让这个本地分支追踪其它远程分支
例:让本地分支xxxx追踪其它的远程分支
如果想查看本地分支与远程库分支的对应关系,可以使用git branch -vv命令
例:
关联远程仓库
远程仓库是指不在本地,存在于其它网络中的Git仓库,例如github,
可以使用 git git remote add 远程库的名称 远程仓库的url
关联一个添加远程仓库到本地
关联远程仓库时本地要有一个Git仓库,否则Git会报如下错误:
关联远程仓库后并不像克隆远程仓库那样,本地会有一个分支对应远程仓库的当前分支,本地仓库中没有任何远程仓库的
分支数据
从远程仓库中抓取与拉取数据到本地
-
从远程仓库抓取分支数据
添加远程仓库后,本地仓库并没有远程仓库的任何分支数据,可以使用git fetch 远程库名称
命令将远程库的所有分支
抓取到本地
例:添加远程库并抓取数据
此时在执行git checkout master指令
,则本地master分支就追踪到远程仓库的master分支:
现在在做一个小测试:
此时master分支中有一个masterTest文件,此文件在本地和远程仓库中的内容相同:
在github上修改这个文件内容:
然后在github上提交这个修改:
然后在本地切换到master分支下,使用git fetch命令抓去分支数据:
然后打开本地目录下的masterTest文件:
在github上修改了这个文件后,虽然也使用了git fetch命令抓取数据成功,但是masterTest的文件内容却没有改变,
虽然远程仓库的数据被抓取下来,但是并未合并到本地的master分支中,所以masterTest文件内容不变,那么使用git merge
命令进行合并:
此时masterTest文件内容已经和远程仓库的内容一样:
-
从远程仓库拉取分支数据
现在接着在github上修改masterTest文件的内容:
然后提交修改,接着使用git pull 远程仓库名称
拉取远程仓库的分支数据:
然后查看本地目录中masterTest文件内容:
可以看出此时本地文件内容和远程仓库已经一致
git pull
命令相当于先执行了一次git fetch
,然后紧接着执行了一次git merge
注意:上例中git pull命令后面没有加上远程仓库名称时,因为处于master分支上,git只会拉取本地master分支对应远程
仓库中的分支数据,该仓库中的其它分支不拉取;当git pull命令后带有远程仓库的名称时则拉取整个远程仓库的所
有分支到本地并合并
推送分支
-
推送本地分支修改到上游分支(远程仓库中被跟踪的分支)
例:修改本地master分支的masterTest文件然后推送到远程仓库的master分支上
在masterTest文件中添加一行内容:
然后本地提交修改后在使用git push
命令推送到远程仓库:
此时Github上的master分支也已经得到更新:
但是推送并不一定都是一帆风顺,现在假设有这样一个场景:另一个人也在它的本地仓库中修改了masterTest文件,然后向github
推送了修改,而此时我也修改了masterTest文件,然后在向github推送是就会失败(这里为了模拟这种情况,我直接在github上修改masterTest文件,在文件末尾添加一行,模拟另一个人的行为),我在本地也在masterTest文件末尾添加一行,然后提交修改,并向
github推送修改:
此时git提示远程仓库拒绝了推送,因为远程仓库的master分支包含了本地master分支没有的内容,先要进行整合,然后在推送
此时可以使用git pull 命令将远程仓库的master分支数据和本地master分支数据进行合并:
此时远程仓库master分支下的masterTest文件和本地master分支下的masterTest文件在合并时有冲突,这个冲突解决的方法
和Git本地两个分支合并时冲突解决方法相同,在这里就不对masterTest文件进行修改了,直接再次提交即可解决冲突,然后在向
github上推送即可:
-
推送本地新建分支到远程仓库中
我们在本地新建了一个分支,然后使用git push 远程仓库 本地分支名称
将其推送到github上:
在github上查看一下:
本地新建分支就被推送到github
删除远程分支
使用git push 远程仓库 --delete 分支名称
命令可以删除远程仓库上的分支,但是本地分支依旧存在:
如果要想把本地分支删除,则需要先切换到其它分支,然后在执行git branch -d 分支名称
命令即可删除本地分支