让本地工厂和远程工厂进行关联
创建完远程工厂之后,就需要考虑如何和本地工厂进行交互。此时会有几种情况:
- 本地工厂已经存在,远程工厂未进行初始化
- 本地工厂已经存在,远程工厂已经进行初始化
- 本地工厂不存在,远程工厂未进行初始化
- 本地工厂不存在,远程工厂已经进行初始化
接下来我们将分别就这四种情况来进行模拟.
本地工厂已经存在,远程工厂未初始化
由于本地工厂已经存在,我们需要做的事情就是让本地的工厂关联远程工厂并且完成项目的上传。这里我创建了四个远程工厂分别模拟各种不同的情况:test1_empty用来模拟本地工厂已经存在,远程工厂未进行初始化。
我们首先创建一个本地工厂
E:\study\git_2016\10\test1_empty>git init
Initialized empty Git repository in E:/study/git_2016/10/test1_empty/.git/
E:\study\git_2016\10\test1_empty>echo a > a.txt
E:\study\git_2016\10\test1_empty>git add .
E:\study\git_2016\10\test1_empty>git commit -m "init"
[master (root-commit) f5a3211] init
1 file changed, 1 insertion(+)
create mode 100644 a.txt
如果希望关联远程工厂,需要使用git remote add origin https://github.com/ynkonghao/test1_empty
来完成远程工厂的关联,这里origin表示为远程工厂设定一个名称,当添加完这个文件之后可以通过.git文件夹中的config文件查询这个添加的数据
[remote "origin"] -->remote add就等于将origin这个名称对应到一个git的地址中
url = https://github.com/ynkonghao/test1_empty
fetch = +refs/heads/*:refs/remotes/origin/*
url表示origin所对应的远程工厂名称,fetch在获取远程工厂数据时会根据这个引用名称来获取。设置完成关联之后使用git push origin master
完成提交,这个命令表示会把本地工厂的数据提交到origin这个远程工厂的master的分支中。第一次提交会让我们输入用户名和密码,在window的命令提示符中会自动记住用户名和密码,以下是完整的提交代码
E:\study\git_2016\10\test1_empty>git remote add origin https://github.com/ynkonghao/test1_empty
E:\study\git_2016\10\test1_empty>git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 203 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/ynkonghao/test1_empty
* [new branch] master -> master
提交完成之后我们发现远程工厂已经有了本地工厂数据。
这里我们需要再介绍一个命令git push --set-upstream origin master
,使用这个命令可以将本地分支master注册到 .git\config 文件中,之后再用 git push 就可以完成推送,这种方式也可以设置在master之外的其他分支上。
简单总结一下流程:
1、创建远程工厂,不进行初始化
2、在本地工厂中通过git remote add origin https://github.com/ynkonghao/xxx
将远程工厂添加到本地的config中
3、通过命令git push origin master
完成数据的提交,当使用了git push --set-upstream origin master
之后,就可以注册master分支,以后直接使用git push
就可以完成数据的提交。
本地工厂已经存在,远程工厂已经初始化
这种方式的区别是远程工厂已经完成了初始化,这就导致远程工厂已经有了自己的第一次版本和分支,这在同步的时候会有一些区别
此时新申请一个远程工厂test1_init,并且选择Initialize this repository with a README
进行初始化操作,初始化完成之后我们会发现有一个readme.md文件。
我们新建一个本地工厂。之后使用命令进行提交
E:\study\git_2016\10\test1_init>git remote add origin https://github.com/ynkonghao/test1_init.git
E:\study\git_2016\10\test1_init>git push --set-upstream origin master
To https://github.com/ynkonghao/test1_init.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'https://github.com/ynkonghao/test1_init.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
此时发现并没有正常的完成提交操作,这是因为远程工厂已经存在了一个master分支,而且已经存在了一次提交,此时将会和本地的工厂冲突,此时需要先把远程工厂的数据更新下来,之后再完成提交,获取远程工厂的数据的命令是git pull origin master
E:\study\git_2016\10\test1_init>git pull origin master
warning: no common commits
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/ynkonghao/test1_init
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
fatal: refusing to merge unrelated histories
此时依然报错,在执行pull命令的时候,不仅会从远程工厂获取信息,还会合并到本地的分支中,但是本地的分支和远程的分支还没有关联,所以无法合并。第一次需要在命令中加入参数allow-unrelated-histories
E:\study\git_2016\10\test1_init>git pull origin master --allow-unrelated-histories -->在pull的时候允许非关联的操作
From https://github.com/ynkonghao/test1_init
* branch master -> FETCH_HEAD
Merge made by the 'recursive' strategy.
README.md | 1 +
1 file changed, 1 insertion(+)
create mode 100644 README.md
E:\study\git_2016\10\test1_init>git log
commit 3395ef655fe41206a1fa7d75cff4cbbf3ff95011
Merge: ae3cab6 263dab7
Author: ynkonghao <ynkonghao@gmail.com>
Date: Wed Mar 22 17:28:27 2017 +0800
Merge branch 'master' of https://github.com/ynkonghao/test1_init
commit ae3cab6f5c9daced1fdbdf9af3caaef2be06c467
Author: ynkonghao <ynkonghao@gmail.com>
Date: Wed Mar 22 15:59:19 2017 +0800
init
commit 263dab7c88a86dec7aac4edc4d5481ec730450c8
Author: ynkonghao <ynkonghao@gmail.com>
Date: Wed Mar 22 15:57:21 2017 +0800
Initial commit
此时已经顺利完成了pull操作,通过git log 查询一下日志发现一共三个版本,第一个版本是远程工厂的Initial commit,第二个版本是本地工厂的init,第三个版本也就是最新的版本是两者合并的版本。 再继续使用git push origin master
命令即可完成本地工厂的提交
E:\study\git_2016\10\test1_init>git push --set-upstream origin master -->将master分支添加到配置中,以后只用使用git push完成提交
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 494 bytes | 0 bytes/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://github.com/ynkonghao/test1_init.git
263dab7..3395ef6 master -> master
Branch master set up to track remote branch master from origin.
以上就是本地工厂和远程工厂都已经有版本时的操作,主要的关键点就是需要先pull之后再进行push,再次对流程进行一下总结:
1、创建远程工厂并且选择初始化复选框
2、建立本地工厂并且完成初始化和提交操作
3、使用git remote add
命令添加远程工厂的对应
4、使用git pull origin master --allow-unrelated-histories
从远程工厂获取信息并且完成分支的合并
5、使用git push origin master
完成数据的提交。
本地工厂不存在,远程工厂已初始化
在实际的应用中,也有可能是首先在建立好远程的工厂,之后更新到本地,这种方式我们一般都会先对远程工厂进行初始化,之后使用git clone
命令完成同步。
首先我们先建立一个远程工厂test2_init,并且对这个工厂进行初始化操作。接着在本地创建一个文件夹,用来获取远程工厂的信息,之后使用git clone https://github.com/ynkonghao/test2_init
可以直接获取远程工厂信息。
E:\study\git_2016\10>git clone https://github.com/ynkonghao/test2_init -->直接从远程工厂克隆项目到本地工厂
Cloning into 'test2_init'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
E:\study\git_2016\10>dir
驱动器 E 中的卷没有标签。
卷的序列号是 923E-C860
E:\study\git_2016\10 的目录
2017/03/23 周四 18:26 <DIR> .
2017/03/23 周四 18:26 <DIR> ..
2017/03/22 周三 15:46 <DIR> test1_empty
2017/03/22 周三 17:28 <DIR> test1_init
2017/03/23 周四 18:26 <DIR> test2_init -->直接把整个工厂都克隆到本地
0 个文件 0 字节
5 个目录 213,142,781,952 可用字节
如上所示,当使用clone之后,会在当前目录中创建一个test2_init的文件夹,这个文件夹中内容就是远程工厂的内容,进入test2_init 文件夹通过git log
我们可以发现目前工厂中master分支上已经有了一次提交。查询.git文件夹中的config文件,我们同样发现已经完成了远程工厂origin工厂的设定,所以此时只要完成代码编写之后,通过push即可完成提交(此时也把master分支支持到配置文件中了,所以只要使用git push
就可以完成提交)。
E:\study\git_2016\10\test2_init>git lg --->已经存在一个版本了
* b0083a7 - (HEAD -> master, origin/master, origin/HEAD) Initial commit (7 hours ago) <ynkonghao>
E:\study\git_2016\10\test2_init>echo aa > a.txt
E:\study\git_2016\10\test2_init>git add .
E:\study\git_2016\10\test2_init>git commit -m "add aa file"
[master 90f3247] add aa file
1 file changed, 1 insertion(+)
create mode 100644 a.txt
E:\study\git_2016\10\test2_init>git push --->完成数据的提交
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 270 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/ynkonghao/test2_init
b0083a7..90f3247 master -> master
以上方式就是先建立远程工厂之后初始化到本地工厂的操作,整个操作简单直接,需要注意的是第一个版本是在远程创建的,接下来在讨论远程工厂没有初始化时的操作前,还是总结一下操作步骤。
1、 创建远程工厂并且进行初始化
2、 直接使用git clone https://github.com/ynkonghao/test2_init
将远程工厂克隆到本地
3、 此时直接在工厂完成版本管理之后,使用git push
即可以完成提交
本地工厂不存在,远程工厂未进行初始化
这种情况同样也不常见,操作上也和刚才的没有区别,唯一的区别就是master分支需要在本地创建而已,一些命令的提示不一样。
首先创建test2_empty远程工厂,这里就不选择初始化操作,此时这个工厂没有任何的版本信息,也不存在任何的分支,我们在本地执行以下clone操作。
E:\study\git_2016\10>git clone https://github.com/ynkonghao/test2_empty
Cloning into 'test2_empty'...
warning: You appear to have cloned an empty repository. -->警告远程工厂是空工厂
E:\study\git_2016\10>cd test2_empty
E:\study\git_2016\10\test2_empty>git lg -->没有任何版本和分支信息
fatal: your current branch 'master' does not have any commits yet
E:\study\git_2016\10\test2_empty>echo a > a.txt
E:\study\git_2016\10\test2_empty>git add .
E:\study\git_2016\10\test2_empty>git commit -m "init" -->第一个版本是在本地创建的
[master (root-commit) 6185bf5] init
1 file changed, 1 insertion(+)
create mode 100644 a.txt
E:\study\git_2016\10\test2_empty>git push -->同样可以使用git push提交到远程工厂
Counting objects: 3, done.
Writing objects: 100% (3/3), 203 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/ynkonghao/test2_empty
* [new branch] master -> master
以上的操作和远程有工厂的操作完全一致,只是第一个版本是在本地创建的。
在实际的开发中究竟用那种方式呢:其实都一样,只是有些时候比较强调git-flow的分支管理模型,希望所有的分支都基于gitflow的流程走,这是远程的仓库就不要进行初始化操作即可。
以上我们探讨了四种本地工厂和远程工厂交互的方法,如果本地工厂已经存在,之后要同步到远程工厂,这里建议远程工厂不要进行初始化,这样操作会简单一些。如果先建立的远程工厂之后clone到本地工厂,这种情况,远程工厂是否进行初始化影响不大,都可以使用。
下一部分我们将探讨一下如何使用github创建自己的blog和ssh的认证操作。
网友评论