(搬运自我在SegmentFault的博客)

本人是个Git新手,平时用Git最多的就是push,因为别的都不怎么会用。这几天因为在小组中负责代码的整合,顺便将代码提交到Github,接触到了Git更多的用法。

第一个问题比较简单,其实是关于Github的问题。就是我平时用Git的机器是自己的电脑,密钥也是存在本机上并把上传到Github上。那么我在机房的机器上难道要复制一份私钥过来?既不优雅也不安全。(网上还真有人这么干。)其实Github这类网站是可以保存多份公钥的,不信自己到Edit Profile->SSH Keys去看看。这是也明白为什么Git的Windows GUI版为什么不用设置密钥了。顺便记一下生成密钥的过程备忘。

cd ~/.ssh
ssh-keygen -t rsa -C "YOUR_EMAIL@YOUREMAIL.COM"

此时~/.ssh/id_rsa.pub就是你的公钥。

第二个问题稍微复杂一点,是关于在多台机器提交代码导致的问题。因为我会在我自己的电脑和机房电脑修改代码,难免造成代码的不一致。这时如果push代码可能会出错,原因可能是本地代码在版本树中的位置更早,或者多处独立提交了代码导致冲突。通常此时应当先将代码拉取下来解决冲突。

git fetch origin

执行完这一句后,我们会把执行git branch -r看到的远程分支都fetch下来。下面执行merge。

git merge origin/a-branch

这样会将远程repo中名叫a-branch的分支合并到本地的当前分支,默认就是master。关于分支的问题会在第三个问题再说。

如果merge之后自动解决了冲突最好,没有的话就略麻烦。Git会将所有有冲突的文件显示在终端里。如下图所示。

我们打开有冲突的文件,会看到类似下面这样的标识。

其中横线前的部分表示本地分支的内容,横线后则表示origin/master中的内容。

根据Git的提示,我们需要手动消除冲突。而不管我们改成什么样,Git并不关心,哪怕我们什么也不改也可以。注意此时我们用git status查看发现,冲突的文件被标记为了unmerged paths.

手动消除冲突后,我们就可以将这些文件加到暂存区。之后就可以随意commit和push了。

不过也有时候,Git会自动进行Fast Forward Merge

如果merge的结果不是我们想要的怎么办?

git reset --hard

那么,如果我们本地的分支是领先于远程分支,那么merge会怎么样?请看图。

至于merge和rebase的区别,stackoverflow上已经说的很好了。假设这是目前的状态:

      C---D---E local
/
A---B---F---G remote

merge之后是这样:

      C---D---E local
/ \
A---B---F---G---H remote

而rebase之后是这样:

              C'--D'--E' local
/
A---B---F---G remote

当然,他们的效果自然是一样的。

下面就是第三个问题了,关于Git中的分支。对于Git中的这一功能,之前一直没有去仔细研究,直到今天我们组就项目的某一实现产生了分歧,组长让我创建一个分支进行试验。假定我在本地创建出一个名叫test的分支:

git branch test

切换到test分支:

git checkout test

删除test分支:

git branch -d test

使用分支的一个好处自然就是代码可能在多个方向同时进行而不会相互干扰。当你切换到一个分支时,代码就会自动更换成对应分支的内容。而这一切都可以交给Git,而不需要自己手工备份代码。

问题驱动的Git学习的更多相关文章

  1. Git学习笔记---协作的一般流程

    一般的操作流程 1.pull 王小坤与另一个同事张大炮一起开发一个项目,张大炮昨天修改了数据库读写的api,优化了执行速度,并把read()函数改名成了Read(),下午下班之前把这些代码push到服 ...

  2. Git 学习看这篇就够了!

    Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. 可能新手会问"git和github有什么关系啊?" git是一个版本控制工具: githu ...

  3. Git学习笔记与IntelliJ IDEA整合

    Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...

  4. git学习之branch分支

    作为新手,站在我的角度肤浅的来理解,分支就是相当于开辟了一个新的临时工作区,在这个工作区进行文件代码改动,然后在合并到master主工作区,这样能保证主工作区的安全性和稳定性,对于团队协作尤为重要. ...

  5. git学习手册

    #git学习手册 git: Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.[2] Git 是 Linus Torvalds 为了帮助管理 Linux内核开发而 ...

  6. Git学习笔记(10)——搭建Git服务器

    本文主要记录了Git服务器的搭建,以及一些其他的配置,和最后的小总结. Git远程仓库服务器 其实远程仓库和本地仓库没啥不同,远程仓库只是每天24小时开机为大家服务,所以叫做服务器.我们完全可以把自己 ...

  7. Git学习笔记(四)

    一.忽略特殊文件 在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件. 不需要从头写.gitignore文件,GitHub已经为我们 ...

  8. git 学习笔记6--remote & log

    git 学习笔记6--remote & log 创建SSH Keys ssh-keygen -t rsa -C "1050244110@qq.com" 本地关联远程 git ...

  9. Git学习(4)基本操作

    1.版本提交 首先,接着上个Git学习(3)继续 我们先修改test.txt文本内容,增加一些信息进去,然后保存: Add a new data 第一步:运行命令 git status 命令查看文件是 ...

随机推荐

  1. VNC协议分析

    VNC协议分析 摘自: http://blog.csdn.net/forever_feng/article/details/4703088 简介 VNC(Virtual Network Computi ...

  2. 7.10实习培训日志-markdown Git

    父模块github地址 一. markdown 1. markdown列表 html是一种发布的格式,markdown是一种书写的格式 区块引用 列表 图片 表格 html 标题 记笔记 写博客 2. ...

  3. 死磕 java同步系列之JMM(Java Memory Model)

    简介 Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果. 硬件内存模型 在正式讲解Java的内存模 ...

  4. 如何让div中的span垂直居中 ----height:100%设置div的高度

    如果div中只有一个span一个元素,可以使用line-height.如果div中还有其他元素,可以设置span的css如下: .span{ position: absolute; top: 50%; ...

  5. Unity3d 5.3.5使用sqlite3

    http://blog.csdn.net/glunoy/article/details/52037598 国内讲的乱七八糟,更有故作神秘提供Mono.Data.Sqlite.dll System.Da ...

  6. 自动化测试工具 Test Studio入门教程

    Test Studio安装 可以到下载试用版 官网 http://www.telerik.com/teststudio , 装完以后需要装silverlight 安装好了,主界面是介个样子的 Test ...

  7. [Xcode 实际操作]七、文件与数据-(4 )遍历文件夹中的文件

    目录:[Swift]Xcode实际操作 本文将演示如何遍历文件夹下的内容. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...

  8. 维护gcd的线段树 补发一波。。。

    基础线段树(辣鸡的不行) 发现自己线段树除了会维护加法和乘法就啥也不会了QWQ太菜了 瞎写了一个维护gcd的 首先,gcd(x,y)= gcd(x,y-x) 并且很容易推广到n个数,所以我们可以把原数 ...

  9. HDU-1845-Jimmy's Assignment

    链接:https://vjudge.net/problem/HDU-1845 题意: 给一个有向图,求最大匹配. 思路: 有相图的最大匹配,可以通过加上反向边, 求这个无向图的最大匹配, 原图的最大匹 ...

  10. Entitas实现简析

    Entitas实现简析   这里主要讲Entitas的执行原理,不讲Entitas的代码生成方面. ECS简介   ECS(实体-组件-系统)是一种常用于游戏开发的架构模式.   实体: 实体只是一个 ...