【问题标题】:Temporarily disable a feature in a branch暂时禁用分支中的功能
【发布时间】:2019-09-14 23:07:17
【问题描述】:

我有一种情况,我需要停用分支中的某个功能,对其进行调整,然后在未来再次激活。

我的初始场景:

$ git log
14c9dcd (HEAD -> master) feature 3
af64271 feature 2
da0507a feature 1
  • 14c9dcd -- 创建 file3.txt
  • af64271 -- 编辑了file1.txt;创建了 file2.txt
  • da0507a -- 添加file1.txt

现在我需要在 master 分支上恢复 af64271 提交,并保持代码更改可用以便稍后返回(进行一些更改)。

我尝试过:

$ git checkout -b save_feature_2
    $ git checkout master
    $ git log --oneline   
        14c9dcd (HEAD -> master, save_feature_2) feature 3
        af64271 feature 2
        da0507a feature 1

#Reverting the "feature 2" commit changes
$ git revert af64271
    [master 8fcee28] Revert "feature 2"
    2 files changed, 1 insertion(+), 2 deletions(-)
     delete mode 100644 file2.txt

# Checking the differences
$ git diff save_feature_2
    diff --git a/file1.txt b/file1.txt
    index ba36cc9..8e90503 100644
    --- a/file1.txt
    +++ b/file1.txt
    @@ -1,2 +1 @@
    -<somecode here>
    -<more code here>
    \ No newline at end of file
    +<somecode here>
    \ No newline at end of file
    diff --git a/file2.txt b/file2.txt
    deleted file mode 100644
    index e69de29..0000000

# Checking log on master
$ git log --oneline
    8fcee28 (HEAD -> master) Revert "feature 2"
    14c9dcd (save_feature_2) feature 3
    af64271 feature 2
    da0507a feature 1

# Checking the save_feature_2 log branch
$ git checkout save_feature_2
$ git log --oneline
    14c9dcd (HEAD -> save_feature_2) feature 3
    af64271 feature 2
    da0507a feature 1

# Making same improviments on "feature 2" addind some code just on "file3.txt"
$ git log --oneline
    c4ff7f2 (HEAD -> save_feature_2) improvements on feature 2
    14c9dcd feature 3
    af64271 feature 2
    da0507a feature 1

# Now i need to reactivate the "feature 2" on master
$ git checkout master
$ git diff save_feature_2
    diff --git a/file1.txt b/file1.txt
    index ba36cc9..8e90503 100644
    --- a/file1.txt
    +++ b/file1.txt
    @@ -1,2 +1 @@
    -<somecode here>
    -<more code here>
    \ No newline at end of file
    +<somecode here>
    \ No newline at end of file
    diff --git a/file2.txt b/file2.txt
    deleted file mode 100644
    index e69de29..0000000
    diff --git a/file3.txt b/file3.txt
    index f70ef26..e69de29 100644
    --- a/file3.txt
    +++ b/file3.txt
    @@ -1 +0,0 @@
    -<improvements on feature 2>
    \ No newline at end of file

$ git merge save_feature_2
    Merge made by the 'recursive' strategy.
     file3.txt | 1 +
     1 file changed, 1 insertion(+)

$ git log --oneline
b10eabc (HEAD -> master) Merge branch 'save_feature_2' - Reactivating the feature 2
c4ff7f2 (save_feature_2) improvements on feature 2
8fcee28 Revert "feature 2"
14c9dcd feature 3
af64271 feature 2
da0507a feature 1

# At this point the "file2.txt" was no merged!

$ ls (master)
file1.txt  file3.txt
$ git checkout save_feature_2
$ ls (save_feature_2)
file1.txt  file2.txt  file3.txt

如您所见,file2.txt 没有合并!

【问题讨论】:

  • 我认为feature flags 会是一种更清晰的方法。
  • git revert 实际上是一个不错的选择。只需还原构成您要删除的功能的提交或提交范围。然后,在上面构建你的新特性,最后做一个 rebase 来删除 revert 提交。假设所有这些都发生在本地,重写历史并没有错。
  • 恢复合并并不意味着“删除共同祖先”

标签: git


【解决方案1】:

save_feature_2 分支应该包含 revert 提交以及 revert 的 revert 提交

当您将此分支合并回master 时,您将再次激活该功能。

更具体地说:

  1. 最初你有分支master,提交FEATUREFEATURE功能提交的哈希)。
  2. 您想还原FEATURE 并在master 分支上创建REVERT_OF_FEATURE(这是git revert FEATURE 生成的提交的哈希)
  3. 您创建一个名为FEATURE_BRANCH 或其他名称的分支。 (git co -b FEATURE_BRANCH) 在这个新分支上,您恢复 revert commit (git revert REVERT_OF_FEATURE)
  4. 您继续使用master(该功能现在不存在)和FEATURE_BRANCH(该功能再次出现,您可以继续处理)
  5. 最后,您将FEATURE_BRANCH 合并回master,您将获得原始功能以及master 上的其他更改。

您遇到的问题是因为当将分支 save_feature_2 合并回 master 时,发生的情况是 save_feature_2 分支中的所有提交的更改已包含在目标分支中(master) 被占用。但是原始的feature 提交已经存在,因此不包括这些更改。但是,如果您在该 功能分支 上包含 revert commitrevert of the revert commit,您将实现您想要的。

如果您想按原样修复当前情况,您可以简单地将master 合并到FEATURE_BRANCH 中(您将在那里获得REVERT_OF_FEATURE 提交),然后在那里恢复REVERT_OF_FEATURE 提交。

不过,我发现 功能标志 是件好事,正如 @crashmstr 在 cmets 中已经提到的那样。

【讨论】:

  • 完美!谢谢!
猜你喜欢
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
相关资源
最近更新 更多