一、远程基本操作
基本的配置远程仓库有两个命令:
git remote add origin git@github.com:ZXZxin/gitlearn.git;git push -u origin master;
这里先演示环境搭建,也就是和github上一个仓库远程关联起来,这里遇到了一些坑,记录一下:
坑解决的两篇文章:
普及:
可以使用
git remote show origin,查看详细的远程remote信息(注意origin是一个别名,不一定要这个名字)git commit am '....'只会将已经纳入版本库的文件add并提交,新增的文件不会add。
二、协作
一开始master和origin/master一样。
然后我们需要再调用一次git push来同步远程,这样id就会相同了。
解释:
git内部会自己维护origin/master这个分支,我们不能操作,但是可以执行git checkout origin/master,虽然这个命令不会报错,但是我们实际上只是切换到了提交的那个点(commit-id)的位置上,也就是和之前那个游离的状态一样。我们可以在这个commit-id位置上进行修改,但是切换的时候要先stash一下。
来看一下上面的原理和过程:
初始状态:
然后我们调用了增加或者修改元素,调用git add和git commit之后(这时候还没有push),就会变成下面这样: (这时候git会告诉我们master比origin/master提前了一步)
然后我们调用git push,注意这个过程做了两步:
将本地的内容push到远程了;
将
origin/master由上面的①指向了②;
三、Git协作实战
模拟环境:
有两个人协作,一个张三,一个李四,张三的仓库就是我们之前用的那个
gitlearn,李四是直接从张三的远程仓库git clone下来的;然后我们再将张三的
gitlearn和李四的gitlearn2都设置一下user.name和user.email;
李四先git clone下来:
然后将张三和李四的用户名和密码配置一下:
现在我们在gitlearn添加一个c.txt文件,然后git push到远程仓库,然后在gitlearn2这边输入git remote show origin来查看区别:
remotes/origin/HEAD -> origin/master啥意思呢?
在clone完成之后,Git 会自动为你将此远程仓库命名为origin(origin只相当于一个别名,运行git remote –v或者查看.git/config可以看到origin的含义),并下载其中所有的数据,建立一个指向它的master 分支的指针,我们用(远程仓库名)/(分支名)这样的形式表示远程分支,所以origin/master指向的是一个remote branch(从那个branch我们clone数据到本地)
也就是origin/master是用来追踪远程分支的。
然后我们在gitlearn2里面执行git pull,将远程的最新更新拉去过来。查看最新的更新信息。
上图的过程:
下面展示会发生冲突的情况:
张三先修改了
a.txt的第二行,然后push到了远程;李四也修改了
a.txt的第二行,然后也想push到远程,就会报错;
此时李四要先git pull。
现在展示李四的操作:
但是此时还不够,我们需要调用git add来标识已经解决了冲突;
总结git add的三个作用:将未追踪的文件(新建的文件)加入到暂存区;
将已追踪的文件(修改的文件)加入到暂存区;
解决完冲突之后,调用
git add标识这个文件已经解决了冲突(git merge的时候)。
此时我们还需要将解决冲突之后的代码git push 到远程.
整个过程的流程:
一般在git push之前都要进行git pull操作。git pull = git fetch + git merge。
git fetch会直接将代码拉到origin/master,但是和当前本地的master不会冲突。但是git merge就会产生冲突。
下面展示分别使用git fetch和git merge来操作:
先使用git fetch,不会产生冲突:
接下来我们在李四这边使用git merge手动解决冲突并push:
最后在张三也进行git pull即可。
关于远程git分支,远程(注意不是本地分支)通常有如下几种:
1、
master分支: 很稳定的分支;2、
test分支: 测试分支;3、
develop分支: 变化最频繁的分支;s4、
hotfix分支: 紧急bug需要修复;
原文:Java架构笔记