如何在推送到远程时避免Git pull的合并提交

jaz*_*199 23 git merge pull

我有一个存储库和一些本地更改提交.在提交之前,我使用Eclipse中的Egit将更改提取到我的本地.

它创建了一个合并提交,我提交了它的提交.

现在,当我试图推送到原点时,它表明它将推送我的提交以及合并提交.但理想情况下,合并提交不应该是远程存储库的一部分.

怎么避免这个?

小智 39

从远程存储库中提取时,请使用rebase选项.请按照以下步骤操作,

  1. 提交您的更改 - 它将在您的本地创建一个新提交.
  2. 现在做git pull --rebase <remote-name> <branch-name>.
  3. 基本上,rebase会将您在当前分支HEAD上提交的提交作为补丁.然后它将在HEAD顶部应用所有远程提交,然后在其上应用您的提交.
  4. 因此,最佳做法是提交更改,然后使用rebase选项提取远程提交.

  • 不过要小心,因为您的提交将不再按时间顺序排列。您已经有效地重写了历史记录,除非您有很好的测试覆盖率,否则这可能会导致许多令人讨厌的错误。使用合并更安全。 (4认同)

Fel*_*peC 14

如果您不想合并提交,将本地分支同步到远程分支的最佳方法是执行变基。建议您先执行 a git fetch,然后执行git rebase,但是,正如其他人提到的,您可以同时执行这两项操作:

git pull --rebase --autostash
Run Code Online (Sandbox Code Playgroud)

如果您总是这样做,您可以配置git pull为自动执行此操作:

git config --global pull.rebase true
git config --global rebase.autostash true
Run Code Online (Sandbox Code Playgroud)


Cod*_*Kid 11

你可以跑

git config --global branch.autosetuprebase always
Run Code Online (Sandbox Code Playgroud)

使 gitpull --rebase成为 git pull 的默认行为。


Gay*_*tti 7

如果您有未提交的更改,则可以执行此操作,

git stash
git pull --rebase <remote> <branch>
git stash pop
Run Code Online (Sandbox Code Playgroud)

  • 或者更好:`git pull --rebase --autostash`。 (3认同)
  • @vineeshvs 如果您从正在处理的同一分支中提取更改,那么您可以只使用“git pull --rebase”。否则,您必须明确提及远程名称和分支名称。 (2认同)

cho*_*oba 6

通常的策略是在分支机构工作。当远程主服务器发生更改时,将更改拉取到主服务器,而不是合并,而是分支进行变基。

请参阅Atlassian 的Git Rebase 。


Jam*_*ond 5

设想:

假设 a 是在 GIT repo 中提出的 PR: from feature/my_bug_fixinto release/project-007但由于上述分支之间的冲突, GIT 不允许合并。

然后执行以下操作:

$ git checkout feature/my_bug_fix

$ git pull --rebase origin release/project-007

$ # resolve any conflicts encountered during the process

$ git rebase --continue

$ git push origin feature/my_bug_fix  --force
Run Code Online (Sandbox Code Playgroud)

这是解决分支冲突的有效且干净的方法。此外,通过使用--rebase将不会获得合并提交,否则如果您使用 git merge 则会出现合并提交。

而且:

pull          = fetch + merge

pull --rebase = fetch + rebase
Run Code Online (Sandbox Code Playgroud)

因此,选择处理分支的方式。

您现在应该更好地理解合并和变基之间的区别:)