22.7 建立远程仓库
22.8 克隆远程仓库
22.9 分支管理
22.10 远程分支管理
22.7 建立远程仓库
1 首先到 https://github.com 注册一个账号
2 创建自己的git,点repositories 再点new
名字自定义,比如叫studygit 选择public 点 create repository
3 添加key:右上角点自己头像,选择settings,左侧选择SSH and GPG keys
左侧点New SSH key,添加新的ssh key
4 把linux机器上的~/.ssh/id_rsa.pub内容粘贴到这里
5 执行命令,生成公钥
ssh-keygen cat ./.ssh/id_rsa.pub
6 将cat到的内容,输出到github主页的公钥信息栏
有了公钥之后就能进行互相通信了
6.1 在本地(客户端)创建仓库 ,在仓库写入内容,将内容推送到远程仓库上面
准备工作:在本地(客户端)建立项目目录
# mkdir -p /data/git/gh-project01 # cd !$ cd /data/git/gh-project01 ls
6.2 本地仓库创建
本地仓库创建指南
…or create a new repository on the command line echo "# gh-project01" >> README.md git init git add README.md git commit -m "first commit" git remote add origin https://github.com/kevinxlau/gh-project01.git git push -u origin master Username for 'https://github.com': kevinxlau Password for 'https://[email protected]': Counting objects: 3, done. Writing objects: 100% (3/3), 221 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To https://github.com/kevinxlau/gh-project01.git * [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
解释:
git init
初始化仓库
git add README.md
建立文件
git commit -m "first commit"
commit操作
git remote add origin https://github.com/kevinxlau/gh-project01.git
此处用了https的连接方式,如果用ssh的话就能更好的直接互动了,相当于免密操作,因为刚才已经设置了ssh的匹对
git push -u origin master
推送到远程仓库
7 测试自定义推送文件
7.1 建立文件1.txt
[root@9F-VM1 gh-project01]# touch 1.txt [root@9F-VM1 gh-project01]# echo -e "111\n222\n333" > 1.txt [root@9F-VM1 gh-project01]# cat 1.txt 111 222 333
7.2 推送到远程仓库
# git add 1.txt # git commit -m "add 1.txt" [master 09e0188] add 1.txt 1 file changed, 3 insertions(+) create mode 100644 1.txt #git pust Username for 'https://github.com': kevinxlau Password for 'https://[email protected]': Counting objects: 4, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 276 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To https://github.com/kevinxlau/gh-project01.git 72948bc..09e0188 master -> master
查看是否推送成功
22.8 克隆远程仓库
mkdir lamp
cd lamp
git clone [email protected]:aminglinux/lanmp.git
它提示,会在当前目录下初始化一个仓库,并创建一个.git的目录,如下
Initialized empty Git repository in /home/lanmp/.
git/完成后,ls可以看到一个lanmp的目录
cd lanmp
vi lanmp.sh 编辑一下文件,然后提交
git add lanmp.sh
git commit -m "sdlfasdf"
然后再推送到远程服务端
git push
1 克隆前做的准备工作
创建克隆相关的目录并进入
mkdir test cd test
2 获得克隆地址后,进行克隆
git clone [email protected]:kevinxlau/gh-project-00.git 正克隆到 'gh-project-00'... remote: Counting objects: 6, done. remote: Compressing objects: 100% (3/3), done. remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0 接收对象中: 100% (6/6), done.
3 查看本地是否克隆到项目了
ls gh-project-00
4 同步测试
编辑命令,修改一下文件内容,
echo -e "111\n222\n333" > 1.txt git add 1.txt git commit -m "add 1.txt" # git push Counting objects: 4, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 302 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To [email protected]:kevinxlau/gh-project-00.git d22f536..275d339 master -> master
克隆成功
5 修改1.txt内容待同步
6 进行同步
同步前1.txt
# cat 1.txt 111 222 333
执行进行同步操作
# git pull remote: Counting objects: 3, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), done. 来自 github.com:kevinxlau/gh-project-00 275d339..53d5469 master -> origin/master 更新 275d339..53d5469 Fast-forward 1.txt | 2 ++ 1 file changed, 2 insertions(+)
同步后
# !cat cat 1.txt 111 222 333 444 555
7 done
22.9 分支管理
1 常用命令
git branch //查看分支 git branch * master
git branch xxxx //创建分支 git branch kevin
git checkout kevin //切换到了kevin分支下 git checkout kevin 切换到分支 'kevin'
再用git branch查看,会看到有两个分支master和kevin,当前使用的分支前面会有一个*在kevin分支下 ,编辑2.txt,并提交到新分支
git branch * kevin master
2 修改测试
修改 2.txt的内容
echo "branch,kevin" >> 2.txt
将修改加入版本库
git add 2.txt git commit -m "ch 2.txt" [kevin 16ea353] ch 2.txt 1 file changed, 1 insertion(+)
分支与分支之间的工作是隔离开的,无论是内容还是文件都是
# git branch *kevin master #cat 2.txt 111 222 333 branch,kevin
切换回master分支
git checkout master //此时cat 2.txt发现并没有更改内容
# git checkout master 切换到分支 'master' # cat 2.txt 111 222 333 # git branch kevin * master
上述可以看到,我在kevin分支下添加的内容,在master分支下是看不到刚刚添加的内容。
3 分支合并
作用:将2个分支的内容统一分支之间内容一样,保持一致。
4 例如现在要把kevin分支合并到master分支下
git checkout master //合并分支之前,先切换到目标分支
git merge kevin //把kevin分支合并到了master # git merge kevin 更新 c5aac76..16ea353 Fast-forward 2.txt | 1 + 1 file changed, 1 insertion(+) 查看2.txt,发现到刚刚在kevin分支修改的内容也被同步上去了。 # cat 2.txt 111 222 333 branch,kevin
5 冲突情况
当同一个文件在两个分支下面做过编辑修改处理,但是内容不同步的话,会发生冲突
如果master分支和kevin分支都对2.txt进行了编辑,当合并时会提示冲突,需要先解决冲突才可以继续合并。
解决冲突的方法是在master分支下,编辑2.txt,改为kevin分支里面2.txt的内容。 然后提交2.txt,再合并kevin分支。
但是这样有一个问题,万一master分支更改的内容是我们想要的呢?
可以编辑2.txt内容,改为想要的,然后提交。切换到kevin分支,然后合并master分支到kevin分支即可(倒着合并)。合并分支有一个原则,那就是要把最新的分支合并到旧的分支。也就是说merge后面跟的分支名字一定是最新的分支。
6 删除
git branch -d kevin #删除分支
如果分支没有合并,删除之前会提示,那就不合并,强制删除
git branch -D kevin
22.10 远程分支管理
使用分支的原则
对于分支的应用,建议大家以这样的原则来:
master分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上。
创建一个dev分支,专门用作开发,只有当发布到线上之前,才会把dev分支合并到master
开发人员应该在dev的基础上再分支成个人分支,个人分支(在自己pc上)里面开发代码,然后合并到dev分支
dev分支合并bob分支的命令是:
git checkout dev //先切换到dev分支,然后
git merge bob
远程分支
1 本地新建的分支如果不推送到远程,对其他人就是不可见的
克隆下来的仓库,默认是只克隆master的分支,其他是不会跟着克隆的
# git clone [email protected]:kevinxlau/test-2210.git 正克隆到 'test-2210'... remote: Counting objects: 15, done. remote: Compressing objects: 100% (9/9), done. 接收对象中: 100% (15/15), done. 处理 delta 中: 100% (1/1), done. remote: Total 15 (delta 1), reused 9 (delta 0), pack-reused 0 # git branch * master
查看远程分支 git ls-remote origin,可以看到所有分支
# git ls-remote origin c22273949100d3921cc68aa9186c16a069179f23HEAD c22273949100d3921cc68aa9186c16a069179f23refs/heads/dev c22273949100d3921cc68aa9186c16a069179f23refs/heads/master
2 git clone的时候默认只把master分支克隆下来,如果想把所有分支都克隆下来,需要手动创建,在本地创建和远程分支对应的分支,使用#git checkout -b branch-name origin/branch-name,本地和远程分支的名称要一致
例如现在要将远程仓库的dev分支克隆下来
[root@9F-VM1 test-2210]# git checkout -b dev origin/dev 分支 dev 设置为跟踪来自 origin 的远程分支 dev。 切换到一个新分支 'dev' [root@9F-VM1 test-2210]# git branch * dev master
3 内容变更
建立文件,添加内容,以及推送到远程仓库
# vim 2.txt 1112 2333 444455
4 推送
[root@9F-VM1 test-2210]# git add 2.txt [root@9F-VM1 test-2210]# git commit -m "add 2.txt" [dev d6a3dad] add 2.txt 1 file changed, 4 insertions(+) create mode 100644 2.txt [root@9F-VM1 test-2210]# git push Counting objects: 4, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 334 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To [email protected]:kevinxlau/test-2210.git c222739..d6a3dad dev -> dev
最后一行可以看到是dev-->dev 是本地的dev推送到远程的dev
格式是:本地分支-->远程匹配分支
git push会把所有本地分支的变更一同推送到远程,
如果想指定只推送一个分支,使用git push origin branch-name
[root@9F-VM1 test-2210]# git push origin dev Everything up-to-date
5 本地创建分支,并推送
[root@9F-VM1 test-2210]# git branch dev2 [root@9F-VM1 test-2210]# git branch * dev dev2 master [root@9F-VM1 test-2210]# git push origin dev2 Total 0 (delta 0), reused 0 (delta 0) To [email protected]:kevinxlau/test-2210.git * [new branch] dev2 -> dev2
对于git push分支分两种情况
当本地分支和远程分支一致时
当本地分支比远程分支多,默认git push 只推送本地和远程一致的分支,想要把多出来的本地分支推送到远程时,使用git push origin branch-name 如果推送失败,先用git pull抓取远程的新提交
总结:
把本地的分支推送到远程分支执行命令:#git push origin branch-name
将远程的分支克隆到本地执行名:#git checkout -b branch-name origin/branch-name