变基和合并是将两个或多个开发历史组合在一起的两种不同方式。您选择的技术基本上归结为您希望分支在组合时的样子或您的偏好。 (当我说你时,可能包括在同一代码库上工作的其他人)。
要选择一个,最好的开始是文档,这里是 git merge 和 git rebase 的文档。
让我引用文档中的一些部分,这可能有助于阐明它们的行为方式:
GIT 合并
假设存在以下历史并且当前分支是“master”:
A---B---C topic
/
D---E---F---G master
然后“git merge topic”将重播主题分支上所做的更改,因为它从主分支(即E)分歧直到其当前提交(C)在主分支之上,并将结果记录在一个新的提交中两个父提交的名称和来自用户描述更改的日志消息。
A---B---C topic
/ \
D---E---F---G---H master
GIT REBASE
假设存在以下历史且当前分支为“topic”:
A---B---C topic
/
D---E---F---G master
从此时开始,以下任一命令的结果:
git rebase master
git rebase 主主题
应该是:
A'--B'--C' topic
/
D---E---F---G master
注意分支合并后的样子。 Git 合并会将多个提交序列组合成一个统一的历史记录,其中 git rebase 在另一个基础上重新应用更改。
现在,当您克隆存储库并提交更改时,您的本地分支与远程分支不同。当您准备好将新更改推送到远程分支时,远程分支可能包含与本地分支不同的历史记录。这就是为什么在将本地更改推送到远程之前,您需要更新本地分支以反映远程分支中所做的更改。为此,您可以使用git fetch 或git pull,具体取决于您要完成的任务。默认情况下,当您执行git pull 时,它将执行git fetch 后跟git merge。如果您查看文档,您会找到更改此默认行为的方法。就像我不能告诉你在书架上对书进行排序的唯一方法是按字母顺序排序一样,我也不能直接告诉你你的流程应该是什么。如果您尝试将分歧的 refs 推送到分支,您将面临冲突,您必须先解决冲突,然后才能继续操作。
我目前通常遵循的约定是git pull,然后是commits,当我准备好将更改合并到一个分支时,我会执行git rebase 和pull request,最后是@987654336接受时一起@分支。当你执行 git rebase 时,你会得到一个非常线性的历史记录。
以前当我想要两个分支合并时,我使用远程更新我的历史记录后在本地执行git merge,然后使用git push 更新远程分支。