git学习记录
远程分支
clone命令
git clone url;
- 将url地址指向的远程仓库和分支克隆到本地,本地将会创建远程
origin/master
分支和本地master
分支,每次pull都会更新origin/master
分支的位置与而master
分支则是默认创建的跟随origin/master
的分支
fetch命令(无参数)
git fetch;
- 从远程仓库下载本地仓库中所有缺失的提交记录
- 更新远程分支指针(如
o/master
) - fetch命令不会更改本地的master分支指针,也不会修改本地文件的内容
fetch命令(有参数)
git fetch origin source;
从远程仓库的source分支下载本地同名分支缺失的提交记录,然后更新o/source
分支指向。
git fetch origin source:destination;
从远程仓库的source分支复制本地destination分支没有的部分,然后更新destination
分支指向
注:destination
分支在本地仓库中不存在则git会自动创建
当source
不填时,git会在本地仓库自动创建一个destination
分支
fetch同样支持例如side1^,side1~n的位置写法
merge命令
git merge sideName;
- 合并分支
- 此处的sideName指与当前选中分支合并的分支名
rebase命令
git rebase father;
将当前节点的父节点改为father节点
git rebase father child;
将child节点的父节点更改为father节点
pull命令(无参数)
git pull url;
- pull命令相当于
merge
和fetch
命令的合并,先从远程仓库下载本地没有的记录,然后再与本地当前选中的分支合并 - 记录会被先下载到 o/master 上,之后再合并到本地的 master 分支
pull命令(有参数)
实质上是fetch和merge的结合
push命令(无参数)
git push;
- 将远程仓库与本地对比所缺少的部分进行提交,并更新
o/master
指向 - 在推送至远程仓库时,要确保本地仓库包含当前远程仓库的每一次提交操作,才能成功
push
- 这是未指定参数方式, git 通过当前检出分支的属性来确定远程仓库以及要 push 的目的地
push命令(有参数)
git push remote place
例如:git push origin master
这一条命令表示获取本地master
分支所有的提交,然后到远程仓库origin
的master
分支查看是否有没有的记录然后将没有的记录提交。
此处的place
既指push
是从本地place
分支开始又指push的目的地是远程仓库的place分支
注:此命令不受head指针影响,就算checkout任意一个节点,只要在push中指定place就可以成功推送
git push remote source:destination //适用与来源和目的不是同名分支
注:上述命令当destination
不存在时,git会在远程仓库自动创建分支,当source
不填,执行push的时候会删除远程仓库的foo
分支和本地的o/foo
分支
source
可以接收分支名和位置参数,分支名例如side1,side2,位置参数例如side1^(side1之前的节点),side1~n(表示side1之前的n个节点)
历史偏移问题
当你以git clone
克隆了远程仓库和master
分支后进行开发,在开发的过程,中如果远程仓库已经更新了新的提交,此时本地保存的内容已经和远程仓库不同了,所以push指令无法生效
解决方案
-
rebase方法
fetch
命令拉取最新的远程仓库内容git fetch;
rebase
命令更换本地当前节点的父节点,例如:本地c2提交原本依赖于远程仓库克隆的c1,但是现在远程仓库c1已经更新为c3,无法直接push
推送。使用rebase
将c2的父节点更新为fetch
下来的c3,这样便可以推送到远程仓库了。下面代码中
o/master
为fetch
下来的最新节点git rebase o/master
以上两条命令可以简写为
git pull --rebase;
推送
git push
-
merge方法
fetch
命令拉取最新的远程仓库内容git fetch;
merge
命令将本地当前分支与最新获取的远程分支合并git merge o/master;
以上两条命令可以简写为
git pull;
推送
git push
总结
跟踪分支
-
方法一
当从远程仓库克隆时会自动建立一个名为
origin/master
的远程分支和名为master
的跟随分支(跟随origin/master
分支),如果想自定义跟踪分支,可以使用checkout
命令git checkout -b side1 o/master //令新建的side1分支跟随o/master分支,这时o/master更新,side1会一并更新,而master不会更新
-
方法二
git branch -u o/master side1
两种情况下,均设置了跟踪
o/master
,当使用pull命令时,当远程仓库没有同名分支,只更新master分支。如果没有设置跟踪
o/master
,当使用pull命令时,当远程仓库没有同名分支,会新建side分支。