在多台电脑使用git管理开发分支的时候,会出现这样的情况。电脑A创建了分支1,并且push上了远程仓库。
电脑B本地clone仓库默认只会clone下master分支,而其他电脑A推送的分支是不会默认同步下来的。
那么如何同步呢?
两种方法:
第一种
git branch
首先,先来看看上面描述的情况,电脑B查看本地的所有分支,如下:
$ git branch
* master
可以看到clone下来的远程仓库并不会将所有分支都clone下来。
git branch -a
上面看了本地仓库只有master分支,那么怎么查看本地和远程仓库的所有分支呢?如下
root@localhost:~/word/git/centos-logos(master○) # git branch -a
remotes/origin/c4
remotes/origin/c5
remotes/origin/c5-plus
remotes/origin/c6
remotes/origin/c6-plus
remotes/origin/c7
remotes/origin/c8
remotes/origin/c8-sig-artwork
从这里已经可以知道远程有哪些分支可以提供本地去同步了,目前是没有一个可以供本地同步的,都是远程分支。那么如果单独查看远程的分支呢?
git branch -r
单独直接查看远程仓库的所有分支如下:
root@localhost:~/word/git/centos-logos(master○) # git branch -r
origin/c4
origin/c5
origin/c5-plus
origin/c6
origin/c6-plus
origin/c7
origin/c8
origin/c8-sig-artwork
其实用起来还没有直接 git branch -a
查看所有来得清晰。下一步看看如何同步远程分支
git fetch
将本地分支与远程保持同步git checkout -b 本地分支名x origin/远程分支名x
拉取远程分支并同时创建对应的本地分支首先同步所有远程分支,如下:
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
root@localhost:~/word/git/centos-logos(master○) # git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
Branch c4 set up to track remote branch c4 from origin.
Branch c5 set up to track remote branch c5 from origin.
Branch c5-plus set up to track remote branch c5-plus from origin.
Branch c6 set up to track remote branch c6 from origin.
Branch c6-plus set up to track remote branch c6-plus from origin.
Branch c7 set up to track remote branch c7 from origin.
Branch c8 set up to track remote branch c8 from origin.
Branch c8-sig-artwork set up to track remote branch c8-sig-artwork from origin.
root@localhost:~/word/git/centos-logos(master○) # git br -a 127 ↵
c4
c5
c5-plus
c6
c6-plus
c7
c8
c8-sig-artwork
remotes/origin/c4
remotes/origin/c5
remotes/origin/c5-plus
remotes/origin/c6
remotes/origin/c6-plus
remotes/origin/c7
remotes/origin/c8
remotes/origin/c8-sig-artwork
root@localhost:~/word/git/centos-logos(master○) #
此时已经有本地分支了,而且也和远程分支关联了
将本地所有分支与远程保持同步 git fetch --all
最后拉取所有分支代码 git pull --all
然后修改远程分支地址
git remote set-url origin ssh://[email protected]:2222/x86/centos-logos.git
提交所有本地分支到修改后的远程分支以及tags
git push -u origin --all
git push -u origin --tags
第二种方法git clone 所有分支,并push到另一个repo
啥,github的私人项目免费了??赶紧把gitlab的私人项目迁移出来压压惊。这要求我们,首先将所有的分支从gitlab下载到本地,并且是本地分支,然后推送到github上去。但是,直接git clone的话,查看本地分支,竟然只有是master分支?我的天,但是我想要的是推送所有的分支到github上。咋整?git clone
后git branch
为啥只看到了一个本地分支master
。难道不会把所有分支都clone下来?
我们查看git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/branch1
remotes/origin/branch2
但是,如果我们直接切换分支git checkout branch1
显示
分支 branch1 设置为跟踪来自 origin 的远程分支 branch1。
切换到一个新分支 'branch1'
git branch
master
*branch1
啥,怎么这么诡异。为啥我能切换到远程分支?其实是这样的,git clone
会将所有的远程分支都下载下来,但是就是把远程的master
会变成本地的master
分支。其他的远程分支,名字仍旧是远程分支,没有重新命名。一个个checkout?如果我项目有几十个分支,那我不要累死??
正确的解决方法:
首先将项目的所有分支clone下来,并且变成本地分支。
mkdir centos-logos
cd centos-logos
git clone --bare https://git.centos.org/rpms/centos-logos .git
git config --unset core.bare
git reset --hard
上面的意思是,首先随便建立一个文件夹centos-logos,然后在里面只将https://git.centos.org/rpms/centos-logos的.git文件夹拷贝下来!此时,centos-logos里面还是没有任何repo的文件,只有一个隐藏文件夹.git。然后解除core.bare模式,然后再恢复所有的repo文件。此时,所有的xxx的所有的分支都是本地分支了!
将所有的分支都推送到github上去
首先新建一个github项目。比如是yyy
。
别看github的提示了,完全在扯。
原始github教你的迁移方式:
git remote add origin ssh://[email protected]:2222/x86/centos-logos.git
git push -u origin master
这是干嘛,首先直接git remote add origin ssh://[email protected]:2222/x86/centos-logos.git肯定会出错,因为你git clone下载的项目,其相应的远端分支remotes/origin是对应的是gitlab/xxx的位置。其次,这里git push -u origin master只是将当前分支推送到远端的master分支啊,这样github只会有一个master分支!
正确方法
git remote rename origin old_origin
git remote add origin ssh://[email protected]:2222/x86/centos-logos.git
git push -u origin --all
git push -u origin --tags
或者
git remote set-url origin ssh://[email protected]:2222/x86/centos-logos.git
git push -u origin --all
git push -u origin --tags
第一条命令,因为当前的默认remote的origin是gitlab的那个xxx,那么肯定要放弃那个,直接随便改个名字就行,比如这里改成old_origin。然后,再添加新的remote origin。然后,我们将所有的branch推到github上去,这里是用--all,不是master。最后一句话,是将tags也推上去。