设为首页 收藏本站
查看: 868|回复: 0

[经验分享] git-rebase 跟上游分支同步

[复制链接]

尚未签到

发表于 2018-9-18 09:50:39 | 显示全部楼层 |阅读模式
  from: http://blog.microsuncn.com/?p=1989
  git-rebase命令主要用在从上游分支获取最新commit信息,并有机的将当前分支和上游分支进行合并。下面看个例子。我们假设主分支为master,在开发过程中生成一个新分支topic。master称为topic的上游分支。
  例子开始:
  [git-tester@microsuncn git-study]$ cd rebase
  [git-tester@microsuncn rebase]$ ls
  [git-tester@microsuncn rebase]$ vi roc.c
  [git-tester@microsuncn rebase]$ cat roc.c
  int main()
  {
  printf(“master:001″);
  return 0;
  }
  [git-tester@microsuncn rebase]$ git init
  Initialized empty Git repository in /git-tester/career/programming/git-study/rebase/.git/
  [git-tester@microsuncn rebase]$ git add .
  [git-tester@microsuncn rebase]$ git commit -m “master:001″
  Created initial commit 2d89602: master:001
  1 files changed, 5 insertions(+), 0 deletions(-)
  create mode 100644 roc.c
  [git-tester@microsuncn rebase]$ git log
  commit 2d89602d0c9955824df0d2c023e447f5d98d863a
  Author: git-tester
  Date:   Mon Nov 17 15:26:40 2008 +0800
  master:001
  [git-tester@microsuncn rebase]$
  到此,我们已经在master分支完成了一个commit。
  [git-tester@microsuncn rebase]$ vi roc.c
  [git-tester@microsuncn rebase]$ git commit -a -m “master:002″
  Created commit 41b3d1c: master:002
  1 files changed, 1 insertions(+), 0 deletions(-)
  [git-tester@microsuncn rebase]$ cat roc.c
  int main()
  {
  printf(“master:001″);
  printf(“master:002″);
  return 0;
  }
  [git-tester@microsuncn rebase]$ git log
  commit 41b3d1cfaae0184bb8e5f27a165d51cc23867413
  Author: git-tester
  Date:   Mon Nov 17 15:28:01 2008 +0800
  master:002
  commit 2d89602d0c9955824df0d2c023e447f5d98d863a
  Author: git-tester
  Date:   Mon Nov 17 15:26:40 2008 +0800
  master:001
  [git-tester@microsuncn rebase]$
  到此为止,我们已经在master分支完成了两次commit的提交。
  现在的分支结构是这样的:
  master:001 — master:002   (master)
  继续要做的事情就是建立一个新的分支topic。
  [git-tester@microsuncn rebase]$ git branch
  * master
  [git-tester@microsuncn rebase]$ git branch topic
  [git-tester@microsuncn rebase]$ git branch
  * master
  topic
  [git-tester@microsuncn rebase]$ git checkout topic
  Switched to branch “topic”
  [git-tester@microsuncn rebase]$ git branch
  master
  * topic
  [git-tester@microsuncn rebase]$
  已经成功建立了topic分支,并且已经转移到了topic分支。
  接下来,topic上面的开发情况如下:
  [git-tester@microsuncn rebase]$ vi roc.c
  [git-tester@microsuncn rebase]$ git commit -a -m “topic:001″
  Created commit d599b54: topic:001
  1 files changed, 1 insertions(+), 0 deletions(-)
  [git-tester@microsuncn rebase]$ vi roc.c
  [git-tester@microsuncn rebase]$ git commit -a -m “topic:002″
  Created commit 3f4b17f: topic:002
  1 files changed, 1 insertions(+), 0 deletions(-)
  [git-tester@microsuncn rebase]$ cat roc.c
  int main()
  {
  printf(“topic :002″);
  printf(“topic :001″);
  printf(“master:001″);
  printf(“master:002″);
  return 0;
  }
  [git-tester@microsuncn rebase]$ git log
  commit 3f4b17fe3b5d277771770c0515e75f04e783ad14
  Author: git-tester
  Date:   Mon Nov 17 15:49:24 2008 +0800
  topic:002
  commit d599b54336ad96b8e09ef92e371a09a25e6d0c11
  Author: git-tester
  Date:   Mon Nov 17 15:48:58 2008 +0800
  topic:001
  commit 41b3d1cfaae0184bb8e5f27a165d51cc23867413
  Author: git-tester
  Date:   Mon Nov 17 15:28:01 2008 +0800
  master:002
  commit 2d89602d0c9955824df0d2c023e447f5d98d863a
  Author: git-tester
  Date:   Mon Nov 17 15:26:40 2008 +0800
  master:001
  [git-tester@microsuncn rebase]$
  可知,自从建立并切换到topic分支后,topic又进行了两次commit提交,每次分别加入了一行代码。
  此时,分支结构应该是这样的:
  topic:001 — topic:002  (topic)
  /
  master:001 — master:002   (master)
  这个图已经很清晰了,可以看出分支的走向。
  接下来,master分支也有自己的进度,如下:
  [git-tester@microsuncn rebase]$ git checkout master
  Switched to branch “master”
  [git-tester@microsuncn rebase]$ git branch
  * master
  topic
  [git-tester@microsuncn rebase]$ vi roc.c
  [git-tester@microsuncn rebase]$ git commit -a -m “master:003″
  Created commit 91a7ffc: master:003
  1 files changed, 1 insertions(+), 0 deletions(-)
  [git-tester@microsuncn rebase]$ vi roc.c
  [git-tester@microsuncn rebase]$ git commit -a -m “master:004″
  Created commit b81fbc3: master:004
  1 files changed, 1 insertions(+), 0 deletions(-)
  [git-tester@microsuncn rebase]$ cat roc.c
  int main()
  {
  printf(“master:001″);
  printf(“master:002″);
  printf(“master:003″);
  printf(“master:004″);
  return 0;
  }
  [git-tester@microsuncn rebase]$ git log
  commit b81fbc3be5c7bd1fdef72820c29e2c67590f4b03
  Author: git-tester
  Date:   Mon Nov 17 15:55:23 2008 +0800
  master:004
  commit 91a7ffc73e6320a86b10849061efd672f47fd5bd
  Author: git-tester
  Date:   Mon Nov 17 15:55:06 2008 +0800
  master:003
  commit 41b3d1cfaae0184bb8e5f27a165d51cc23867413
  Author: git-tester
  Date:   Mon Nov 17 15:28:01 2008 +0800
  master:002
  commit 2d89602d0c9955824df0d2c023e447f5d98d863a
  Author: git-tester
  Date:   Mon Nov 17 15:26:40 2008 +0800
  master:001
  [git-tester@microsuncn rebase]$
  可以看到,master分支也完成了两次commit提交,每次分别添加了一行代码。
  到此时,分支结构为:
  topic:001 — topic:002  (topic)
  /
  master:001 — master:002 — master:003 — master:004  (master)
  到这个时候,实验样本已经基本搭建完毕,git-rebase就要派上用场了!
  假设topic和master是一个项目的两个分支,master当然是主分支,而topic是旁路分支。在软件开发的大部分情况中,旁路分支是要遵从主分支的。所以说,现在topic分支想将master分支开发的最新代码导入到topic分支中,而且要求此动作不影响master主分支的开发,也就是说要暗中完成。git-rebase上场了:
  [git-tester@microsuncn rebase]$ git checkout topic
  Switched to branch “topic”
  [git-tester@microsuncn rebase]$ git branch
  master
  * topic
  [git-tester@microsuncn rebase]$ git rebase master
  First, rewinding head to replay your work on top of it…
  Applying topic:001
  error: patch failed: roc.c:1
  error: roc.c: patch does not apply
  Using index info to reconstruct a base tree…
  Falling back to patching base and 3-way merge…
  Auto-merged roc.c
  Applying topic:002
  [git-tester@microsuncn rebase]$
  使用了git rebase master来完成需求。如果心细的话,你会看到它输出了一些error,意思是说“补丁失败”,这个error没有关系,不影响git-rebase的正常工作的。
  来看看git-rebase的细节:
  [git-tester@microsuncn rebase]$ git branch
  master
  * topic
  [git-tester@microsuncn rebase]$ git log
  commit 05de9849078541c86cf5182cd8c15fa22bd00f77
  Author: git-tester
  Date:   Mon Nov 17 15:49:24 2008 +0800
  topic:002
  commit 7e5a744ef9e0740b4a091e9c8baa859b14800b0b
  Author: git-tester
  Date:   Mon Nov 17 15:48:58 2008 +0800
  topic:001
  commit b81fbc3be5c7bd1fdef72820c29e2c67590f4b03
  Author: git-tester
  Date:   Mon Nov 17 15:55:23 2008 +0800
  master:004
  commit 91a7ffc73e6320a86b10849061efd672f47fd5bd
  Author: git-tester
  Date:   Mon Nov 17 15:55:06 2008 +0800
  master:003
  commit 41b3d1cfaae0184bb8e5f27a165d51cc23867413
  Author: git-tester
  Date:   Mon Nov 17 15:28:01 2008 +0800
  master:002
  commit 2d89602d0c9955824df0d2c023e447f5d98d863a
  Author: git-tester
  Date:   Mon Nov 17 15:26:40 2008 +0800
  master:001
  [git-tester@microsuncn rebase]$ cat roc.c
  int main()
  {
  printf(“topic :002″);
  printf(“topic :001″);
  printf(“master:001″);
  printf(“master:002″);
  printf(“master:003″);
  printf(“master:004″);
  return 0;
  }
  [git-tester@microsuncn rebase]$
  看到了吧!master分支刚才开发的master:003和master:004也已经悄悄的进入了topic分支的日志里了。而在roc.c文件中也已经有了相应的开发代码。
  看一下分支结构图:
                                                topic:001 --- topic:002  (topic)  
/
  
master:001 --- master:002 --- master:003 --- master:004  (master)
  

  对比一下。这是执行git-rebase之前的分支结构图:
  topic:001 — topic:002  (topic)
  /
  master:001 — master:002 — master:003 — master:004  (master)
  git-rebase还有很多其他用法,我们会在以后的章节中继续讲解。:) 今天这个例子非常重要,后续有关git-rebase的例子都会已此例子为基础。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-589698-1-1.html 上篇帖子: git fetch 从另一个repository中下载objects and refs 下篇帖子: git merge 合并分支
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表