Jor*_*ein 117 git git-merge git-remote branching-and-merging
我是组织中唯一一个使用以下消息进行提交的人:
将远程跟踪分支'origin/develop'合并到develop中
不知道我在做什么导致他们,但我想停下来.
我发出什么命令来创建这个提交,我应该用什么命令来生成它?
Ric*_*sen 190
git pull
可能正在创建提交.如果您进行本地提交然后git pull
在其他人将提交推送到存储库之后运行,则Git会下载其他开发人员的提交,然后将其合并到您的本地分支中.
您可以使用git pull --rebase
以防止将来发生这种情况,但是变基有其危险,我建议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}
Run Code Online (Sandbox Code Playgroud)
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}
有效地移动你已经提交但尚未推送到上游分支的提交,这消除了创建你试图避免的愚蠢的合并提交的需要.这改善了开发历史的线性,使其更容易查看.
该-p
选项告诉Git保留合并.这可以防止Git线性化被重新提交的提交.例如,如果将要素分支合并到中,则这很重要master
.如果没有-p
,则功能分支上的每个提交都将master
作为线性化的一部分进行复制git rebase
.这将使开发历史更难以审查,而不是更容易.
注意: git rebase
可能不会按照您的预期执行操作,因此请在推送之前查看结果.例如:
git log --graph --oneline --decorate --date-order --color --boundary @{u}..
Run Code Online (Sandbox Code Playgroud)我更喜欢这种方法,git pull --rebase
原因如下:
-p
(--preserve-merges
)选项git rebase
,以防您需要重新定义有意合并(例如,将已推送的功能分支合并到其中master
).git up
代替git pull
为了方便上述操作,我建议创建一个名为的别名up
:
git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'
Run Code Online (Sandbox Code Playgroud)
现在,您需要做的就是让您的分支更新是运行:
git up
Run Code Online (Sandbox Code Playgroud)
而不是git pull
.如果由于本地分支与上游分支不同而出现错误,那就是您对rebase的提示.
git pull --rebase
呢?运行git pull --rebase
等同于运行git fetch
后跟git rebase
.这会尝试快进到新的上游提交,但如果这不可能,那么它会将您的本地提交重新绑定到新的上游提交.这通常没问题,但要小心:
git pull --rebase
在合并之前,您没有机会检查提交.根据什么改变上游,它很可能是重订是错误的操作,一rebase --onto
,merge
,reset
,或者push -f
可能比普通的更合适rebase
.--preserve-merges
给rebase操作,因此任何有意合并的功能分支都将被线性化,重放(并因此复制)所有功能分支提交.git pull
如果尚未推送创建的合并提交git pull
,则可以重新定义合并提交.假设您没有进行任何有意合并(例如,将已推送的功能分支合并到当前分支中),则应执行以下操作:
git rebase @{u}
Run Code Online (Sandbox Code Playgroud)
上面的命令告诉Git选择从HEAD
(当前提交)可到达的所有非合并提交,减去所有可到达的提交@{u}
(这是"上游分支"的简写,即origin/master
if HEAD
是master
),重放(cherry-pick) )它们位于上游分支的顶部,然后移动当前分支引用以指向重放提交的结果.这有效地将非合并提交移动到最近的上游提交,这消除了由其创建的合并git pull
.
如果你有一个有意的合并提交,你不想运行,git rebase @{u}
因为它将重放其他分支中的所有内容.处理这种情况要复杂得多,这就是为什么使用git up
和git pull
完全避免它的好处.您可能必须使用reset
撤消由之创建的合并pull
然后执行git rebase -p @{u}
.这个-p
参数git rebase
对我来说没有可靠的工作,所以你最终可能不得不用来reset
撤消故意合并,更新你的本地分支@{u}
,然后重做故意合并(如果有很多毛茸茸的合并,那就太痛苦了冲突).
Ada*_*ruk 17
git fetch
git rebase origin/master
Run Code Online (Sandbox Code Playgroud)
应该这样做.或者如果你想继续使用拉
git pull --rebase
Run Code Online (Sandbox Code Playgroud)
您还可以在配置中将该分支设置为自动重新绑定,或者为您创建的任何其他未来跟踪分支自动设置.然后你可以回去使用
git pull
Run Code Online (Sandbox Code Playgroud)
有关此内容的更多信息,请参阅本页的"使用rebase而不是merge"部分:
http://mislav.uniqpath.com/2010/07/git-tips/
归档时间: |
|
查看次数: |
63677 次 |
最近记录: |