1.git stash梳理

1.1git stash的克隆与同步

首先整理下git stash的逻辑是这样

在本地做出了新的修改,提交时显示当前的版本不是最新版本,这时就需要先pull一下自己代码仓库的最新版本的develop。

在git stash的setting中如果设置了自动同步,那自己的代码仓库与总库的代码仓库则会随时同步,这时pull自己的develop就已经会得到最新版本了

1.2服务器版本更新时的做法

在拉下来之后可以选择是使用git rebase达到快进还是直接使用git merge

如果你不是在董铂然博客园看到本文,请点击查看原文

官(li)方(yu)说这里不能直接使用merge,最好先使用rebase,因为如果直接使用merge会将自己新增的功能与最新的版本合并成一个新的版本。而使用rebase是先把最新的版本拉下来,并把自己新增功能的改动编辑在最新的版本里,这样再次提交时,我们新增的改动就是一个独立的版本而不是与某个版本合并所产生的版本。

1.3对比日志图得出结论

看日志图的话效果更加直观

近期代码由我们维护的可以看到日志图如下

每一个版本各自独立,结构清晰

而往期工程师在维护时使用merge,则造成了较为模糊难以理解的日志如下

在往前看以前的MOMA项目日志更加混乱

所以往后的做法都是使用rebase进而达到fast-forward的效果的做法。

2.git squash技术

在使用git作为源代码管理器时,需要时不时将自己所作出的改变commit,以便查询。工作中是建议稍微做一些小的改动就commit的,因为提交的越细看着越清楚。但是当在将自己的代码仓库改过许多细节提交到服务器建立一个pull request时,有时需要将琐碎的多个commit结合起来形成这一个需求的完整commit。这时就需要使用git squash来整理压缩message。

当我修改了四个文件并且每一个步骤都是分开提交的,我的项目git log显示如下:

如果将每一个commit都建立pr并提交到主代码仓库,主库的修改版本会非常多,为今后的维护也加大了难度。如果使用git squash技术可以将多个log集结到一起。 关于具体的代码操作可见下面完整PR操作步骤的2-7步。

3.完整PR操作步骤(12步)

1.git remote -v 先查看下起源避免出错

2.git checkout ChangeBadCode 先切换到自己的项目分支

3.git log 查看下日志,并判断需要将多少个日志合并

4.git rebase -i HEAD~6 把顶部的六个版本聚到一起进入编辑页面

5.把需要压缩的日志前面的pick都改为s(squash的缩写)

这里要注意必须保留一个pick,如果将所有的pick都改为了s那就没有合并的载体了就会报如下错误

这时就只能使用 git rebase --continue 继续编辑或git rebase --abort 取消此次操作来解决问题才能进入下一步。

6.(前面的操作无误的话)输入:wq保存并退出这时出现修改message页面

7.使用vim指令把每个message之间的空格行给删除,并输入:wq

最终达到的效果是这样

8. 想获取develop的最新版本必须先切换到develop  --------git checkout develop

9. git pull origin develop  获取最新的develop版本

10. 需要先切换到自己的分支,才能对develop进行rebase -----git checkout NewFix

11. git rebase develop  把自己新开发的功能快进最新版本

12. 这时候需要先切换到主干才能把自己的分支合并  ------git checkout develop

13. git merge NewFix  这时候才能合并

14. git push origin develop  推到自己的起源代码仓库

15. 在网页上创建pull request向管理员提交变更

附加几个常用指令(后续继续增加):

git branch    查看分支

git reflog      查看这个项目的修改记录

git log --graph --oneline  显示前六位log码和对应的message

git checkout -b NewFix  在主分支上建立一个新的分支。

git cherry-pick ChangeBadCode 在新的分支上复制旧分支的改变

git branch -d ChangeBadCode 删除一个分支。 -D是强制删除

git add .  把改动全部加上。 (可以先用git status显示出不同的diff)然后add 单个文件

git commit --amend  给刚提交的commit订一下,但是不生成log

git stash提交PR的正确步骤&git squash技术的更多相关文章

  1. git stash命令及提交指定文件

    一.git stash命令 常用git stash命令: (1)git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stas ...

  2. Git 分支管理-git stash 和git stash pop

    https://blog.csdn.net/u010697394/article/details/56484492 合并分支,冲突是难免的,在实际协作开发中我们遇到的情况错综复杂,今天就讲两个比较重要 ...

  3. git stash 用法总结和注意点

    常用git stash命令: (1)git stash save "save message"  : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不 ...

  4. git stash回退

    目录 1.起因 2. 问题出现 3.修复 4. 注意 1.起因 这个问题要从今天刚遇到的事儿说起,昨晚代码出了个乌龙事件,本来正在dev分支进行新功能的开发,但是测试出现的问题是在release 分支 ...

  5. git stash -u 添加新文件

    git 提交 有新文件执行    git stash -u ------ 如果已经执行git stash,会发现有UNtracked这个单词 说明新文件没有添加进去,此时 执行  git stash ...

  6. git stash的使用

    https://git-scm.com/docs/git-stash 在git svn的时候使用,提交记录的时候,有部分文件的修改不需要commit. 在向svn进行git svn dcommit的时 ...

  7. git stash解决代码merge出错

    最近在使用git提交代码时,遇到一个问题,就是我修改了几个文件的代码,然后又想把自己代码库里面的代码更新到最新版本,然后不出所料,代码冲突了!作为一个喜欢解决问题的程序员,怎么会被这样的问题所困住呢? ...

  8. git 命令提交项目到github

    git 命令提交项目到github步骤如下: 1.使用git 命令客户端进入项目根路径,输入 git init  命令,创建github本地根目录 2.把文件加入到本地项目 git add .  ,如 ...

  9. (转)git stash使用

    使用情形 综合下网上的介绍和资料,git stash(git储藏)可用于以下情形: 发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交.这时就可以考虑git s ...

随机推荐

  1. matlab 读取excel

    clear;clc; tic;%启动计时器,计算程序运行时间 a=xlsread('C:\Documents and Settings\Administrator\桌面\data.xls');b=a( ...

  2. jQuery选择器(一)

    晚上闲着没事,正好用来整理下jQuery的选择器,毕竟没有总结就不算学习嘛. 首先,对事件处理.遍历DOM和Ajax操作,都依赖于选择器. 1.CSS选择器 要使用某个HTML元素,就先要找到它,而c ...

  3. UWP开发入门(二十三)——WebView

    本篇讨论在UWP开发中使用WebView控件时常见的问题,以及一些小技巧. WebView是实际开发中常用的控件,很多大家抱怨的套网页的应用都是通过WebView来实现的.这里要澄清一个问题,套网页的 ...

  4. 一行代码实现js数组去重

    console.log([...new Set([1,2,3,4,2,1,2,2,2,167,4,3,32,2,1])])

  5. html5掷骰子的小demo

    代码如下: <!DOCTYPE> <html> <title>柯乐义</title> <head> <script> var l ...

  6. PHP循环语句基础介绍

    PHP 中的循环语句用于执行相同的代码块指定的次数. 循环 在您编写代码时,您经常需要让相同的代码块运行很多次.您可以在代码中使用循环语句来完成这个任务. 在 PHP 中,我们可以使用下列循环语句: ...

  7. 【UWP】使用Action代替Command

    在Xaml中,说到绑定,我们用的最多的应该就是ICommand了,通过Command实现ViewModel到View之间的命令处理,例如Button默认就提供了Command支持,如下 Xaml: & ...

  8. iOS 阶段学习第25天笔记(iOS沙盒机制介绍)

    iOS学习(OC语言)知识点整理 一.iOS沙盒机制介绍 1)概念: 每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒 ...

  9. MySQL中select * for update锁表的范围

    MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...

  10. jsp错误路径跳转设置

    <error-page><error-code>400</error-code><location>/king.html</location> ...