Git使用心得

之前的项目一直在使用SVN管理项目代码,协同开发的场景较少,SVN也用着也还过得去。切到新项目后,都改为了Git管理项目库。

刚从Svn切过来的时候感觉不适应,搞不懂分支,本地库,fork仓的概念,也不知道如何更好的使用Git的特性来进行多个需求和问题的并行开发。经常会遇到各种问题。现在就把一些自己理解的概念和使用场景记录下。

Git在使用时大致是有3个层级:本地仓库,远程个人fork仓库,远程origin仓库。

在这里可能很多人没有个人fork仓,直接是提交代码至origin上的分支来进行提交代码。没关系,这两者不冲突,只是使用了不同的管理方式。

所以在提交代码时,也就有以下两种路径方式:

(1)修改代码->commit到本地:xxx分支->push到origin:yyy分支->提mr合入至origin:master;

(2)修改代码->commit到本地:xxx分支->push到远程个人fork仓:yyy分支->提mr合入至origin:master;

 按照我个人使用理解,公司内的项目,可以直接使用第一种方式,省略fork的步骤。因为不对外公开源码,即使基于origin创建多个分支,导致origin分支众多,也没有太大关系。但是开源项目就不允许这么做,否则会导致origin仓库分支太杂太乱,不易于管理,只有被管理员和其它commiter认可的人才有资格操作origin仓的分支。

新项目的人以前都是搞开源项目的,因此使用时都会把origin仓fork到个人仓,也就是上面(2)的方式。

下面记录下自己在用fork仓时,主要侧重写一些使用场景的理解,命令的基本使用方法:

1.git clone ssh://xxx.xxx.com:2222/xxx.git(针对的是远程仓库)

用来下载远程仓库,可以下载origin也可以下载个人fork仓,在当前目录形成git本地仓库及该目录的本地仓master分支。

2.git remote(针对的是远程仓库)

当使用git clone下载代码后,本地仓库上显示clone下来的远程仓库名称默认为origin。

我在开发过程中,先会用git clone把自己的fork仓down下来。然后再使用git remote命令把master仓也关联到这个本地仓库。这样可以灵活的pull和push到这两个仓库中。

git remote -v //查看远程仓库详情

git remote remove test //删除远程仓库

git remote rename {oldname} {newname} //重命名

git remote add {仓库名} git地址 //关联远程仓库到本地仓库,名称可以自定义

3.git fetch(针对的是远程仓库的具体分支)

git fetch origin master:tmp //从名为origin远程仓库,下载master分支代码到本地仓库的tmp分支

如果对origin进行了fork,使用remote命令关联到本地仓库,并且名称为zhangsan。那可以继续使用fetch命令下载zhangsan的分支代码到本地仓库。例如:

git fetch zhangsan master:fork_tmp //从名为zhangsan 远程仓库,下载master分支代码到本地仓库的fork_tmp分支

4.git reset --hard {tag} //强制回退代码至tag标签(针对的是本地仓库的当前checkout的分支)

5.git rebase {目标分支} //变基操作,将{目标分支}的commit log强行同步给当前checkout的分支。主要是为了解决当前分支commit log和准备pull代码的远端仓库log不一致的问题,log不一致则会导致冲突问题。


git使用时遇到困扰我多次的一个问题

在这里重点记录下这个问题,自己遇到了三次,每次都花了很大的力气去解决。现在把问题解决的规避方案和根本原因记录下。

问题出现时的仓库情况:

本地仓库关联的远程分支有两个,一个是master仓库(名称为origin),一个是fork了master的个人仓库(名称为zhangsan)。

本地仓库checkout的是master。本地代码已经修改完毕。zhangsan的代码和master的代码已经同步至一样。

所做的操作:

(1)commit代码到本地仓库分支,push代码至zhangsan:bugxxx分支;

(2)在zhangsan仓库的页面上,将bugxxx的代码提mr至master;

(3)管理员将代码合入master。

到现在为止,所有都是正常的。然后我发现代码没有修改完全,需要继续修改代码,然后再mr至master。

这时候我按照以前svn的思路,我认为可以直接从master仓库pull代码到本地仓库,因为不管别人有没有合入的东西,至少我跟origin:master的代码是一致的,我pull代码下来,应该是没有问题的。

但实际上,我pull代码下来的时候,已经变成了冲突,需要merge处理代码。但此时我无论如何merge,一直没有达到我预期的效果:本地仓库和master仓库一致。除非reset回退、rebase新的master本地仓库或者重新clone代码下来。

这到底是为什么呢?

其实问题就出在上面第三步中,第三步管理员其实没有直接同意我的mr,而是close我的mr。管理员在自己本地仓库pull了zhangsan:bugxxx分支的代码,再push到了master。所以我本地仓库代码虽然和master代码是一致的,但是commit id是不同的。因此我将master的代码pull到本地仓库的时候就提醒了代码冲突。

如何规避:

解决问题的办法就是先将本地修改的代码stash一把(如果有的话),然后将origin:master分支fetch至local_master,然后将当前开发分支rebase至local_master。这样commit log就一致了,再unstash代码下来。千万不能reset回退或者clone代码下来,因为reset会导致你本地修改代码丢失,重新clone会导致stash数据丢失。

根本解决方法:

其实造成这个问题的根本原因还是对Git的不了解,不知道如何使用它完成多特性开发。

我所有的操作都是在local:master上完成的,我本地只用了这一个分支来开发,完成提交、同步等的操作,不仅工作是串行的,而且容易就会造成commit log不一致的问题。

正确的做法是local:master只用来pull代码。如果遇到要开发特性的情况,则直接git checkout -b {新分支}。在新分支上开发完毕,提交代码。此时再切回local:master,pull代码也不会报错,因为一直与origin:master的commit log是同步的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 1.Git 是目前世界上最先进的分布式版本控制系统 2.与SVN区别是,集中式,版本放在中央库 3.windows...
    在路上缓缓前进的蜗牛阅读 182评论 0 0
  • 1. git 常用命令 . git add ——添加准备提交的文件. git commit -m "提交描述"...
    墨染草阅读 197评论 0 0
  • 注意 注意 注意 超级无敌重要!!! 重要的事情说3遍:最好在还没上传远端git仓库之前配置好gitignore文...
    JoyGY阅读 502评论 0 0
  • 声明:这篇文章来源于廖雪峰老师的官方网站,我仅仅是作为学习之用 Git简介 Git是什么? Git是目前世界上最先...
    横渡阅读 3,952评论 3 27
  • 北方越来越冷了,人们都想着如何在温室里赚钱,我也是。 于是百般曲折,我进了一个调查问卷群, 至于为啥进这类群,大部...
    wuli静静呵阅读 661评论 0 2