【问题标题】:How to avoid merge commits from Git pull when pushing to remote推送到远程时如何避免来自 Git pull 的合并提交
【发布时间】:2015-07-15 03:15:38
【问题描述】:

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

它创建一个合并提交,然后我提交我的提交。

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

如何避免这种情况?

【问题讨论】:

标签: git merge pull


【解决方案1】:

每当您从远程存储库中拉取时,请使用 rebase 选项。请按照以下步骤操作,

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

【讨论】:

  • 请小心,因为您的提交将不再按时间顺序排列。你已经有效地重写了历史,除非你有很好的测试覆盖率,否则这可能会导致很多讨厌的错误。使用合并更安全。
【解决方案2】:

当您有未提交的更改时,您可以这样做,

git stash
git pull --rebase <remote> <branch>
git stash apply

【讨论】:

  • 第二个命令能不能换成git pull --rebase(指this link。会有什么区别?
  • @vineeshvs 如果您要从您正在处理的同一分支中提取更改,那么您只需 git pull --rebase。否则,您必须明确提及远程名称和分支名称。
  • 或者更好:git pull --rebase --autostash
  • @FelipeC 你的评论应该是一个答案,这样任何人都可以很容易地看到它,太棒了,谢谢,
  • @ThinhNV 完成。如果您总是想这样做,我已经添加了答案和配置。
【解决方案3】:

你可以跑

git config --global branch.autosetuprebase always

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

【讨论】:

    【解决方案4】:

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

    git pull --rebase --autostash
    

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

    git config --global pull.rebase true
    git config --global rebase.autostash true
    

    【讨论】:

      【解决方案5】:

      通常的策略是在分支上工作。当远程 master 更改时,将更改拉到 master 上,而不是合并,rebase 分支。

      请参阅 Atlassian 的 Git Rebase

      【讨论】:

        【解决方案6】:

        场景:

        假设 a 是在 GIT 存储库中提出的 PR:从 feature/my_bug_fixrelease/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
        

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

        此外:

        pull          = fetch + merge
        
        pull --rebase = fetch + rebase
        

        所以,选择处理分支的方式。

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

        【讨论】:

          猜你喜欢
          • 2018-11-02
          • 2012-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-05
          • 2013-04-08
          • 2021-04-20
          • 2015-06-07
          相关资源
          最近更新 更多