git在同步到远程库
关于git中多个用户切换的事情:
完全使用账户密码策略连接远程库:
- 之前一直尝试在本地切换多个用户,发现一直不行,很奇怪?后面发现必须要去win10的凭据管理器删除当前git的凭据。
以上是输入账户密码,进行凭据校验的情况;
完全使用ssh免登陆策略进行远程库连接:
- 如果是要通过ssh方式登陆的话,建议还是不要多用户切换了,因为ssh方式免登陆校验的话,每次都要去生成新的ssh密钥去切换,着实太过于麻烦了。
配合账户密码策略和ssh两种策略管理两个账户:
之前还想过,一个用户使用ssh策略,一个用户采取账号密码策略?没有试过,觉得应该可行?
好的,我刚刚去试了一下,这种方式可行,一个账户使用,账户密码策略;一个账户使用ssh免登陆验证。这样可以不用每次修改,就可以同时在本地使用两个账户!
把本地库推送(备份)到远程库上:
这里说的推送到远程库上的步骤都是针对一开始远程库是空的的操作,并不是在远程库已经有分支,把本地库和远程库进行关联!如果要进行关联的话,请查看这篇文章
场景:
在多人协同工作,或者我们把代码托管到第三方平台上的时候,我们要把本地库和远程仓库对应起来。
其实远程库和本地库性质上一模一样,就是一个为了更方便的备份而已!
我们在单机上跑了这么久的git,终于上网啦!
在本地添加远程库
首先在码云上建一个工程,然后在里面复制远程仓库地址:
从上面的图片中可以看出,有两种协议的仓库地址可以选:
一种就是上面说了的https的,一种就是git自己的协议(通过ssh免登陆验证)。
如果要使用ssh登陆:
# 先使用此命令:
ssh -keygen -t rsa -C "邮箱"
ssh-keygen -t rsa -C "3244874077@qq.com"
生成密钥之后,把公钥复制到自己的码云或者github上,然后省略…
添加远程库映射
# 为当前仓库添加一个远程库:git remote add [仓库名] [地址]
git remote add origin https://gitee.com/yaoguai1998/LearnGit.git
# 默认的仓库名是origin,当然你可以根据仓库特征自己取名。
# 上面是https协议的,这种是通过邮箱密码验证的。
这里就引入了git的remote命令了:
下面简单介绍一下remote的相关命令,及一些常用的参数
提醒以下的$符是linux的命令行开始符,不是命令内容
以下遇到origin我们都默认为远程库名,master都默认是主分支名,dev次分支名
# 1.增加
# 添加远程库 git remote add [origin] [url]
# 为当前仓库添加一个远程库:git remote add [仓库名] [地址]
$ git remote add origin https://gitee.com/yaoguai1998/LearnGit.git
# 2.删除
# 删除一个远程库的地址及连接 git remote rm [origin]
$ git remote rm origin
# 3.查看
# 查看当前本地库中添加了几个远程库和名字
$ git remote
learn
origin
# 查看当前的本地库中的远程库的名字,和push(推送),fetch(抓取)地址
$ git remote -v
learn git@gitee.com:yaoguai1998/LearnGit.git (fetch)
learn git@gitee.com:yaoguai1998/LearnGit.git (push)
origin https://gitee.com/yaoguai1998/LearnGit.git (fetch)
origin https://gitee.com/yaoguai1998/LearnGit.git (push)
## 4.修改url
# git remote set-url [origin] [url]
$ git remote set-url origin git@gitee.com:yaoguai1998/LearnGit.git
# 以上只是remote的常用参数
# 以下为推荐使用:
git remote [-v | --verbose]
or: git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--mirror=<fetch|push>] <name> <url>
or: git remote rename <old> <new>
or: git remote remove <name>
or: git remote set-head <name> (-a | --auto | -d | --delete | <branch>)
or: git remote [-v | --verbose] show [-n] <name>
or: git remote prune [-n | --dry-run] <name>
or: git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]
or: git remote set-branches [--add] <name> <branch>...
or: git remote get-url [--push] [--all] <name>
or: git remote set-url [--push] <name> <newurl> [<oldurl>]
or: git remote set-url --add <name> <newurl>
or: git remote set-url --delete <name> <url>
-v, --verbose be verbose; must be placed before a subcommand
推送到远程库
# git push [仓库名] [分支名]
# 这里的意思是推送主分支,master分支,origin也是默认的仓库名
$ git push origin master
# 也可以这样,意思是仓库名和分支名不是绝对的
# 把 dev分支,推送到仓库地址映射名为gitlearn的远程仓库上
$ git push gitlearn dev
# 第一次推送到远程库的master上,我们建议是加上 -u 参数的
# 加上-u参数,如果远程库不存在此分支的话,就会创建此分支
$ git push -u origin master
# 有时候在码云上初始了远程库,其中的master分支已经初始化好了,所以可能要导致此时无法push上
# 在这种第一次推送,并且仓库是几乎空白的情况下,无法推送的话,我们可以加上--force参数
$ git push --force origin master
# 或者这种形式
$ git push -u origin master -f
从远程库上拉取
git clone
# git clone [url]
# 克隆有三个效果:
# 1.完整下载远程库
# 2.创建本地库并设定别名:origin (并绑定地址)
# 3.初始化本地库:(.git目录)
# 所以建议,如果我们是初始化本地库的话,不要使用pull命令
# 直接使用clone命令,省去了很多麻烦
$ git clone https://gitee.com/yaoguai1998/LearnGit.git
git fetch
# 把远程库上的master分支的内容抓取到本地
git fetch origin master
因为fetch只是把内容从远程库中抓取下来,还没有做合并的动作(merge),所以在fetch之后,vim本地文件,是看不到修改的。
只有通过:git checkout origin/master操作(git checkout 本地库名称/分支名称),才能切换到fetch下来的分支中去,然后才能看到修改
(我猜想这个是切换到版本库中master中的,因为我们的内容被fetch下来之后应该放到本地库中)
如果要切换回去的话,要通过git checkout master 我觉得这个是切换到工作区中的master中,那么其实区别就出来了!
# 切换到本地库中的分支的话:git checkout 版本库名字/分支名字
$ git checkout origin/master
# 切换到工作区中的分支的话:git checkout 分支名称
$ git checkout master
通过fetch操作,只是将远程库中的内容拉取到了本地,但是其实还没有和本地的内容进行合并:其实通过 [远程库名/分支名] 的形式,就是表明是远程库的分支(后面我们操作远程库和本地库的分支建立追踪关系时,远程库的名字就是这样表示的)。
建立分支与分支之间的追踪关系
上面说到远程库和本地库的分支之间建立追踪关系,这里就顺便说明一 下,什么是追踪关系:
在我们上面进行push、fetch以及后面的pull等等和远程库进行交互的操作的时候,我们都会加上分支名称:例如git push origin master、git fetch learngit dev等等,这样每次都需要写后面的分支名称和远程仓库名称,但是我们很多时候就是想推送我们当前所处的分支,远程库其实也就是固定的那一个或者两个,所以追踪关系就是为了解决这样一点的,如果我们建立的本地分支和远程库的分支的追踪关系的话,那么当我们push、pull的时候,就可以省略分支名称,默认就是当前分支和设定的远程分支进行推送和拉取!
如果不建立追踪关系直接:git push的话
# 直接就失败了
$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
查看本地库的分支和远程库的分支的映射关系: git branch -vv
# 查看本地库的分支和远程库的分支的映射关系: branch -vv
$ git branch -vv
dev d62c9e1 dev 上提交readme.txt
issue a278fe9 issue中修改了LICENSE
* master 434cab2 解决冲突
# 发现以上的分支和远程库的分支的都没有建立追踪关系
# 这里尝试给issue和远程库的origin/issue建立追踪关系
# 首先切换到issue分支
$ git checkout issue
Switched to branch 'issue'
# 通过两种方式建立本地分支和远程分支的追踪关系
# 1.git branch -u [仓库名]/[分支名]
# 2.git branch --set-upstream-to [仓库名]/[分支名]
$ git branch -u origin/issue
Branch 'issue' set up to track remote branch 'issue' from 'origin'.
# 再通过:git branch -vv 查看追踪关系,发现issue已经有了
$ git branch -vv
dev d62c9e1 dev 上提交readme.txt
issue f3528d7 [origin/issue] 在issue中修改了LICENSE
master 434cab2 解决冲突
* mzy f3528d7 在issue中修改了LICENSE
# 修改文件之后,git commit 之后,直接git push 发现追踪关系已经生效
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 324 bytes | 324.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by Gitee.com
To gitee.com:yaoguai1998/LearnGit.git
f3528d7..39a6ce1 issue -> issue
# 切断掉联系:git branch --unset-upstream
$ git branch --unset-upstream
# 通过git branch -vv 发现追踪关系已经不存在了!
$ git branch -vv
dev d62c9e1 dev 上提交readme.txt
* issue 39a6ce1 修改了LICENSE
master 25478c7 修改了readme.txt
mzy f3528d7 在issue中修改了LICENSE
git merge
回到正题:
前面我们说fetch只能抓取到本地库中,但是并没有在我们的工作区中体现,所以我们要手动进行一个本地库和我们工作区中的分支进行merge的操作!
# 首先切换回我们的master分支
$ git checkout master
# 首先把远程库中的东西拉取下来
$ git fetch origin/master
# 现在我们去合并版本库中的master:
$ git merge origin/master
以上这样才完成了本地库和远程库的合并
git pull
pull,其实就是fetch和merge的合并操作,一个pull其实就是把fetch和merge全都做了,如果你的程序不复杂,并且协同不那么麻烦,最好还是使用pull操作,来简化你的繁琐的过程。
# 首先把远程库中的东西拉取下来
$ git fetch origin/master
# 现在我们去合并版本库中的master:
$ git merge origin/master
# 等同
# git pull [仓库名] [分支名]
$ git pull origin master
# 如果使用了追踪的话,我们在当前分支上就可以直接
$ git pull