带你理解-Git-中的-Merge-和-Rebase

概念Rebase 和 merge 都被设计用来将变更从一个分支整合到另一个分支,但是它们的实现方式却不同。 下面假如我们有如下提交,merge 会将两个分支的代码合并,而 rebase 会将 feature 分支上所有的变更在 master 分支上重新应用一遍: 当你将 feature 分支 rebase 到 master 时,实际上是将 feature 的 base 移动到了 master 分支的终点,所以 rebase 中文叫变基。(想象上图平移了两条线段)merge 则是拿 feature 分支中的结果,合并到 master 分支,这个过程中只有 master 分支改变了,feature 分支保持不变merge 的时候会产生一个新的 commitMerge 的优与劣优点简单易用,易于理解保留原始提交记录和源分支源分支上的提交与其他分支分离,这会方便你浏览并且合并到其他分支保留你的提交历史,保证提交历史在语义上的准确性缺点提交历史 可能会变得很乱,尤其是很多人同时开发与合并分支时使用 git bisect 调试将变得困难Rebase 的优与劣优点代码历史简洁,线性,可读性强相比众多功能分支来说,只有一个分支,管理起来更加方便简洁的 提交记录 让调试和排查更容易缺点feature 分支变成了一些 commit,不利于体现开发时的场景Rebase 不适合与 pull requests 同时工作,因为你看不出来哪里是别人做的变更。重写了历史记录也不利于团队协作 你在使用 rebase 时也应该更加小心在处理 冲突 时需要花费更多的精力,使用 rebase 来合并功能分支,同一个冲突可能需要合并多次。总结如果有几个开发者同时在 feature 分支上开发,就不推荐使用 rebase,因为 rebase 会掩盖真实的提交场景。相对而言,个人开发更适合使用 rebase。如果你想保留完整的历史记录,就应该使用 merge。记住,Merge 保留历史记录,而 Rebase 改写历史记录Rebase 可以用来精简一个复杂的历史记录,通过交互式 rebase,你可以去掉不想要的 commit,合并多个 commit 甚至修改 commit 信息。 ...

August 7, 2019 · 1 min · jiezi

如何使用Git-Rebase

我们在日常开发中使用 Git 做分支合并的时候有两种方式:merge 和 rebase。merge 是最常用的,rebase 使用的没有 merge 这么多,那么 rebase 和 merge 有什么区别呢?什么时候使用 rebase?使用 rebase 的时候有什么注意事项呢?接下来我来介绍下这三个问题。 基础首先我们先了解下 merge 和 rebase 的运行机制有什么不同。假设我们有两个分支(master 和 feature)。feature 是基于 master 的 C1 节点建立的分支,然后开发人员分别在两个分支各自开发: merge现在我们想要把 feature 分支开发的内容合并到 master,使用 merge 命令: $ git checkout master$ git merge feature Git 会把 C2 和 C3 的内容合并一下产生一个新的修改 C4,把 C4 提交到 master 分支。那么 master 就有了所有最新的代码(红色是 master 分支线,蓝色是 feature 分支线)。 rebase我们回到还是未合并之前的状态,看看使用 rebase 合并会有什么效果。使用 rebase 有两种用法,先看第一种: $ git checkout master$ git rebase feature ...

June 12, 2019 · 2 min · jiezi

git-merge-squash-git-rebase-i-git-cherrypick

git merge --squashgit merge --squash {srcBranch} 常用于将feat分支合并至dev时压缩繁杂的提交日志,让合并变得清晰明了。 将 srcBranch上的超前于当前分支的 commits 合并至当前分支,且当前分支不进行commit,合并或解决冲突成功后,允许我们手动做一次 commit log,这样srcBranch的多个 commits 合并至当前分支时只产生一个commit 了。 git checkout devecho 1111 >> foo.txtgit add foo.txtgit commit -m "foo.txt 1111"git checkout -b feat_1echo 2222 >> foo.txt && git commit -am "foo.txt 2222"echo 3333 >> foo.txt && git commit -am "foo.txt 3333"echo 4444 >> foo.txt && git commit -am "foo.txt 4444"git loggit checkout dev# 如果我们直接 git merge feat_1 的话 那 feat_1 的所有提交都会记录至 dev# 但我们想简洁的表征一下git merge --squash feat_1# 手动编写 log 提交git commit -m 'foo.txt 2222foo.txt 3333foo.txt 4444'# 或者使 diff logs 为模板提交git commit -v# 进入 vim 模式 编辑合并的 log:wq# 可以看到 feat_1 的 3 log 合并到 dev 上后只有 1 loggit log--squash 的作用为只合并源分支的内容到当前分支的stage区,将commit交由我们来决定,这样便可以整合其他分支的提交日志。 ...

May 28, 2019 · 4 min · jiezi