22.7 建立远程仓库

22.8 克隆远程仓库

22.9 分支管理

22.10 远程分支管理





22.7 建立远程仓库


1 首先到 https://github.com 注册一个账号

22.7-22.12 建立远程仓库,克隆远程仓库,分支管理,远程分支管理_第1张图片

2 创建自己的git,点repositories 再点new

 名字自定义,比如叫studygit  选择public  点 create repository

22.7-22.12 建立远程仓库,克隆远程仓库,分支管理,远程分支管理_第2张图片 

 3 添加key:右上角点自己头像,选择settings,左侧选择SSH and GPG keys

 左侧点New SSH key,添加新的ssh key

22.7-22.12 建立远程仓库,克隆远程仓库,分支管理,远程分支管理_第3张图片

4 把linux机器上的~/.ssh/id_rsa.pub内容粘贴到这里

5 执行命令,生成公钥

 ssh-keygen
 cat ./.ssh/id_rsa.pub

6 将cat到的内容,输出到github主页的公钥信息栏

22.7-22.12 建立远程仓库,克隆远程仓库,分支管理,远程分支管理_第4张图片

有了公钥之后就能进行互相通信了 

 

6.1 在本地(客户端)创建仓库 ,在仓库写入内容,将内容推送到远程仓库上面

准备工作:在本地(客户端)建立项目目录

# mkdir -p /data/git/gh-project01
# cd !$
cd /data/git/gh-project01
ls

6.2 本地仓库创建

本地仓库创建指南

22.7-22.12 建立远程仓库,克隆远程仓库,分支管理,远程分支管理_第5张图片

…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.7-22.12 建立远程仓库,克隆远程仓库,分支管理,远程分支管理_第6张图片

 22.7-22.12 建立远程仓库,克隆远程仓库,分支管理,远程分支管理_第7张图片

 


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内容待同步

22.7-22.12 建立远程仓库,克隆远程仓库,分支管理,远程分支管理_第8张图片 

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分支


    22.7-22.12 建立远程仓库,克隆远程仓库,分支管理,远程分支管理_第9张图片

  • 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