Git远程操作
1 git clone
1.1 克隆远程库
# https协议
git clone https://github.com/yysue/test.git
# ssh协议 推荐这种
git clone git@github.com:yysue/test.git
克隆时,指定远程主机名
git clone -o test git@github.com:yysue/test.git
# -o 指定远程主机名,默认是origin
2 git remote
2.1 列出所有远程主机
git remote -v
# -v显示远程主机的网址
# origin git@github.com:yysue/test.git 表示远程主机及它的网址
2.2 查看主机详细信息
# 查看主机详细信息
git remote show origin
2.3 添加远程主机
# 添加远程主机,注意这里的url是gitee.com
git remote add for_rm git@gitee.com:yysue/test.git
git remote add for_rename git@gitee.com:yysue/test.git
# 添加之后,查看一下远程主机
git remote -v
2.4 删除,重命名远程主机
# 删除远程主机
git remote rm for_rm
# 重命名远程主机
git remote rename for_rename gitee_origin
# 修改之后,查看一下远程主机
git remote -v
3 git fetch
3.1 将远程主机的更新取回本地
git fetch <远程主机名> <分支名>
# 取回特定分支需要指定分支名
# 将某个远程主机的更新全部取回本地
git fetch <远程主机名>
# 默认取回所有分支的更新
git fetch
# 默认取回origin主机的所有分支
3.2 查看远程分支
git branch -r
# -r查看远程分支
# 在本地主机上要用"远程主机名/分支名"的形式表示远程分支,如origin/master
3.3 查看所有分支
git branch -a
# -a查看所有分支
# 本地主机的当前分支是master,远程分支是origin/master
3.4 以某分支为基础,创建新分支
git checkout -b dev origin/master
# 以远程主机origin上的master分支为基础创建分支dev并切换到分支dev
4 git pull
4.1 合并分支
git pull <远程主机名> <远程分支名>:<本地分支名>
# 这是完整格式 取回远程主机的某个分支的更新,再与本地的指定分支合并
git pull origin next
# 省略<本地分支名>表示与当前分支合并
# 取回origin/next分支,再与当前分支合并
# 等同于如下两个操作
git fetch origin
git merge origin/master
git pull origin
# 如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名
# 本地的当前分支自动与对应的origin主机进行合追踪分支(remote-tracking branch)进行合并
git pull
# 如果当前分支只有一个追踪分支,连远程主机名都可以省略
# 当前分支自动与唯一一个追踪分支进行合并
# 默认git pull <===> git pull origin master:master
# 默认远程主机为origin,远程分支为master,本地分支为master
git pull --rebase
# 等同于如下两个操作
git fetch origin
git rebase origin/master
4.2 追踪关系
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在
git clone
的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动追踪origin/master分支。
手动建立追踪关系
git branch --set-upstream master origin/next
# 指定master分支追踪origin/next分支
4.3 本地同步删除分支
如果远程主机删除了某个分支,默认情况下,git pull不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支
git pull -p
# -p 在本地删除远程已经删除的分支
# 等同于下面的命令
git fetch --prune origin
git fetch -p
4.4 git merge
假设初始的分支情况如下图:
# A在mywork上的操作 git checkout -b mywork origin echo 'a' >> a.txt git commit -am 'update a.txt' echo 'b' >> b.txt git commit -am 'update b.txt' # B在origin/master上的操作 echo 'c' >> c.txt git commit -am 'update c.txt' echo 'd' >> d.txt git commit -am 'update d.txt' git push
下面来区分git merge
与git rebase
的区别
在这里,你可以用"pull"命令把"origin"分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的"合并的提交"(merge commit):
# A在mywork上操作 git pull
4.5 git rebase
但是,如果你想让"mywork"分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase:
git checkout mywork git rebase origin
这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。
当'mywork'分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc)
5 git push
5.1 将本地的更新推送到远程主机
git push <远程主机名> <本地分支名>:<远程分支名>
# 分支推送顺序写法是<来源地>:<目的地>
# git pull <远程分支>:<本地分支>
# git push <本地分支>:<远程分支>
git push origin master
# 省略<远程分支名>
# 将本地的master分支推送到origin主机的master分支,如果后者不存在,则会被新建
git push origin :master
# 省略<本地分支名>
# 表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支
# 等同于下面的命令,删除origin主机的master分支
git push origin --delete master
git push origin
# 如果当前分支与远程分支存在追踪关系,则<本地分支名>和<远程分支名>都可省略
# 将当前分支推送到origin主机的对应分支
git push
# 当前分支只有一个追踪分支,主机名也可以省略
git push -u origin master
# 如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,
# 这样后面就可以不加任何参数使用git push
5.2 push默认模式
不带任何参数的
git push
,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config
命令。
git config --global push.default matching
# 或者
git config --global push.default simple
5.3 推送所有本地分支
不管是否存在对应的远程分支,将本地的所有分支推送到远程主机,这时需要使用
--all
选项。
git push --all
# 将所有本地分支推送到远程主机
5.4 强制覆盖远程版本
如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做
git pull
合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用--force
选项。
git push --force
# 本地版本覆盖远程版本,即使远程版本比本地版本新
5.5 推送标签
git push origin --tags
# --tags推送标签(tag),默认不推送