问题驱动的Git学习
(搬运自我在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学习的更多相关文章
- Git学习笔记---协作的一般流程
一般的操作流程 1.pull 王小坤与另一个同事张大炮一起开发一个项目,张大炮昨天修改了数据库读写的api,优化了执行速度,并把read()函数改名成了Read(),下午下班之前把这些代码push到服 ...
- Git 学习看这篇就够了!
Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. 可能新手会问"git和github有什么关系啊?" git是一个版本控制工具: githu ...
- Git学习笔记与IntelliJ IDEA整合
Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:http://git-scm.com/downloads Git简要使用说明:h ...
- git学习之branch分支
作为新手,站在我的角度肤浅的来理解,分支就是相当于开辟了一个新的临时工作区,在这个工作区进行文件代码改动,然后在合并到master主工作区,这样能保证主工作区的安全性和稳定性,对于团队协作尤为重要. ...
- git学习手册
#git学习手册 git: Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.[2] Git 是 Linus Torvalds 为了帮助管理 Linux内核开发而 ...
- Git学习笔记(10)——搭建Git服务器
本文主要记录了Git服务器的搭建,以及一些其他的配置,和最后的小总结. Git远程仓库服务器 其实远程仓库和本地仓库没啥不同,远程仓库只是每天24小时开机为大家服务,所以叫做服务器.我们完全可以把自己 ...
- Git学习笔记(四)
一.忽略特殊文件 在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件. 不需要从头写.gitignore文件,GitHub已经为我们 ...
- git 学习笔记6--remote & log
git 学习笔记6--remote & log 创建SSH Keys ssh-keygen -t rsa -C "1050244110@qq.com" 本地关联远程 git ...
- Git学习(4)基本操作
1.版本提交 首先,接着上个Git学习(3)继续 我们先修改test.txt文本内容,增加一些信息进去,然后保存: Add a new data 第一步:运行命令 git status 命令查看文件是 ...
随机推荐
- 修改mac host文件绑定域名
打开终端在终端terminal中输入 sudo vi /etc/hosts 上一步输入完成之后按enter回车键,如果当前用户账号有密码,则在按完之后会提示输入密码,此时输入当前账户密码后继续按ert ...
- python寻找小于给定值的最大质数
# -*- utf-8 -*- # @Time: 2019-04-16 # @ Author: chen def prime(self, value): """判断是否为 ...
- LOL数值分析
http://blog.sina.com.cn/s/blog_704133cb01018hud.html 为了从理论层面提高自己打<英雄联盟>的水平,再加上自己也有这方面的兴趣,所以我最近 ...
- 在Visual Studio中编译Linux的一些问题
相对路径: 在windows下,和当前文件同一个目录下的引用会这么写: #include "SubDirectory\header.h" 或者 #include "Sub ...
- AGC001 F - Wide Swap【线段树+堆+拓扑排序】
给出的模型很难搞,所以转换一下,记p[i]为i这个数的位置,然后相邻两个p值差>k的能交换,发现使原问题字典序最小也需要使这里的字典序最小 注意到p值差<=k的前后顺序一定不変,那么可以n ...
- 分层确定性钱包开发的代码实现(HD钱包服务)
HD Wallets的全称是Hierachical Deterministic Wallets, 对应中文是 分层确定性钱包. 这种钱包能够使用一组助记词来管理所有的账户的所有币种,在比特币的BIP3 ...
- appium自动化测试框架——封装获取设备信息类
在上一节中,我们已经解决了如何在python中执行cmd,并获取执行结果.下面就小小实战一下,获取设备信息. 一.思路 1.windows上获取设备信息的方法 输入dos命令“adb devices” ...
- Spring征服数据库
一.spring的数据访问哲学 1. Srping的目标之一就是允许我们在开发应用程序的时候,能够遵循面向对象(Object Oriented,OO)原则中的"针对接口式编程"; ...
- HBase中报错 java.lang.NoClassDefFoundError: com/google/protobuf/LiteralByteString
Protobuf(全称 Protocol Buffers)是 Google 开发的一种数据描述语言,能够将结构化数据序列化,可用于数据存储.通信协议等方面.在 HBase 里面用使用了 Protobu ...
- 2017ACM/ICPC广西邀请赛 CS Course
题意:删除指定数字,求剩下数字的与或非值 解法:保存一下前缀和后缀 #include <iostream> #include <stdio.h> #include <ve ...