为什么我要将"远程跟踪分支'起源/开发'合并到开发中"?

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参数梅干删除上游分支.因此,如果fooorigin存储库中删除分支,git remote update -p将自动删除您的origin/fooref.

  • 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.这会尝试快进到新的上游提交,但如果这不可能,那么它会将您的本地提交重新绑定到新的上游提交.这通常没问题,但要小心:

  • 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/masterif HEADmaster),重放(cherry-pick) )它们位于上游分支的顶部,然后移动当前分支引用以指向重放提交的结果.这有效地将非合并提交移动到最近的上游提交,这消除了由其创建的合并git pull.

如果你有一个有意的合并提交,你不想运行,git rebase @{u}因为它将重放其他分支中的所有内容.处理这种情况要复杂得多,这就是为什么使用git upgit pull完全避免它的好处.您可能必须使用reset撤消由之创建的合并pull然后执行git rebase -p @{u}.这个-p参数git rebase对我来说没有可靠的工作,所以你最终可能不得不用来reset撤消故意合并,更新你的本地分支@{u},然后重做故意合并(如果有很多毛茸茸的合并,那就太痛苦了冲突).

  • `git remote update -p`和`git fetch`的区别是什么? (3认同)
  • @eckes:`git remote update -p`与`git fetch --all -p`相同.当`fetch`没有`-p`选项时,我养成了使用`git remote update -p`的习惯. (3认同)
  • [git-rebase 文档](https://git-scm.com/docs/git-rebase) 说 `-p`/`--preserve-merges` 已弃用,您应该使用 `-r`/` --rebase-merges 现在。 (2认同)

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/