2

在 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

我怎样才能做到这一点?

4

2 回答 2

1

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

  1. 在本地创建,checkout 一个分支remote_n,并将所有数据从远程的 master拉到 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
    

注意:您将获得本地分支作为您的reporemote_n的新主分支。

如果您确实需要避免合并,请手动执行以下操作:

  1. 获取CommonC提交的差异:

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

    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
    

注意:此模型不考虑无法显示的二进制git diff文件。

于 2014-01-24T09:51:22.480 回答
1

做一个

git pull --rebase

这相当于git fetchand agit rebase而不是 a git merge

于 2014-01-24T13:49:30.283 回答