如何自动格式化主分支和功能分支而不引起冲突?

问题描述 投票:0回答:1

假设我有这个 git 历史记录:

* 894a016 (HEAD -> feature) Add radius() method
* 6a62db6 (master) Add circle.h

circle.h
中的
feature
看起来像:

#include <iostream>
using namespace std;

class Circle {
  double radius;

public:
  Circle(double r)
            : radius(
                r) {
  }
  double area() {
    return radius
          * radius
          * 3.14159265;
  }

  double radius() {
      return    radius;
  }
};

我想格式化我的整个存储库、主分支和功能分支,而不引起太多冲突。

我可以对任何分支进行新的提交,但理想情况下不需要

rebase
功能分支(如果这是唯一的方法,那很好——我正在为一个团队做这件事,所以我只是想让事情变得轻松尽可能)。

如何格式化我的主干分支和功能分支而不产生意外冲突?

格式化两个分支不起作用,例如:

* 2e654d8 (HEAD -> feature) Run clang-format
* 894a016 Add radius() method
| * 25fab84 (master) Run clang-format
|/
* 6a62db6 Add circle.h

尝试合并时会导致冲突。例如,

git checkout feature && git merge master
给出了这样的冲突:

#include <iostream>
using namespace std;

class Circle {
  double radius;

public:
  Circle(double r) : radius(r) {}
  double area() { return radius * radius * 3.14159265; }
<<<<<<< HEAD

  double radius() { return radius; }
=======
>>>>>>> master
};
git code-formatting clang-format git-merge-conflict
1个回答
0
投票

我想我找到了一个可以接受的答案。这适用于这个玩具示例,我将做更多测试,看看它是否适用于更大的规模。

考虑到这个(稍微更复杂)的历史:

* c9ede4f (master) Add area to print()
| * c859a1d (feature) Add radius to print()
|/
* 58ead7c Add print()
* 427a8ba Add circle.h

(这个特定的历史实际上在格式化所有分支时会产生很好的冲突,但我相信这个解决方案适用于一般情况)

  1. 自动格式化

    master
    (为方便起见,在格式化之前和之后标记提交)

    $ git checkout master
    $ git tag before_auto_format
    $ clang-format -i *
    $ git commit -am "Run clang-format"
    $ git tag after_auto_format
    
  2. 将预格式

    master
    合并到
    feature
    并像平常一样解决冲突

    $ git checkout feature
    $ git merge before_auto_format
    $ vi circle.h
    $ git add .
    $ git commit
    
  3. after_auto_format
    合并到
    feature
    。放弃更改并手动进行格式化。

    $ git merge after_auto_format --no-commit
    $ git checkout HEAD .
    $ clang-format -i *
    $ git add .
    $ git commit
    

最终的历史如下所示:

*   09f2448 (feature) Merge tag 'after_auto_format' into feature
|\
| * e5e964b (tag: after_auto_format, master) Run clang-format
* | 1ef1b9b Merge tag 'before_auto_format' into feature
|\|
| * c9ede4f (tag: before_auto_format) Add area to print()
* | c859a1d Add radius to print()
|/
* 58ead7c Add print()
* 427a8ba Add circle.h

我相信这达到了同步功能分支与主干、自动格式化两者的预期效果,并且不会导致意外冲突。

如果有人有更好的选择,我洗耳恭听。

© www.soinside.com 2019 - 2024. All rights reserved.