使用master更新git分支而不进行合并

And*_*rew 8 git git-rebase

我是一个从事一个相当大的项目的唯一开发人员.我做了几个重要的改变master,我即将恢复在一个feature落后于优惠的分支上工作.该feature分支确实需要从改变master,但我不希望将更改合并到master,直到工作feature准备好发布.我认为这是一个相当简单的变基,但我不确定.下面是我的情况的一个非常简化的版本(实际历史更长).

* 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
Run Code Online (Sandbox Code Playgroud)
  1. 我确实推动feature了遥控器的安全保护,这通常是改装的坏事.但由于它没有与其他任何人共享,我可以简单地删除远程分支并继续它从未存在过吗?我remote只是为了离线存储和安全(它是一个普通的git服务器,而不是github).
  2. 假设远程分支不再是一个问题,我能变基masterfeature,只是继续工作feature而不同时快速转发master到最后一个特性分支承诺?
  3. 我不认为我需要樱桃挑选,因为feature几乎需要所有的变化master.
  4. 我想我也可以制作一个补丁文件(从基础提交到HEAD尝试应用它)feature.

任何建议表示赞赏.我喜欢git,但我还没有经验.

YS-*_*S-L 10

由于您的远程feature分支仅仅是出于安全保护的目的而存在且未与其他任何人共享,因此删除分支或强制推送它肯定是安全的.您可以在分支衍合你目前的工作featuremaster,并继续工作:

# while staying at feature branch
git rebase master
Run Code Online (Sandbox Code Playgroud)

根据master中的更改,您可能必须在rebase期间解决一些冲突.

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

git push -f origin feature
Run Code Online (Sandbox Code Playgroud)

历史将如下:

* 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
Run Code Online (Sandbox Code Playgroud)

从本质上讲,提交历史会线性增长,就像feature您在引入更改后才开始工作一样master.


Lan*_*dys 6

我想你想要的这里是rebase featuremaster.做就是了:

git rebase master feature
Run Code Online (Sandbox Code Playgroud)

如果您目前在feature分公司,只需:

git rebase master
Run Code Online (Sandbox Code Playgroud)

对于你的问题:

  1. 它是无关紧要的,因为你是唯一的开发者.之后rebase,只需用-f或推送到您的远程分支--force-with-lease.后者更安全,但对于唯一的开发者来说没有区别.

    git push --force-with-lease origin feature
    
    Run Code Online (Sandbox Code Playgroud)
  2. 是的,您现在不需要快速转发主人.你可以在完成工作后完成feature.您可以使用--ff-only仅允许快进合并来保持历史线性.

    git checkout master
    git merge --ff-only feature
    
    Run Code Online (Sandbox Code Playgroud)
  3. 是的,cherry pick这里不需要.

  4. 无需使用补丁.Patch用于将您的更改分发给其他人.

    PS.git非常友好patch.您可以按照以下方式执行此操作.

    git diff > some.patch
    git apply some.patch
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    git diff > some.patch
    patch -p1 < some.patch
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    git diff --no-prefix > some.patch
    patch -p0 < some.patch
    
    Run Code Online (Sandbox Code Playgroud)