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的更多相关文章

  1. 11.Git分支-远程跟踪分支的概念、多个远程仓库的使用

    1.远程跟踪分支的概念 远程引用是对远程仓库的引用,包括分支.标签等等. 1.可以通过 git ls-remote <remote> 来获得远程引用的完整列表  2.git remote ...

  2. git 跟踪分支 远程跟踪分支 学习笔记

    远程跟踪分支相当于一个只读仓库指针,从服务器上获取数据,不可以被本地直接修改. 跟踪分支相当于一个本地指针   用于项目更新和迭代. 1跟踪分支  (tracking  branch)   逻辑示意图 ...

  3. Git本地提交到远程指定分支

    git push origin master:ziranmeng2.(本地分支:远程分支)

  4. git 本地分支与远程仓库分支关联

    当我们从远程仓库项目克隆到本地后,会自动创建本地master分支,并且与远程仓库主分支关联.如果我们需要在本地创建一个分支并且与远程仓库的origin/xxx分支关联,则可以通过以下命令实现 git ...

  5. 20.远程分支&跟踪分支

    远程分支 远程引用是对远程仓库的引用(指针),包括分支.标签等等. 你可以通过 git ls-remote (remote) 来显式地获得远程引用的完整列表,或者通过 git remote show ...

  6. 工作中常见的Git本地分支与远程分支同步场景

    Git 是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.   一直以来本人使用 Git 处理分支都是现用现查,一是因为怕出错,二还是因为懒,作为一名四年开发经验的前端 ...

  7. 12.Git分支-推送(push)、跟踪分支、拉取(pull)、删除远程分支

    1.推送 本地的分支并不会自动与远程仓库同步,你可以显示的向远程仓库推送你的分支.例如你在本地创建了一个dev分支,你想其他的人和你一样在dev之下进行工作,可以使用 git push <rem ...

  8. git创建本地分支以及推送本地分之至远程分支

    Git分支策略 实际开发中,应当按照以下几个基本原则进行管理: 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能再上边干活. 那在哪干活呢?干活都在dev分支上,也就是说,de ...

  9. git远程分支创建,本地分支关联远程分支,第一次发布、更新分支

    git远程分支创建,本地分支关联远程分支,第一次发布.更新分支 github托管服务器地址为https://github.com git提交更新代码示意图: 本地与远程进行免密码配置(本地与远程关联) ...

随机推荐

  1. 长安大学第四届“迎新杯”程序设计竞赛 H 圣诞节糖果【二分】

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言262144K64bit IO Format: %lld 题目描述 圣诞节临近,彩虹岛的黑心商人

  2. 语义分割丨PSPNet源码解析「训练阶段」

    引言 之前一段时间在参与语义分割的项目,最近有时间了,正好把这段时间的所学总结一下. 在代码上,语义分割的框架会比目标检测简单很多,但其中也涉及了很多细节.在这篇文章中,我以PSPNet为例,解读一下 ...

  3. 洛谷——P1130 红牌

    题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派了 ...

  4. Apollo 分布式配置中心

    1.  介绍 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置 ...

  5. Vuex 通俗版教程

    作者 Yeaseon 已关注 2017.03.16 16:44* 字数 1245 阅读 243评论 2喜欢 4 本文基本上是官方教程的盗版,用通俗易懂的文字讲解Vuex,也对原文内容有删减. 如果你对 ...

  6. 灰度发布+A/B测试

    一起需要提的还有灰度发布. 在方法论上都属于试错法. A/B测试就是上两个方案,部署后看效果.根据效果和一些结果参数决定采用哪个方案.灰度发布是切一部分业务使用新方案,看效果如何,是否有bug,会遇到 ...

  7. nx sdk

    最近在做ns 任天堂略坑.. 他想做成一键安装,可总是有些问题,这样再去找就很麻烦了.都是包在里面的,要看很多文档 第一个问题是 NintendoSDK Configuration Manager 这 ...

  8. maven module和project的区别

    Maven Project可以理解为父工程.Maven Module可以理解为子工程.创建Maven Module工程必须有存在的父工程,maven就是通过父子工程进行工程管理的.

  9. Python setup.py和MANIFEST.in文件

    Setup.py文件 from setuptools import setup from codecs import open # 第三方依赖包及版本号 requires = ['beautifuls ...

  10. Winform GridView打印类

      using System;using System.Collections.Generic;using System.Text;using System.Drawing.Printing;usin ...