Wlgls 冲鸭!

Git远程仓库

2019-07-02
Git

在本地上,我们虽然创建了一个仓库,但是我们无法进行协作,所以我们使用远程仓库来进行同步,这样远程仓库既可以作为备份,也可以与其他人进行协作

创建远程仓库

远程仓库最出名的就是github了,我们首先创建一个github

5d1b45804787f42245.png

github提醒我们,既可以创建一个新的存储库,也可以推送现有的存储库

image-20190702195344.png

现在我们先推送本地上的git仓库

直接根据提示,推送现有的本体存储库

$: git remote add origin https://github.com/Wlgls/learngit.git
$: git push -u origin master
对象计数中: 37, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (15/15), 完成.
写入对象中: 100% (37/37), 2.85 KiB | 324.00 KiB/s, 完成.
Total 37 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To https://github.com/Wlgls/learngit.git
 * [new branch]      master -> master
分支 'master' 设置为跟踪来自 'origin' 的远程分支 'master'

将本地库中的内容推送到远程,使用的是git push命令,实际上就是把当前分支master推送到远程

在第一次推送的时候,因为远程库是空的,所以我们第一次推送的时候,加上-u参数,git不但会把本地master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取简化命令

现在github页面中就有了内容而且和本地仓库内容一致 2019-10-16-23-07-37.png

此时我们就可以使用git push origin master命令把master分支的最新修改推送到github了。

从0开始的远程仓库

我们首先创建了一个新的仓库,可以命名为’gittest`

2019-10-16-23-07-46.png

然后我们就可以使用git clone命令来克隆一个本地库了

$: git clone https://github.com/Wlgls/gittest.git
正克隆到 'gittest'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (3/3), 完成.

你可以进入gittest仓库查看一下

$: cd gittest
$: ls
README.md

需要注意的是,我们在克隆github仓库的时候还可以使用git://github.com/Wlgls/gittest.git,而且似乎速度更快一些。(以后尝试)

取消与远程仓库的关联

有些时候,我们因某些原因,将远程仓库改变了,所以需要取消与当前远程仓库的关联,使用git remote来观察远程仓库。

然后使用git remote remove [name]来取消关联

$:~/Data/homework$ git remote
kkk
origin
$:~/Data/homework$ git remote remove kkk
$:~/Data/homework$ git remote
origin

多人协作

使用远程仓库的一个原因是备份,另一个原因就是为了多人协作

查看远程仓库的信息

当我们从远程仓库克隆的时候,实际上git自动把本地的master分支与远程的master分支对应了起来,并且远程仓库的默认名称是origin

我们可以使用git remote来查看远程仓库的信息

$: git remote
origin

我们可以使用带有参数-vgit remote来显示更为详细的信息:

$: git remote -v
origin	https://github.com/Wlgls/learngit.git (fetch)
origin	https://github.com/Wlgls/learngit.git (push)

推送分支

我们使用git push推送分支,这时候会默认推送master分支都推送到远程库。

我们我们要指定分支的话,就可以使用git push origin <name>

$: git push origin dev

抓取分支

多人协作时,大家都会往devmaster上推送自己的修改

我们在另一台电脑上克隆了远程库(我们在这里可以在同一个电脑上的不同目录)

$: git clone https://github.com/Wlgls/learngit.git mygit
正克隆到 'mygit'...
remote: Enumerating objects: 37, done.
remote: Counting objects: 100% (37/37), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 37 (delta 5), reused 37 (delta 5), pack-reused 0
展开对象中: 100% (37/37), 完成.

当我们从远程库中clone时,默认是只能看到master分支的。可以使用git branch检查一下

如果我们需要在dev分支上进行开发,就必须创建远程origindev分支到本地,所以我们可以使用一下命令来创建本地dev分支

$: git checkout -b dev origin/dev

如果你遇到了错误fatal: 'origin/dev' 不是一个提交,不能基于它创建分支 'dev'

请先进入learngit目录推送dev分支,即使用git push origin dev

然后进入mygit目录,首先使用git pull拉取,然后再次使用git checkout -b dev origin/dev即可

现在我们就可以继续在dev上修改了,然后是不是的将dev分支push到远程

$: cd mygit
$: touch env.txt
$: echo "hello git" >> env.txt

$: git add env.txt
$: git commit -m "add env"
[dev 1b95ed3] add env
 1 file changed, 1 insertion(+)
 create mode 100644 env.txt

$: git push origin dev
对象计数中: 3, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (3/3), 304 bytes | 304.00 KiB/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/Wlgls/learngit.git
   112a8f5..1b95ed3  dev -> dev

2019-10-16-23-08-05.png

这时候github就会有提示说我们推送了一个dev分支,但是github没有显示内容

解决冲突

这时候,如果其他人来推送了自己的dev分支

$: cd ../learngit
$: touch env.txt
$: echo "helloworld" >> env.txt
$: git add env.txt
$: git commit -m "add env"
$: git push origin dev
To https://github.com/Wlgls/learngit.git
 ! [rejected]        dev -> dev (fetch first)
error: 无法推送一些引用到 'https://github.com/Wlgls/learngit.git'
提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外
提示:一个仓库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更
提示:(如 'git pull ...')。
提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。

这个时候,就会因为冲突问题而导致无法提交

解决冲突也很简单,只要先用git pull把最新的提交从origin/dev抓下来,然后在本地合并,解决冲突,在推送就好了。

$: git pull
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
展开对象中: 100% (3/3), 完成.
来自 https://github.com/Wlgls/learngit
   112a8f5..1b95ed3  dev        -> origin/dev
当前分支没有跟踪信息。
请指定您要合并哪一个分支。
详见 git-pull(1)。

    git pull <远程> <分支>

如果您想要为此分支创建跟踪信息,您可以执行:

    git branch --set-upstream-to=origin/<分支> dev

但是拉取失败了,原因是没有指定dev分支和远程origin/dev分支的链接,根据提示,设置devorigin/dev的链接

$: git branch --set-upstream-to=origin/dev dev
分支 'dev' 设置为跟踪来自 'origin' 的远程分支 'dev'

现在就可以git pull

$: git pull
自动合并 env.txt
冲突(添加/添加):合并冲突于 env.txt
自动合并失败,修正冲突然后提交修正的结果。

现在就可以手动解决冲突了,这在前文中提及了,就不做演示了

$: vim env.txt
$: cat env.txt
$: git add env.txt
$: git commit -m "fix env conflict"
$: git push origin dev
对象计数中: 4, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (3/3), 完成.
写入对象中: 100% (4/4), 486 bytes | 486.00 KiB/s, 完成.
Total 4 (delta 0), reused 0 (delta 0)
To https://github.com/Wlgls/learngit.git
   1b95ed3..2b5575e  dev -> dev