把学习过程中遇到的Git问题汇总如下(后续学习遇到问题会及时更新此专栏):
Git原理及常用命令小结——实用版(ing......)、Git设置用户名邮箱-CSDN博客
解决git每次push代码到github都需要输入用户名以及密码-CSDN博客
在VScode中使用Git将本地已有文件夹提交到Github仓库以便于使用版本控制进行项目开发-CSDN博客
Git使用—把当前仓库的一个分支push到另一个仓库的指定分支、基于当前仓库创建另一个仓库的分支并推送到对应仓库(mit6828)-CSDN博客
目录
背景提示
将当前仓库的一个分支push到另一个仓库的指定分支
直接基于仓库rep1中的某个分支创建新的分支并将其推送到目标仓库rep2
补充
参考链接
背景提示
最近打算做一下mit6.828的项目,这个仓库使用问题困扰了自己一段时间,由于6828官方提供的代码有很多分支,克隆下来后如果不解除和原有仓库的关联,可以正常使用,但自己修改代码无法提交,并且不能使用自己的仓库。我希望的是将克隆下来的代码,作为自己的一个仓库,推送到自己Github网站,随后基于Git进行代码分支管理、开发。问题:将克隆的代码和官方仓库解除关联:
git remote rm origin
执行此操作后本地代码显示没有任何分支,无法切换到对应目录,无法进行后续操作,自己探索,一下。需要实现的功能是创建一个自己的仓库,当需要使用到对应分支时,将官方仓库对应分支拷贝到自己仓库对应分支。
将当前仓库的一个分支push到另一个仓库的指定分支
下面内容转载自:GIT操作:把当前仓库的一个分支push到另一个仓库的指定分支_gitpush到指定branch-CSDN博客
有时候我们想把当前仓库A的一个指定分支1 推给 另一个仓库B的另一个指定分支2,
可以通过2个主要命令git remote xxx 和 git push newOrigin 当前分支:目标分支 完成。
示例
假设有2个仓库rep1和rep2
rep1:当前仓库 rep2:目标仓库
我们想把当前仓库[rep1]的指定分支[branch1]
推给
另一个仓库[rep2]的指定分支[branch2]
具体步骤如下:
1.在当前仓库操作:更新代码库
git pull
2.查看当前仓库origin只有一个,接下来我们要add另一个仓库的origin
git remote
or
git remote -v(可以看到origin的url)
3.newOrigin:远程仓库名称,可以随便起个方便记忆的,目的是在本地添加一个新的远程链接
git remote add newOrigin mastereg:git remote add rep2 branch2
or
git remote add rep2 master
rep2后面是rep2的一个分支,可以指定为master或你要push的目标分支,都可以。执行完命令后可以再次通过git remote or git remote -v查看现在有几个origin,大家可以自行试一试。
4.为新加的仓库设置上目标仓库的url地址(以下以gitee为例)
git remote set-url rep2 https://gitee.com/greatoak/rep2.git
5.在A的本地仓库进行git push
git checkout 本地分支名
git push <远程主机名> <本地分支名>:<远程分支名>eg:git checkout branch1
git push newOrigin branch1:branch2
newOrigin是你想push上哪个远程库,branch1是你想push的那个分支,branch2是push到远程的那个分支。
注意,push前先切换到要push的当前分支上,然后再push。
使用上述命令完成操作后,在仓库rep2拉取创建的推送的分支的最新代码时,会报错:git pull "fatal: 拒绝合并无关的历史"
查了一下这个原因参考:
- 当你执行
git pull
并遇到错误 "fatal: 拒绝合并无关的历史" 时,这是因为本地分支和远程分支之间的提交历史并不相关(即它们没有共同的祖先提交)。这种情况通常发生在以下几种场景:
- 你初始化了一个新的本地仓库,然后试图从一个远程仓库中拉取代码。本地仓库和远程仓库之间没有任何共同的提交历史。
- 远程仓库和本地仓库是由不同的历史创建的,比如远程仓库是一个独立创建的项目,而你的本地仓库是从零开始的
在pull命令后添加 --allow-unrelated-histories参数解决:
git pull origin feat/util --allow-unrelated-histories
直接基于仓库rep1中的某个分支创建新的分支并将其推送到目标仓库rep2
通过以上操作能够实现自己想要的效果,但又思考了一下,如果我每开发一个对应的分支,都需要关联新的分支到源仓库rep1,随后从源仓库rep1将新的分支推送到目标分支岂不是太麻烦了。
直接在关联了目标仓库Git的代码中,基于想要的分支创建新的分支,并将其提交到目标仓库中。实现方式参考乳如下:
1、查看源仓库和目标仓库
wt@wt:~/Backend/mit6828/codes/xv6-labs-2020$ git remote -v
origin git://g.csail.mit.edu/xv6-labs-2020 (fetch)
origin git://g.csail.mit.edu/xv6-labs-2020 (push)
wt_rep git@github.com:Wwt15537588047/mit6828.git (fetch)
wt_rep git@github.com:Wwt15537588047/mit6828.git (push)
上述仓库origin是mit6.828官方仓库,wt_rep仓库是基于第一种实现方式关联的目标仓库。
2、查看远程源仓库和目标仓库的分支:
git branch -a
3、切换到对应分支:
git checkout origin/lazy ;源仓库的对应分支。
4、 基于源仓库的某个分支创建新的分支:
git checkout -b new-branch
5、提交本地修改:
git add . 和 git commit -m "new-branch"
6、将新分支推送到目标仓库(我这里是wt_rep):
git push wt_rep new-branch。
7、设置跟踪分支:(这一步我直接跳过了)
git push --set-upstream wt_rep new-branch
以上操作完成后基本实现了基于源仓库rep1的某个分支创建新分支并将新分支推送到目标仓库rep2。此时使用命令git branch --remote从目标仓库拉取所有远程分支并不会出现刚刚新创建的分支。
按照以下命令从配置的远程仓库拉取所有的分支:(前两条命令只需要执行一条即可)
git fetch origin #从配置的远程仓库origin拉取所有分支
git fetch --all #从配置的所有远程仓库拉取分支
git branch -a #获取所有远程仓库和本地仓库的分支的信息
补充
git remote -v #获取所有远程仓库的信息
git branch #获取所有本地分支
git branch -r #获取所有远程分支
git branch -a #获取所有远程分支和本地分支
git fetch --all #当维护多个远程仓库时,并且希望获取所有远程的更新时使用
git fetch origin #仅仅维护一个默认仓库origin,并希望获取origin仓库的更新时使用
git remote prunge origin #清除本地缓存并重新获取远程分支
其他Git相关操作请参考笔者其他文章
参考链接
GIT操作:把当前仓库的一个分支push到另一个仓库的指定分支_gitpush到指定branch-CSDN博客
git pull "fatal: 拒绝合并无关的历史"-CSDN博客