如何使用本地和远程Git存储库之间的差异创建单个提交?

时间:2014-01-24 09:41:08

标签: git push commit squash

在Git中,假设我一直在当地分公司工作:

  Common ancestor      
        /\
       A  \
      /    X
     B      \
    /        Y
   C       remote
 local

我做了本地提交A,B和C,同时远程分支继续提交X和Y.所以我做了拉动并得到:

  Common ancestor      
        /\
       A  \
      /    X
     B      \
    /        Y
   C        /remote
    \      /
     \    /
      \  /
       \/
       M
     local

如果我现在推,远程历史记录将包括我的所有A,B,C和M提交......但这不是我想要的。

我想只使用与本地分支的差异来推送单个提交,因此远程分支将看起来像这样,没有任何合并的复杂性:

  Common ancestor      
         \
          \
           X
            \
             Y
              \
               N
             remote

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

只需将本地更改合并到删除项中即可获得 N 提交:

  1. 在本地创建,删除分支 remote_n ,并将远程主服务器中的所有数据提取到 remote_n 分支中:

    git branch remote_n
    git checkout remote_n
    git pull origin master
    
  2. 将master的HEAD合并到 remote_n ,修复不一致,并提交更改,这样您就可以获得单个 N 提交(通过使用--squash选项):

    git merge --squash master
    vim ...
    git add .
    git commit
    
  3. 将结果 N 提交到远程主分支:

    git push remote master
    
  4. 注意:您将获得本地 remote_n 分支作为您的回购的新分支。

    如果你真的需要避免合并,请手动执行以下操作:

    1. 获取 Common C 提交的差异:

      git diff Common_sha C_sha > common_c.diff
      
    2. 将树重置为 Common 提交,拉远程更改,应用差异并提交它:

      git reset --hard Common_sha
      git pull remote master
      git apply --ignore-space-change common_c.diff
      git commit
      
    3. 将结果 N 提交到远程主分支:

      git push remote master
      
    4. 注意:此模型未考虑git diff无法显示的二进制文件。

答案 1 :(得分:1)

做一个

git pull --rebase

相当于git fetchgit rebase而不是git merge