11:git 远程操作详解
git 远程操作详解
- .git文件:版本库区域
- refs
- heads:分支管理
- master
- remotes:主机名管理
- demo
- origin
- HEAD--ref: refs/remotes/origin/master
- master--1b2d350606821fd90952038bf0b66fdadf94ae8d
- tags:标签管理
- v1.0
- heads:分支管理
- config
- HEAD--ref: refs/heads/master
- refs
1:git clone
git clone https://github.com/qq1157918444/demo.git
会在当前目录生成一个目录,该目录名称与远程版本库的名称一样
git clone https://github.com/qq1157918444/demo.git demo1
会在当前目录生成一个目录,该目录名称是demo1
git clone 支持多种协议:http,https,git,ssh,ftp...
2:git remote
Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
1:列出所有远程主机
$ git remote
origin
2:查看远程库的地址
$ git remote -v
origin https://github.com/qq1157918444/demo.git (fetch)
origin https://github.com/qq1157918444/demo.git (push)
3:clone的时候指定主机名
git clone -o demo https://github.com/qq1157918444/demo.git
git remote
demo
由于远程主机名变为demo,这个时候pull,push使用以下的:
git pull demo master
git push demo master
4:查看某一个主机名的信息
$ git remote show origin
* remote origin
Fetch URL: https://github.com/qq1157918444/demo.git
Push URL: https://github.com/qq1157918444/demo.git
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
5:添加远程主机
语法:
git remote add <主机名> <url>
查看主机名
git remote
origin
添加主机名:
git remote add test https://github.com/qq1157918444/demo.git
查看主机名
git remote
origin
test
使用test
edit
git add .
git commit -m "commit"
git pull test master/git pull origin master
git push test master/git push origin master
cinfig配置
[remote "origin"]
url = https://github.com/qq1157918444/demo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[remote "test"]
url = https://github.com/qq1157918444/demo.git
fetch = +refs/heads/*:refs/remotes/test/*
6:删除远程主机
git remote rm <主机名>
查看主机名
git remote
origin
test
删除主机名
git remote rm test
查看主机名
git remote
origin
config
[remote "origin"]
url = https://github.com/qq1157918444/demo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
7:修改远程主机
git remote rename <原主机名> <新主机名>
添加一个主机名test1
$ git remote add test2 https://github.com/qq1157918444/demo.git
查看主机名
git remote
origin
test2
config
[remote "origin"]
url = https://github.com/qq1157918444/demo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[remote "test2"]
url = https://github.com/qq1157918444/demo.git
fetch = +refs/heads/*:refs/remotes/test2/*
修改主机名
$ git remote rename test2 test3
查看主机名
git remote
origin
test3
config
[remote "origin"]
url = https://github.com/qq1157918444/demo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[remote "test3"]
url = https://github.com/qq1157918444/demo.git
fetch = +refs/heads/*:refs/remotes/test3/*
3:git fetch
远程主机有了新的commit,当我们需要把这些commit更新到本地,但又不影响本地代码
可以使用git fetch
语法:
git fetch <远程主机名> //取回所有分支的更新
git fetch <远程主机名><分支名>//取回指定分支的更新
fetch
$ git fetch origin master
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 2), reused 3 (delta 2), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/qq1157918444/demo
* branch master -> FETCH_HEAD
ac3d784..46a22ed master -> origin/master
rebase
$ git rebase origin/master
First, rewinding head to replay your work on top of it...
Fast-forwarded master to origin/master.
fetch
$ git fetch origin master
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 2), reused 3 (delta 2), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/qq1157918444/demo
* branch master -> FETCH_HEAD
46a22ed..6490def master -> origin/master
merge
$ git merge origin/master
Updating 46a22ed..6490def
Fast-forward
test.txt | 1 +
1 file changed, 1 insertion(+)
4:git pull
取回远程主机某个分支的更新,再与本地的指定分支合并。
语法:
git pull <远程主机名> <远程分支名>:<本地分支名>
取回origin主机的master分支与本地的dev分支合并
git pull origin master:dev
取回origin主机的master分支与当前分支合并
git pull origin master
上述相当于:
git fetch origin master
git merge origin/master
我么在git clone的时候会把本地分支与远程主机的同名分支默认创建一种追踪关系(tracking)
手动建立追踪关系
git branch --set-upstream master origin/master
如果当前分支与远程分支追踪关系一旦建立,git pull就可以省略远程分支名
git pull origin
如果当前分支只有一个追踪关系,远程主机名也可以省略
git pull
如果合并需要采用rebase模式,可以使用--rebase选项。
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
5:git push
将本地分支的更新,推送到远程主机。
语法:
git push <远程主机名> <本地分支名>:<远程分支名>
如果省略远程分支名,则把本地分支推送至远程同名分支,如果没有,则建立同名分支
git push origin master
如果省略本地分支名,则表示要删除指定的远程分支名
git push origin :master
git push origin --delete master
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
git push origin
如果当前分支只有一个追踪分支,嘛呢主机名可以省略
git push
-u选项指定一个默认主机
git push -u origin master
simple方式:git push
默认推送当前分支
matching方式:git push
默认推送所有分支
git2.0以前默认采用matching方式,2.0之后默认采用simple方式
通过一下设置可以更改这种默认
git config --global push.default matching
git config --global push.default simple
不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机
git push --all origin
上面如果远程有更新的commit,还提示错误,会要求本地先pull,在push,如果要强行推送:
git push --force origin