[Git使用手册]-6-远程仓库
引言
这篇文章分为两部分,第一部将分演示如何使用git将本地仓库推送给另一台PC,多台PC之间如何互相推送本地代码;第二部分将演示在线Git代码托管平台的使用。
文章目录
0×1.如何使用git将本地仓库推送给另一台PC
试验环境介绍:两台Ubuntu系统,分别安装了openssh-server,git;
试验机A的IP:192.168.100.1/24;
试验机B的IP:192.168.100.200/24;
实例一:在B上创建一个本地git仓库,使用git远程克隆将B上的仓库克隆到A
#1.首先在A和B上都安装git和openssh(如果只是A推送给B,B作为服务端,那么A上面不需要安装openssh-server,安装openssh-client即可)
987@hk987.xyz:~$ sudo apt-get install git openssh-server
#2.分别配置A和B的git身份信息,在本系列第一篇文章中已经详细说明,如下
#初始化本地用户名
987@hk987.xyz:~$ git config --global user.name 987
#邮箱信息,方便对方给你发邮件
987@hk987.xyz:~$ git config --global user.email 987@hk987.xyz
#3.在B中有一个普通用户987,现在在其家目录创建一个文件夹pchub,并初始化为git仓库目录
B@hk987.xyz:~$ mkdir pchub
B@hk987.xyz:~$ cd pchub/
B@hk987.xyz:/pchub$ git init
初始化空的 Git 仓库于 /home/987/pchub/.git/
#4.在pchub仓库中,新建一个文件file1,并且写入数据"aaa",提交这次修改,默认情况下,在第一次提交的时候,git会创建一个新的分支"master",并将修改提交到这个分支中,而实际上是可以在提交前创建一个新的分支,将修改提交到新分支中的
B@hk987.xyz:/pchub$ echo aaa > file1
B@hk987.xyz:/pchub$ git add file1
B@hk987.xyz:/pchub$ git commit -m 'master update'
[master(根提交)6e0d502] master update
#5.在A上克隆B中的仓库pchub到本地,注意格式
#git clone ssh://远程机器上的用户名@远程机器IP/远程目录
#本例中因为远程仓库pchub目录是在B机器的987用户的家目录中,所以使用了"~"符号
A@hk987.xyz:~$ git clone ssh://987@192.168.100.200/~/pchub
#输入yes
Are you sure you want to continue connecting (yes/no)? yes
#输入B上面的987用户的密码
987@192.168.100.200's password:
#克隆成功后,进入目录查看,是不是和远程一模一样?
A@hk987.xyz:~$ cd pchub/
A@hk987.xyz:~/pchub$ ls
file1
A@hk987.xyz:~/pchub$ more file1
aaa
A@hk987.xyz:~/pchub$ git log --oneline
6e0d502 master update
A@hk987.xyz:~/pchub$ git branch
* master
实例二:在实例一的基础上,A在克隆到本地的pchub仓库目录中创建一个新的分支,并且将这个分支提交到B
#一般情况下,参与一个项目的修改都不是直接修改主分支,最好创建一个新的分支提交,通过大家共同的检查无误后,再由项目管理者将这个分支并入主分支
#1.创建A分支在其中添加文件file2,并写入数据bbb
A@hk987.xyz:~/pchub$ git checkout -b A
切换到一个新分支 'A'
#查看并确认当前所在分支
A@hk987.xyz:~/pchub$ git branch
* A
master
#2.在A分支下创建新的文件file2并提交
A@hk987.xyz:~/pchub$ echo bbb > file2
A@hk987.xyz:~/pchub$ git add file2
A@hk987.xyz:~/pchub$ git commit -m 'A branch update'
[A 154bfda] A branch update
#3.将分支A推送到B(因为这个仓库是从B克隆的,所以.git文件夹中会记录B的IP以及对应仓库目录名称路径等信息,如果这些信息发生变化,在执行push之前需要先执行git remote add来修改这些参数,稍后的实例三会介绍)
A@hk987.xyz:~/pchub$ git push origin A
Are you sure you want to continue connecting (yes/no)? yes
#输入B上面987用户的密码,没有报错就说明推送成功了
987@192.168.100.200's password:
* [new branch] A -> A
此时在B上查看刚才的推送:
#多出来一个分支A
B@hk987.xyz:/pchub$ git branch
A
* master
#切换到分支A
B@hk987.xyz:/pchub$ git checkout A
B@hk987.xyz:/pchub$ ls
file1 file2
B@hk987.xyz:/pchub$ git log --oneline
154bfda A branch update
6e0d502 master update
#确定推送成功了
B@hk987.xyz:/pchub$ more file2
bbb
#确认无误后,将A合并到master分支中
B@hk987.xyz:/pchub$ git checkout master
B@hk987.xyz:/pchub$ git merge A
#在B上删除分支A
B@hk987.xyz:/pchub$ git branch -d A
#现在回到A,尝试切换回master分支,git提示我们,因为B上面进行了一次合并,所以我们本地的master分支版本现在和B上面并不同步
A@hk987.xyz:~$ git checkout master
切换到分支 'master'
您的分支落后 'origin/master' 共 1 个提交,并且可以快进。
(使用 "git pull" 来更新您的本地分支)
#根据提示输入"git pull"命令来更新本地分支
A@hk987.xyz:~$ git pull
#B上面确实删除了A分支,但这个操作不会pull到A,在A中我们仍然可以在A分支下工作,并再次提交A分支
A@hk987.xyz:~$ git branch
A
* master
#查看master分支的历史版本,上次的提交被合并到主分支下了
A@hk987.xyz:~$ git log --oneline
154bfda A branch update
6e0d502 master update
实例三:在实例二的基础上,现在我们不克隆B上面的pchub到本地,而是在本地初始化一个仓库并新建一个分支,然后将这个分支推送到B中的pchub仓库中
#1.在A本地创建一个git仓库目录
A@hk987.xyz:~$ mkdir ahub
A@hk987.xyz:~$ cd ahub/
A@hk987.xyz:~/ahub$ git init
#2.新建并切换到branchA分支下
A@hk987.xyz:~/ahub$ git checkout -b branchA
#3.在branchA分支下新建文件file3,写入文本ccc,并提交
A@hk987.xyz:~/ahub$ echo ccc > file3
A@hk987.xyz:~/ahub$ git add file3
A@hk987.xyz:~/ahub$ git commit -m 'branch branchA update'
[branchA (根提交) 3e4ef2c] branch branchA update
#查看当前存在的分支列表,发现并没有master分支,这是允许的,master分支只有在没有新建分支之前创建或提交的时候,才会默认被创建,但这并不意味着它是必须的
A@hk987.xyz:~/ahub$ git branch
* branchA
#4.因为当前A上面这个仓库并不是通过远程克隆得到的,所以需要先添加远程仓库信息,注意格式
#git remote add origin ssh://远程主机中的用户名@远程主机IP/远程主机中git仓库路径
#在实例二中提到了.git目录保存了远程仓库的这些信息,如果是通过直接克隆得到的仓库目录,这些信息默认是保存在.git目录中无需修改的,如果远程仓库的IP或路径发生变化,就可以通过下面的命令来修改这些参数
A@hk987.xyz:~/ahub$ git remote add origin ssh://987@192.168.100.200/~/pchub
#如果提示"fatal: 远程 origin 已经存在",可以使用下面的命令删除这些信息再重新添加
A@hk987.xyz:~/ahub$ git remote rm origin
A@hk987.xyz:~/ahub$ git remote add origin ssh://987@192.168.100.200/~/pchub
#5.配置好远程仓库信息后,使用下面的命令将分支branchA提交给B
A@hk987.xyz:~/ahub$ git push origin branchA
#接下来的操作实例二中已经描述过,这里不再赘述
总结:通过上面的三个实例,我们学会了如何在PC和PC之间进行Git克隆和推送操作,这些操作充分体现了git分布式的思想,无需一台24小时运行的中央服务器,就可以在不同PC之间共享代码。
0×2.git代码托管平台
上面介绍了如何在PC和PC之间克隆和推送更新,正如本系列文章第一篇"Git简介"中提到的,git的使用者遍布全球,如果你在使用git的时候,对方正在睡觉,电脑没有开机就不能git,而"git代码托管平台"就是一些24小时不断电的git服务器,我们可以将代码git到上面,任何人都能随时随地的下载这些代码,下面介绍两个比较好用的"git代码托管平台",一个是国外我们所熟悉的"Github",另一个是国产的"Coding"。
a.Github
1)首先请到[Github官方网站],注册一个账号并登陆。
2)登陆后,右上角有一个加号,点击它选择"New repository",进入下面的界面,在"repository name"中输入仓库文件夹的名称,在"Discription"中输入仓库的描述信息,勾选Initialize会在创建时初始化,可选是否在初始化时创建.gitignore文件,本例假设创建的仓库地址是hk987/xyz,点击下方的按钮,创建仓库:
3)创建公钥并提交到github(在push上传到github上时,使用此密钥对作为连接验证)
#-C参数后是该密钥的标识信息,用于区分密钥,可以自定义输入信息
987@hk987.xyz:~$ ssh-keygen -t rsa -C "www.hk987.xyz"
#输入两遍用于加密此密钥的密码
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
#生成后,公钥和私钥保存位置(qing为你自己的用户名,注意替换)
Your identification has been saved in /home/hk987/.ssh/id_rsa.#私钥
Your public key has been saved in /home/hk987/.ssh/id_rsa.pub.#公钥
#用文本编辑器打开公钥文件,复制其中的内容
987@hk987.xyz:~$ gedit /home/hk987/.ssh/id_rsa.pub
4)根据下图的步骤,将公钥内容复制保存到Github,第1步,点击头像右方的小三角,里面有个"Setting"选项,第2步点击"SSH and GPG Keys",第3步点击"New SSH Key",Title是密钥标识,用于区分不同密钥,随便输入一个名称即可,下方Key粘贴刚才复制的公钥
5)配置好SSH后可以测试一下是否配置成功
#如果看到"successfully authenticated"这种提示信息就说明密钥对配置正确
987@hk987.xyz:~$ ssh -T git@github.com
6)将刚才创建的xyz仓库克隆到本地
#为了不出现连接,已经将下面命令中"https"后面的说明号转换成中文说明号,使用时请使用英文说明号(大家可能奇怪这个地址是怎么知道的,其实就在仓库界面上面有显示,如果找不到显示,其实也没关系,标准格式就是github的官方网站后面接用户名再接仓库名称.git)
987@hk987.xyz:~$ git clone https://github.com/hk987/xyz.git
#克隆完成后进入xyz目录,这是一个仓库目录,可以使用"ls -al"查看到下面存在一个".git"文件夹
987@hk987.xyz:~$ cd xyz
#并且其中的内容也是我们在github初始化这个仓库时输入的,"README.md"文件中保存了我们输入的描述信息
987@hk987.xyz:~/xyz$ ls
README.md
987@hk987.xyz:~/xyz$ more README.md
# xyz
图片来自: www.hk987.xyz
7)添加一个文件,并且推送到Github上的远程仓库中
#所有的操作和前面几篇文章中本地仓库的操作是相同的
987@hk987.xyz:~/xyz$ echo aaa >> file1
987@hk987.xyz:~/xyz$ git add file1
987@hk987.xyz:~/xyz$ git commit -m 'update'
#添加远程仓库的信息,格式如下
#git remote add origin git@github.com:github用户名/仓库名称.git
987@hk987.xyz:~/xyz$ git remote add origin git@github.com:hk987/xyz.git
#如果提示"fatal: 远程 origin 已经存在",运行下面的命令先删除,再重新添加
987@hk987.xyz:~/xyz$ git remote rm origin
987@hk987.xyz:~/xyz$ git remote add origin git@github.com:hk987/xyz.git
#将修改推送给远程仓库的master分支
987@hk987.xyz:~/xyz$ git push origin master
#接受密钥后,会让你输入一个密码,这个密码就是第3步中加密密钥时设置的那个密码
Are you sure you want to continue connecting (yes/no)? yes
这就是Github创建仓库并克隆到本地的全过程,现在,我们可以自己在Github上创建远程仓库并且克隆到本地修改,再push到远程仓库中了。
pull取回更新操作:
在多个人协同工作的环境下,在同一个仓库中维护相同的项目时,往往会遇到这种情况,我们在休息的时候别人可能修改并push了项目的部分代码,但这段修改在我们本地的仓库文件夹中并没有修改,这个时候就需要先使用pull将远程仓库的代码更新同步到本地仓库,再做修改提交,请看下面的实例:
#语法一:取回远程仓库分支的更新,再与本地的指定分支合并
#git pull <远程主机名> <远程分支名>:<本地分支名>
#例如,取回origin主机的test分支与本地master分支合并
987@hk987.xyz:~/xyz$ git pull origin test:master
#语法二:取回远程仓库分支更新,与本地当前分支合并
#git pull <远程主机名> <远程分支名>
#例如,取回origin主机的master分支与本地当前所在分支合并
987@hk987.xyz:~/xyz$ git pull origin master
在git clone的时候,所有本地仓库的分支默认与远程仓库的同名分支,自动建立了(tracking)追踪关系,本地分支与远程分支如果存在追踪关系,在pull操作的过程中,能够省略分支名称,git会自动取回远程与本地当前分支同名的分支更新,并且自动与本地当前分支合并,追踪关系也可以手动设置,请看下面的实例:
#手动配置追踪关系,指定本地master分支追踪origin/test分支
987@hk987.xyz:~/xyz$ git branch --set-upstream master origin/test
#具有这种追踪关系后,在本地仓库的master分支,想要取回远程test分支与当前分支合并,只需要输入下面的命令,不需要输入远程分支名
987@hk987.xyz:~/xyz$ git pull origin
#如果当前分支只有一个追踪分支,远程主机名也可以省略,代表从唯一一个追踪的分支下载更新与当前分支合并
987@hk987.xyz:~/xyz$ git pull
b.Coding
在国内所有的代码托管平台中,只有"Coding"是最接近"Github"功能的,但感觉和"Github"仍然有差距,不过其优势是,全中文的操作界面简单易懂。
1)首先请到[Coding官方网站]注册一个账号并登陆。
2)在"我的项目"里面,创建新项目,项目名称就是仓库的名称,本例填写test,下面是描述信息,其余和Github差不多,如下图所示:
3)添加SSH公钥到Coding,点击右上方自己的头像,选择"账户",在面板中找到"SSH公钥",将自己生成的SSH公钥添加进去。
4)克隆test仓库到本地
#点击进入创建的仓库控制面板后,点击"代码",可以在界面中找到"HTTPS SSH 方式访问仓库"下方就是这个项目的克隆地址了,其实只要知道自己的用户名和创建时的仓库名称,这个地址自己也能推出来
987@hk987.xyz:~$ git clone https://git.coding.net/987/test.git
#因为创建test仓库的时候使用的是"私有的",所以会要求输入此仓库的拥有者的用户名和密码
Username for 'git.coding.net':
Password for 'hk987@git.coding.net':
5)修改内容并上传到远程仓库
987@hk987.xyz:~$ cd test
987@hk987.xyz:~/test$ echo aaa > file1
#使用参数"-A"可以一次性将此目录下所有文件的改动添加到缓存区
987@hk987.xyz:~/test$ git add -A
987@hk987.xyz:~/test$ git commit -m 'update'
#首先删除已经存在的origin信息
987@hk987.xyz:~/test$ git remote rm origin
#远程仓库origin信息的添加和github类似,只是地址改成了coding的地址而已,后面是用户名和仓库名称
987@hk987.xyz:~/test$ git remote add origin git@git.coding.net:987/test
987@hk987.xyz:~/test$ git push origin master
0×3.用脚本实现自动上传到Github
1.本地创建密钥对
# 创建公密钥对
~ ➤ ssh-keygen -t rsa -C "hk987.xyz"
# 将创建的密钥对放到/home/hk987/.ssh/目录,起名叫demo
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hk987/.ssh/id_rsa): /home/hk987/.ssh/demo
# 如果没必要,就不用给这个密钥加密,直接回车使用空密码就行
Enter passphrase for "/home/hk987/.ssh/demo" (empty for no passphrase):
Enter same passphrase again:
# 创建后的密钥对在下面这两个目录
~ ➤ ls /home/hk987/.ssh/demo*
/home/hk987/.ssh/demo /home/hk987/.ssh/demo.pub
2.将公钥demo.pub中的内容传到Github
根据下图的步骤,将公钥内容复制保存到Github,第1步,点击头像右方的小三角,里面有个"Setting"选项,第2步点击"SSH and GPG Keys",第3步点击"New SSH Key",Title是密钥标识,用于区分不同密钥,随便输入一个名称即可,下方Key粘贴刚才复制的公钥
3.在本地创建一个脚本,用来一键上传项目文件
Github用户名hk987,仓库名称xyz
#!/bin/bash
# ========================
# 推送到自建服务器的 Git 脚本
# 功能:
# 1. 自动配置 SSH 连接信息
# 2. 提交本地变更
# 3. 仅在 origin 不存在时才添加远程仓库
# 4. 推送到服务器
# ========================
# --------------------------
# 1. 配置 SSH 连接信息
# --------------------------
# 注意:这会覆盖你本地的 ~/.ssh/config 文件
# 如果不想每次都覆盖,可以把这一段注释掉,只在第一次运行时执行
echo "Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/demo">/home/hk987/.ssh/config
# 设置 SSH 配置文件权限(必须是 600,否则 SSH 会报错)
chmod 600 /home/hk987/.ssh/config
# --------------------------
# 2. 提交本地变更
# --------------------------
# 添加所有变更(包括新增、删除、修改)
git add -A
# 提交变更(如果没有变更,也不会报错退出)
git commit -m 'update' || true
# --------------------------
# 3. 智能添加远程仓库(核心修改部分)
# --------------------------
# 检查本地是否已经存在名为 "origin" 的远程仓库
if ! git remote | grep -q "^origin$"; then
echo "未检测到 origin 远程仓库,正在添加..."
git remote add origin git@github.com:hk987/xyz.git
else
echo "检测到 origin 远程仓库已存在,跳过添加步骤"
fi
# --------------------------
# 4. 推送到远程服务器
# --------------------------
echo "正在推送到远程仓库..."
git push origin master
echo "推送完成!"
4.修改本地bashrc文件,添加alias命令别名
# 因为我本地用的是zsh,所以修改的是zshrc文件
vim ~/.zshrc
# 在文件的最后添加,这个demo.sh就是第3步中创建的sh文件
alias demopush='bash /home/hk987/demo.sh'
#然后就能在新终端中,进入git项目目录中,然后执行demopush来推送项目了