目录
git是分布式版本管理软件,可以在本地操作,也可以在网络操作。但是如果要进行协作,最后肯定要是在网络进行的。在这里我们利用全球最大的git版本管理网站github为例,介绍一下git在网络上的应用。
1.SSH加密设置
github不是谁都可以上传代码,必须通过一定的认证才可以上传。这样也可以理解,不然阿猫阿狗也给你上传代码了。而这个认证,就是SSH加密传输,因此需要先做一些设置。
1.1 生成本地秘钥
ssh-keygen -t rsa -C “注册 github 的邮箱”
我们可以看到红色框的文件,前往相应的目录中打开该文件
可以注意最后有邮箱地址
1.2 github认证
在gihub.com中,选择
github.com -> 用户 -> setting -> SSH and GPG keys -> New SSH keys
然后把那堆文字粘贴到Key框里,最后在Title上输入自己电脑的名字(尽量不要随便取名字)
然后就可以看到自己的电脑SSH Key已经上传到github了
完成了以上操作,说明你的远程github账号,允许了生成SSH Key的电脑访问,也就是可以上传代码到github了。
2 创建并选择远程仓库
创建远程仓库非常简单,只需要在github页面中找到new repository,写个名字就可以了,如创建了以下的仓库
https://github.com/aimxu/testgit
这里面的aimxu指的是用户名,testgit指的是远程仓库的名字,是不是很简单明了?
进入远程仓库,就可以看到大概这样的页面,选择红色框,红色框就是这个repo的地址,有两种地址
[email protected]:aimxu/testgit.git # ssh方式
https://github.com/aimxu/testgit.git # https方式
两种方式都可以,这里用ssh方式,下同
https方法有点麻烦,总是会提示输入用户名密码
3 github管理代码
终于到了这一步了,终于可以使用github来管理代码了
3.1 代码上传
在上传代码之前,必须先建立一个上传的连接
git remote add origin [email protected]:aimxu/testgit.git
这里的意思是添加了一个名字叫origin(约定俗成)连接,连接到git@//github.com:aimxu/testgit.git
后面的地址就是从上一步获得地址,这里使用的SSH方式的地址
开始上传
git push -u origin master
-u 用了这个参数,以后push就不用带后面那堆东西了
origin 表示连接的名称,要跟上一条命令对应
master表示分支
wait,分支?是的后面会讲到什么是分支
此时可以看到
再看看github
多了一个hello.c文件,多了一些commit,表示我们成功上传了。
3.2 代码下载
想要下载代码,可以直接用git pull命令,该命令是把远程仓库中的代码下载到本地仓库
git pull
4 分支管理
分支管理不是远程仓库特有的,本地仓库也可以用分支
什么是分支?分支就是git用来解决进行多人远程协作的办法(其实基本所有的版本管理软件都是这样的)
从上面的图可以看出,我们创建仓库的时候有一个主线master。这条线是最稳定的最主要的。一般不要随便修改,如果有人想修改其中一个部分,可能就要使用到分支管理了,等到调试完成,再把它合并到master里
4.1 创建分支
好,事不宜迟,我们试一下吧,假设我们现在觉的 hello world 太简单,想加一些功能,比如加一个加法功能,我们可以这样做
首先创建一个分支,创建分支的方法有很多,例如checkout、switch、branch等,我们在这里统一使用switch
git switch -c feature1
创建名字叫 feature1 的分支
-c 表示创建 create的意思
再调用git branch可以看到分支情况
git branch
绿色,前面有*的表示当前使用的分支,还可以看后面的蓝色的(feature)
这样,就不会影响到master
接着添加内容,注意这时候是添加到 feature1 分支,而不是master。
git status
git add .
git commit -m "add plus calculation"
可以看到,这时候 feature1 分支内容是多了 add plus 的记录的
4.2 合并分支
如果觉得改得差不多,可以合并分支,把 feature1 的内容合并到master中
但是首先先要切换到master分支,然后再合并,如果feature1的工作已经全部完成,还可以删除分支。
git switch master
git merge feature1
git branch -d feature1
git branch
这时候再看一下分支的情况,只剩下master一个分支了。
详细流程可以看这几幅图(来自廖雪峰个人网站,创建与合并分支)
(1)只有一个分支master
(2)创建新的分支dev
(3)dev分支添加新的内容
(4)把dev合并到master并删除dev
最后可以把它push上去
git push
可以看到新的代码也已经上传到远程仓库了
后记:代码整合
在第一次push代码的时候,可怕的的事情还是发生了(一堆乱七八糟的英语,还有红颜色!肯定不是什么好事)
为什么会出现上面的error,我们仔细读一下,大概的意思是
远程仓库上包含本地没有的东西,有可能是其他人上传了新的代码,现在要我们先整合(integrate)远程跟当地的代码。
这里面叫我们用,git pull 试一下
原来是这样,还要先 pull(拉)一下
但是在 pull 之前我们必须要先了解这个 pull 的含义,pull包含两个动作
git fetch # 从远程仓库中提取代码
git merge # 把提取的代码跟本地的代码整合在一起
我们使用 fetch 提取远程代码
git fetch
然后再利用diff查看有什么不同
git diff HEAD FETCH_HEAD
diff 感觉是很久远的东西了
HEAD 表示的是当前本地最新代码
FETCH_HEAD 表示刚在github下载的代码
从图中可以看出,远程代码多了一个叫做 README 的文件(绿色)
本地代码比远程代码多了hello.c文件(红色)
再比较一下github和本地
如果觉得两个文件都是要的,那我们就可以merge了
git merge origin/master
但是出现了上面的问题。这是一般直接使用pull命令
git pull origin master --allow-unrelated-histories
--allow-unrelated-histories 参数允许把两段不相干的分支强行合并
或者还可以这样
开始初始化仓库的时候,就直接先clone远程代码
git init
git clone [email protected]:aimxu/testgit.git
这样就不会产生以上的问题了