开发过程中,本地分支和远程跟踪分支发生了diverge
1 git基本概念梳理
1.1 git的工作目录、暂存区和HEAD指向的版本库以及branch的概念
一个branch就是整个产品的一套代码,而工作目录中就是存放的本branch最新的代码,HEAD指向的branch是最近一次提交后的整个产品的一套代码。从branch的角度就能够很好的把工作目录和HEAD指向的版本库联系起来了。工作目录中的一套代码存放在外存的一个位置,版本库的代码存放在另外一个位置。暂存区中只是存放git add的几个文件而已。
另外,版本库和远程的版本库是一样的,但是,本地的版本库如果没有更新的话,一些分支的会落后远程库一些commit。
要想本地的版本库和远程的版本库的代码一致,那么就git fetch <remote>就行,不用指定主机名,因为clone本地库的时候,就已经把本地和远程主机关联起来了。git已经记住了。
2 各个命令不要单独用,而是加上branch已经主机名,这样的话,不会记混
也就是说,记住其操作的对象。
2.1 命令操作的对象
2.1.1 远程主机
只在git clone时会用到。
2.1.2 远程主机上的仓库和远程主机上的仓库中的分支
使用git branch -r就可以查看到远程主机上的仓库和分支,返回的是一个<remote>/<branch>列表,前面就是远程仓库名,后面是各个branch名。
所有,git操作的基本单位是branch,但是为了把远程和本地的branch区分开,就用了一个远程仓库名。
3 不要用git pull,用git fetch
git fetch <remote>将远程的所有分支的代码拉取到本地,它不会merge,本地仓库就和远程仓库同步了,然后就可以进行branch的merge了。
4 本地的分支和远程跟踪分支发生了分歧的解决办法,最简单的方式
第一,保存好本地修改的未提交的代码
第二,同步本地版本库到远程版本库
git fetch <remote>
第三,重新定义本分支的commit链表
git reset <remote>/<branch>
这样的话,HEAD指针就指向了远程分支的最新一次提交,那么该branch就和远程的branch一样了。
但是,现在工作区和缓冲区还没有变化,
工作区是当前branch的最新代码,如果加了--hard的话,那么,工作区的代码会被更新到该branch最新的状态的所有代码。
而缓冲区就会被清掉,因为,工作区和当前分支的版本库是一样的,那么它就什么也没有了。
如果使用--soft,当前工作区和缓冲区都不变。那么当前工作区的代码就会和当前分支版本库中的代码区别比较大了,因为很可能很多人已经向远程分支提交了commits。这个时候怎么办呢?因为很多当前分支库的代码工作区都没有,难道这次提交之后,工作区没有的这些代码就会被删除吗?是的,如果很多提交的话,都会没有了。
--soft的使用时机?适合于变更集合比较小,也就是说,本地进行了一次提交,但是还没有push到远程分支,这个时候,可以git reset --soft HEAD^,这样的话,就会把本次提交丢弃,但是工作目录中还存在本地修改,然后再提交就可以了。也就是说,git的这些命令都是有自己的适用范围的。
因此,如果远程分支已经有别人提交了,那么用git reset --hard <remote>/<branch>,那么本地分支和远程分支又同步了,然后工作目录和缓存目录也都干净了。
第四,再把修改的文件加进来
改好后,重新提交即可。
5 怎样避免发生diverge
在多个人同时在一个分支上开发时,很容易发生diverge的情况。为什么会发生diverge呢?主要的原因是因为没有同步服务器端最新的代码。服务器端已经有新的commit了,但是,自己并没有同步,就commit,这样的话,自己和远程分支就会diverge。
那么怎样避免呢?做到两点就可以避免,第一,commit前必须要先同步到远程最新的代码,同步的时候就算conflict也没有关系,只要解决冲突就可以了。第二,commit之后尽快push到服务器端。这样可以尽量减少diverge的可能性。当不可避免的发生了diverge这么办呢?4是一种很保守的做法。更好的办法
第一种思路,git fetch origin/master然后git merge origin/master
第二种思路,git fetch origin/master然后git rebase
开发过程中,本地分支和远程跟踪分支发生了diverge的更多相关文章
- 11.Git分支-远程跟踪分支的概念、多个远程仓库的使用
1.远程跟踪分支的概念 远程引用是对远程仓库的引用,包括分支.标签等等. 1.可以通过 git ls-remote <remote> 来获得远程引用的完整列表 2.git remote ...
- git 跟踪分支 远程跟踪分支 学习笔记
远程跟踪分支相当于一个只读仓库指针,从服务器上获取数据,不可以被本地直接修改. 跟踪分支相当于一个本地指针 用于项目更新和迭代. 1跟踪分支 (tracking branch) 逻辑示意图 ...
- Git本地提交到远程指定分支
git push origin master:ziranmeng2.(本地分支:远程分支)
- git 本地分支与远程仓库分支关联
当我们从远程仓库项目克隆到本地后,会自动创建本地master分支,并且与远程仓库主分支关联.如果我们需要在本地创建一个分支并且与远程仓库的origin/xxx分支关联,则可以通过以下命令实现 git ...
- 20.远程分支&跟踪分支
远程分支 远程引用是对远程仓库的引用(指针),包括分支.标签等等. 你可以通过 git ls-remote (remote) 来显式地获得远程引用的完整列表,或者通过 git remote show ...
- 工作中常见的Git本地分支与远程分支同步场景
Git 是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. 一直以来本人使用 Git 处理分支都是现用现查,一是因为怕出错,二还是因为懒,作为一名四年开发经验的前端 ...
- 12.Git分支-推送(push)、跟踪分支、拉取(pull)、删除远程分支
1.推送 本地的分支并不会自动与远程仓库同步,你可以显示的向远程仓库推送你的分支.例如你在本地创建了一个dev分支,你想其他的人和你一样在dev之下进行工作,可以使用 git push <rem ...
- git创建本地分支以及推送本地分之至远程分支
Git分支策略 实际开发中,应当按照以下几个基本原则进行管理: 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能再上边干活. 那在哪干活呢?干活都在dev分支上,也就是说,de ...
- git远程分支创建,本地分支关联远程分支,第一次发布、更新分支
git远程分支创建,本地分支关联远程分支,第一次发布.更新分支 github托管服务器地址为https://github.com git提交更新代码示意图: 本地与远程进行免密码配置(本地与远程关联) ...
随机推荐
- 机器学习(4):数据分析的工具-pandas的使用
前面几节说一些沉闷的概念,你若看了估计已经心生厌倦,我也是.所以,找到了一个理由来说一个有兴趣的话题,就是数据分析.是什么理由呢?就是,机器学习的处理过程中,数据分析是经常出现的操作.就算机器对大量样 ...
- 【强连通分量】 Kosaraju和Tarjan算法 (标准模板+详细注释)
codevs 题意:求最大强连通分量的大小以及所包含的顶点有哪些 Tarjan算法 #include<iostream> #include<queue> #include< ...
- Splitting Pile --AtCoder
题目描述 Snuke and Raccoon have a heap of N cards. The i-th card from the top has the integer ai written ...
- Linux ClientDataSet libmidas.so.2
Linux ClientDataSet libmidas.so.2 DELPHI LINUX程序使用CLIENTDATASET控件,部署的时候需要libmidas.so,相当于WINDOWS程序的MI ...
- 2017.2.12 开涛shiro教程-第七章-与Web集成
2017.2.9 开涛shiro教程-第七章-与Web集成(一) 原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. ...
- mysql莫名的主键重复
REPAIR TABLE t_car_type; OPTIMIZE TABLE t_car_type; 可解决问题
- STL源代码分析--第二级空间配置器
本文解说SGI STL空间配置器的第二级配置器. 相比第一级配置器,第二级配置器多了一些机制,避免小额区块造成内存的碎片.不不过碎片的问题,配置时的额外负担也是一个大问题.由于区块越小,额外负担所占的 ...
- 怎样推断server为虚拟机还是物理真机?
dmidecode |grep -A20 "Memory Device$"|sed -n -e'/Locator/p' -e '/Size/p'|grep -v "Ban ...
- 我是这样使用template.js来异步渲染数据的demo
直接来代码吧! <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- python tkinter module的用法
tkinter windows下从python3.2版本之后是自动安装的. python3.3之后的引入方式: >>> import _tkinter>>> imp ...