Git在工作中的常见使用(二)

1.前言


Git的本地使用仅仅服务于个人,若想多人合作,还是得通过网络和远程仓库来共享和同步。这时就面临着如何获取代码,如何更新代码,如何解决冲突和如何上传代码等问题。只要了解了这些,便可以在工作中舒服地使用Git了。

2.从远端获取


作为一名开发者,最常遇到的情况便是中途参与一个项目,那么获取已经完成的代码,在此基础上开发是必修课。

2.1.下载到本地

远程仓库是存在服务器上的,需通过网络地址去访问。而git clone便可以通过网址下载仓库的代码,支持的协议有:http/https,ssh,git,file,ftp/ftps,rsync。
  由于下载的内容在本地会用文件夹存储,目录名默认与远程仓库的一致。若想修改,可以在git clone的命令最后添加目录名作为参数。
  当代码下载完毕后,Git会给网址取个别名方便用户使用,专业的称呼为主机名,默认是origin,可通过git remote查看。若想知道远程仓库的网址,后加-v即可。若想修改主机名,在git clone时,在网址前添加-o <主机名>,或者git remote rename <原主机名> <新主机名>便可改变。
  默认分支是master,但开发通常是基于develop或feature分支,具体在之后的Gitflow工作流中会详细讲解。这时得切换分支,那如何知道有哪些分支呢?git branch可以查看分支,后加-r只显示远程分支,而-a显示本地和远程的分支。更强大的是git remote show <主机名>,不仅显示远程分支,还显示网址、HEAD以及本地分支与远程分支的映射关系。

2.2.更新到本地

Git不会主动从远程仓库上更新代码,当觉得远端有新的内容时,可通过git fetch取回本地。但是,存放在<主机名>/<分支名>下,对于开发的分支没有影响,所以不改变工作区文件。

3.同步工作区


上一篇中提到过工作区的文件由本地分支和版本来决定。为了改变工作区从而改变IDE或Explorer中看到的内容,需要将正在使用的本地分支与映射的远程分支(已更新)进行合并,而且合并的过程中可能会出现冲突,这些都需要解决。

3.1.merge

git merge是比较常用的合并命令,默认使用Fast-forward方式,即当不存在冲突时,将两个分支的提交(commit)按时间先后排序并依次合并,同时删除合并分支的提交信息。当用git log --graphgitk查看记录时,不会感觉有合并的操作,除了所有的指针都跑到一起(HEAD、<所在分支指针>、<合并指针>),如下图右半部分(忽略了指针)。在团队合作时,这样不能直观地看出人员的操作,通常用git merge --no-ff命令代替,禁用Fast-forward方式,保留所有的操作信息,如下图左半部分。

merge.png

3.2.rebase

git rebase的目的也是为了合并,不过原理不同。它是将所在分支的所有提交转为补丁(patch)移到.git/rebase目录下暂存,再将指针指向合并分支的末尾,并应用那些补丁。当用git log --graphgitk查看记录时,也不会感觉有合并的操作。

rebase.png

3.3.conflict

若是仅仅看上面的内容,似乎差异体现在合并后提交信息的展示顺序上。其实当发现冲突(conflict)时,处理的方式上会有明显的不同。首先解释一下什么是冲突?当合并时发现不同的分支修改了相同的位置,Git不知道谁是正确的,所以需用户自己选择,解决冲突。

  • merge会执行完合并操作,在工作区文件中用<<<<<<<=======>>>>>>>标记出冲突的地方。开发人员解决后,再执行一次提交变化的操作,表示修改错误即可。这次提交将出现在提交记录中,并成为最新的版本。
  • rebase则是出现冲突就暂停操作,等开发人员解决了,通过命令git add添加变化和git rebase --continue继续操作,任何时候都可以git rebase --abort来终止操作,回到rebase前的状态。好处是,记录不会多出解决冲突的提交;坏处是,冲突多时得重复处理。
  • git fetchgit merge可以用git pull代替,而git fetchgit rebase可以用git pull --rebase代替。

4.推送到远端


代码同步好了,自然就应该开始工作了。可是团队合作时如何让其他人接收到你的更新呢?首先,须将远程仓库作为中转站,更新的代码都推送上去,别人主动从远程仓库下载更新。

4.1.正常推送

假设不会在远程仓库那冲突的话,只需要按照git push <主机名> <本地分支名>:<远程分支名>输入命令即可。由于本地分支默认映射的是固定主机的固定远程分支,即origin上的同名分支,所以简写git push
  需注意的是,若写了本地分支而与之映射的分支在远端没有,则会在远端新建同名分支;若省略本地分支而写了远程分支,则会删除此远程分支。当想改变分支的映射关系,只需某次推送时,在主机名前加-u就可以设置此主机为默认主机。

4.2.推送前更新

若别人在你之前推送了代码,且包含你修改的文件,那么在推送时就会冲突。为了避免这种情况的发生,规范的做法是先更新本地需提交的分支,合并有差异的地方(参照同步工作区),再进行推送。当然,若你觉得远程仓库上代码是可以忽略掉的,在主机名前加--force即可覆盖远程仓库上的同名文件。

5.总结


到此已经可以使用Git完成一个操作流程,比如向GitHub上提交自己的开源项目。但是这些仍然不足以让你在较大规模的公司中游刃有余,还需要懂得如何合理地利用分支、标签实现功能的并行开发,如何通过Gerrit结合Git实现CodeReview等。

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

推荐阅读更多精彩内容