为什么我将“远程分支”的起源/发展融入到“发展”?

我是我组织中唯一一个提交以下消息的人:

将远程追踪分支的“起源/开发”合并为开发

不知道我在做什么来造成他们,但我想停下来。

我发出了什么命令来创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/foo ref。

  • 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 --onto mergeresetpush -f可能比简单的rebase更合适。
  • 当前不可能将--preserve-merges传递给rebase操作,因此特征分支的任何有意合并将被线性化,重放(并因此复制)所有的function分支提交。

修复由git pull创build的现有合并提交

如果你还没有推送由git pull创build的合并提交,你可以重新合并提交。 假设你没有做任何有意的合并(例如,把一个已经推入的特性分支合并到你当前的分支中),下面应该这样做:

 git rebase @{u} 

上面的命令告诉Git从HEAD (当前提交)中select所有可到达的非合并提交,减去所有可从@{u}到达的提交(这是“上游分支”的简写,即origin/master if HEADmaster ),在上游分支顶部重播(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而不是合并”部分:

http://mislav.uniqpath.com/2010/07/git-tips/