带你理解-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-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

commit-your-changes-or-stash-them-before-you-can-merge

今天用git pull来更新代码,遇到了下面的问题: error: Your local changes to the following files would be overwritten by merge: .gitignorePlease, commit your changes or stash them before you can merge.Aborting1. stash通常遇到这个问题,你可以直接commit你的修改; 但我这次不想这样。 看看git stash是如何做的。 git stashgit pullgit stash pop接下来diff一下此文件看看自动合并的情况,并作出相应修改。 git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。 git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。 git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。 git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。 2. 放弃本地修改,直接覆盖之git reset --hardgit pull

May 3, 2019 · 1 min · jiezi