对多个分支进行相同更改的最佳方法是什么?

时间:2013-12-12 22:35:31

标签: git

说我有两个分支。其中一个包含一个文件,另一个包含文件的略微修改版本。我注意到这两个文件中都有相同的bug。我是否必须进入每个分支并修复文件的每个版本中的错误,或者是否有办法同时对这两个文件执行此操作?

3 个答案:

答案 0 :(得分:3)

樱桃采摘是一次性修复的方法。

步骤如下:

  1. 在一个分支中进行修复,然后提交结果。
  2. 记录(复制到剪贴板?)您刚刚提交的提交的哈希值
  3. 切换到其他分支

    git checkout otherbranch
    
  4. Cherry-选择你记得哈希的提交:

    git cherry-pick COMMIT_SHA
    

    或者,如果它是第一个分支的最新提交,你可以放入 分支名称而不是哈希。

答案 1 :(得分:2)

实现所需内容的最佳方法是检查引入问题的提交或当前分支的公共祖先,在该提交之上提交修复,然后将更改合并到两个分支中。

这样,两个分支都有修复,分支没有受到来自另一个分支的更改的污染,并且查看提交我们可以很容易地看到它已合并到哪个分支。

为了说明这一点,让我们复制你的情况:

$ git init
Initialized empty Git repository in /home/voo82358/git/playfixup/playfixup/.git/
$ echo line > file
$ git add *
$ git commit -am "Initial commit"
[master (root-commit) 9421b69] Initial commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file
$ git checkout -b release
Switched to a new branch 'release'
$ echo release >> file
$ git commit -am "Add release to file"
[release 4076727] Add release to file
 1 files changed, 1 insertions(+), 0 deletions(-)
$ git checkout master
Switched to branch 'master'
$ echo master >> file
$ git commit -am "Add master to file"
[master d3ad097] Add master to file
 1 files changed, 1 insertions(+), 0 deletions(-)
$ git --no-pager log --graph --all --oneline
* d3ad097 Add master to file
| * 4076727 Add release to file
|/  
* 9421b69 Initial commit

因此,我们在每个分支中都有一个包含不同内容的文件,我们会修复'它的祖先:

$ git checkout -b fix-file `git merge-base master release`
Switched to a new branch 'fix-file'
$ sed -i '1iprefix' file
$ git commit -am "Add prefix to file"
[fix-file c84bd33] Add prefix to file
 1 files changed, 1 insertions(+), 0 deletions(-)
$ cat file
prefix
line

现在我们只需要将它合并到分支中,首先是master:

$ git checkout master
Switched to branch 'master'
$ git merge fix-file
Auto-merging file
Merge made by recursive.
 file |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
$ cat file
prefix
line
master

然后发布:

$ git checkout release
Switched to branch 'release'
$ git merge fix-file
Auto-merging file
Merge made by recursive.
 file |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
$ cat file
prefix
line
release

这使得我们的提交图看起来像这样:

$ git --no-pager log --graph --all --oneline
*   dd630eb Merge branch 'fix-file'
|\  
* | d3ad097 Add master to file
| | *   50c10de Merge branch 'fix-file' into release
| | |\  
| | |/  
| |/|   
| * | c84bd33 Add prefix to file
|/ /  
| * 4076727 Add release to file
|/  
* 9421b69 Initial commit

对于这样一个简单的例子,这可能看起来有点过分,但是当你开始必须跟踪特定修复是否已经合并到多个分支时,它就变成了一种强大的技术。

答案 2 :(得分:1)

最好的方法是将错误修复到一个分支中,然后将此提交合并到所有分支。