为什么我将“远程分支”的起源/发展融入到“发展”?
我是我组织中唯一一个提交以下消息的人:
将远程追踪分支的“起源/开发”合并为开发
不知道我在做什么来造成他们,但我想停下来。
我发出了什么命令来创build这个提交,我应该使用什么命令来产生它?
 谢谢, 
  〜Ĵ 
 git pull可能是创build提交。 如果你做了一个本地提交,然后在其他人将一个提交到存储库之后运行git pull ,那么Git会下载其他开发者的提交,然后将它合并到你的本地分支。 
如何在将来避免这些合并提交
 你可以使用git pull --rebase来防止这种情况在将来发生,但是rebasing有其危险, 我build议完全避免pull 。 
相反,我鼓励你遵循这种使用模式:
 # download the latest commits git remote update -p # update the local branch git merge --ff-only @{u} # if the above fails with a complaint that the local branch has # diverged: git rebase -p @{u} 
说明
- 
git remote update -p下载远程仓库中的所有提交,并更新远程跟踪分支(例如,origin/master)。 它不会触及你的工作目录,索引或本地分支。-p参数修剪已删除的上游分支。 因此,如果foo分支在origin存储库中被删除,git remote update -p会自动删除你的origin/fooref。
- 
git merge --ff-only @{u}告诉Git将上游分支(@{u}参数)合并到你的本地分支,但是只有当你的本地分支可以“快速转发”到上游分支(换句话说,如果没有分歧)。
- 
git rebase -p @{u}有效地移动了你所做的提交,但还没有推到上游分支之上,这就消除了创build你试图避免的愚蠢的合并提交的需要。 这提高了开发历史的线性度,使其更容易查看。-p选项告诉Git保留合并。 这可以防止Git线性化提交的提交。 例如,如果您将某个function分支合并到master,这一点非常重要。 没有-p,function分支上的每个提交都会在master上复制,作为git rebase完成的线性化的一部分。 这会让开发历史难以审查,并不容易。当心 : git rebase可能不会达到您期望的效果,因此请在推送之前查看结果。 例如:git log --graph --oneline --decorate --date-order --color --boundary @{u}..
 我比较喜欢git pull --rebase这个方法,原因如下: 
- 它允许您在修改历史logging之前查看传入的上游提交 。
-  它允许你将-p(–--preserve-merges)选项传递给git rebase,以防需要重新绑定一个有意的合并(例如,将已经推送的特性分支合并到master)。
 速记: git up而不是git pull 
 为了方便上述操作,我build议创build一个名为up的别名: 
 git config --global alias.up '!git remote update -p; git merge --ff-only @{u}' 
现在,只需要将分支更新为现在就可以运行:
 git up 
 而不是git pull 。 如果因为你的本地分支已经偏离了上游分支而出现错误,那么这是你的基础。 
 为什么不git pull --rebase ? 
 运行git pull --rebase相当于运行git fetch然后是git rebase 。 这试图快速转发到新的上游提交,但如果这是不可能的,那么它会将您的本地提交重新绑定到新的上游提交。 这通常是可以的,但要小心: 
- Rebase是一个高级话题,你应该了解rebasing之前的含义。
-   git pull --rebase并没有给你一个机会来审查提交之前,他们。 根据上游的变化,很可能rebase是错误的操作 –rebase --ontomerge,reset或push -f可能比简单的rebase更合适。
-  当前不可能将--preserve-merges传递给rebase操作,因此特征分支的任何有意合并将被线性化,重放(并因此复制)所有的function分支提交。
 修复由git pull创build的现有合并提交 
 如果你还没有推送由git pull创build的合并提交,你可以重新合并提交。 假设你没有做任何有意的合并(例如,把一个已经推入的特性分支合并到你当前的分支中),下面应该这样做: 
 git rebase @{u} 
 上面的命令告诉Git从HEAD (当前提交)中select所有可到达的非合并提交,减去所有可从@{u}到达的提交(这是“上游分支”的简写,即origin/master if HEAD是master ),在上游分支顶部重播(cherry-pick)它们,然后移动当前分支引用以指向重放提交的结果。 这有效地将非合并提交移动到最近的上游提交,这消除了由git pull创build的合并。 
 如果你有一个有意的合并提交,你不想运行git rebase @{u}因为它会重播其他分支的所有内容。 处理这种情况要复杂得多,这就是为什么使用git up并避免git pull的好处。 你可能不得不使用reset来撤消由pull创build的合并,然后做git rebase -p @{u} 。  git rebase的-p参数对于我来说并不可靠,所以你最终可能不得不使用reset来撤消有意的合并,把你的本地分支更新到@{u} ,然后重做有意合并(这是一个痛苦,如果有很多毛的合并冲突)。 
 git fetch git rebase origin/master 
这应该做到这一点。 或者如果你想继续使用拉
 git pull --rebase 
您也可以在您的configuration中设置该分支自动重新绑定,或者自动设置为您创build的任何其他跟踪分支。 那么你可以回去使用
 git pull 
更多关于这个在这个页面的“拉和rebase而不是合并”部分: