为什么我将“远程分支”的起源/发展融入到“发展”?
我是我组织中唯一一个提交以下消息的人:
将远程追踪分支的“起源/开发”合并为开发
不知道我在做什么来造成他们,但我想停下来。
我发出了什么命令来创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
merge
,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而不是合并”部分: