不合并主分支,更新git分支

13

我是一个独立的开发者,正在进行一个相当大的项目。我在master分支上做了几个重要的更改,现在我要继续在feature分支上工作,但它已经落后了很多。 feature分支确实需要来自master的更改,但在feature准备发布之前,我不想将这些更改合并到master中。我认为这是一个很直接的rebase案例,但我不确定。下面是我的情况的一个非常简化版本(实际历史更长)。

* 0e109d5 - (HEAD, origin/master, origin/HEAD, master) latest commit
* 9188511 - major schema change
| * d3472a5 - (origin/feature, feature) feature branch commit
| * 6c36837 - Start of feature branch
|/  
*   80d93a8 - Base commit
  1. 我已经将 feature 推送到远程仓库以备份,这通常对于变基来说是不好的。但由于它没有与任何其他人共享,我是否可以简单地删除远程分支,并像从未存在过一样继续?我的 remote 仅用于离线存储和安全性(它是一个普通的 git 服务器,而不是 github)。
  2. 假设远程分支不再是问题,我能否将 master 变基到 feature 上,然后只继续在 feature 上工作,而不必将 master 快进到最后一个功能分支提交?
  3. 我认为我不需要挑选某些提交,因为 feature 基本上需要所有在 master 中的更改。
  4. 我认为我还可以从基础提交到HEAD创建一个补丁文件,然后尝试将其应用到 feature 上。

非常感谢您的建议。我喜欢 Git,但我没有经验进行变基。


  1. 你可以在本地将主分支合并到功能分支。
  2. 如果你想将你的功能保存到远程服务器,那么你可以在远程创建一个新的分支,并将你的本地功能保存到其中,不影响主分支。
  3. 查看此链接以获取建议:http://git-scm.com/book/en/Git-Branching-Rebasing
- Eric
3个回答

14

由于您的远程 feature 分支仅用于保管,并且尚未与任何其他人共享,因此安全删除该分支或强制推送到其上是完全安全的。您可以在 master 上对当前工作中的 feature 分支进行变基,并继续在其上工作:

# while staying at feature branch
git rebase master

根据主分支的更改,您可能需要在rebase过程中解决一些冲突。

要更新远程保管分支(除了您自己以外没有其他人看到过的分支):

git push -f origin feature

历史将如下所示:

* newsha1 - (feature, origin/feature) feature branch commit
* newsha2 - Start of feature branch
* 0e109d5 - (HEAD, origin/master, origin/HEAD, master) latest commit
* 9188511 - major schema change
* 80d93a8 - Base commit

实质上,提交历史呈线性增长,就好像您仅在引入master中的更改后才开始对feature进行工作。


我刚试了一下,它给了我我想要的东西。feature 包含了 master 中的所有更改,而 master 仍然很干净。非常感谢! - Andrew

10

我认为你想要的是将 feature 分支进行 rebase 操作到 master 分支上,只需要执行以下命令:

git rebase master feature

如果您当前在feature分支上,请执行以下操作:

git rebase master

针对您的问题:

  1. It deosn't matter since you are the sole developer. After the rebase, just push to your remote branch with -f or --force-with-lease. The latter one is more safe, but no difference here for sole developer.

    git push --force-with-lease origin feature
    
  2. Yes, you don't need to fast-forwarding master at the moment. You can do it after you finish work on feature. You can use --ff-only to allow only fast-forward merge to keep your history linear.

    git checkout master
    git merge --ff-only feature
    
  3. Yes, no cherry pick is needed here.

  4. No need to use patch. Patch is used to distribute your changes to others.

    PS. git is really friendly with patch. You can do it either way as follows.

    git diff > some.patch
    git apply some.patch
    

    Or

    git diff > some.patch
    patch -p1 < some.patch
    

    Or

    git diff --no-prefix > some.patch
    patch -p0 < some.patch
    

1
我觉得你只是想将主分支合并到你的特性分支中吗?
``` git checkout feature-branch git merge master ```
将尝试将主分支中的所有提交移动到你的特性分支中,以便你可以在那里处理冲突/合并问题,而不影响当前状态的主分支。

但是这样做不会把master也快进到feature的最后一次提交吗?我真的希望尽可能保持master的干净。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接