Git Merge-与分支合作

时间:2020-02-23 14:33:22  来源:igfitidea点击:

在本教程中,我们将学习在Git中合并分支。

因此,我们已经在之前的教程中学习了如何创建分支以及如何检出分支。

合并分支

要将给定的分支合并到当前分支中,我们使用git merge [branch-name]命令。

因此,如果我们在master分支(即当前分支)上并且运行git merge dev命令,则将dev分支(即target分支)合并到master分支中。

合并之前:

$ls -la
total 0
drwxr-xr-x   5   staff  160 Oct  5 19:47 .
drwxrwxrwx  30   staff  960 Oct  2 22:48 ..
drwxr-xr-x  15   staff  480 Oct  8 16:43 .git
-rw-r--r--   1   staff    0 Sep 18 21:10 index.php
drwxr-xr-x   3   staff   96 Sep 12 19:46 js

合并中...

$git merge dev
Updating f066f07..ca522cf
Fast-forward
 sample.php | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 sample.php

合并后:

$ls -la
total 0
drwxr-xr-x   6   staff  192 Oct  8 16:44 .
drwxrwxrwx  30   staff  960 Oct  2 22:48 ..
drwxr-xr-x  15   staff  480 Oct  8 16:44 .git
-rw-r--r--   1   staff    0 Sep 18 21:10 index.php
drwxr-xr-x   3   staff   96 Sep 12 19:46 js
-rw-r--r--   1   staff    0 Oct  8 16:44 sample.php

从dev分支合并后,您可以看到sample.php文件已添加到master分支工作目录中。

注意!合并是快速转发合并(本教程后面的内容会对此进行更多介绍)。

我们合并时会发生什么?

当我们将目标分支合并到当前分支时,当前分支会更新以反映更改。
因此,将添加新文件,如果已有文件存在,则将对其进行更新。
但是目标分支仍然不受影响。

因此,在上述合并示例中,目标分支是dev分支,当前分支是master分支。

当我们执行合并操作时,将来自目标(dev)分支的新文件(sample.php)添加到当前(master)分支。

快进合并

如果当前分支和目标分支之间存在线性路径,则Git会执行快速前向合并。

示例:我们有一个master分支,并从中创建一个新的dev分支。
然后我们检出dev分支并提交一些更改。
最后,我们返回到master分支,并将dev分支的更改合并到master分支中。

快速前进合并之后,指向master分支的最后一次提交的指针将向前移动以指向dev分支的最后一次提交。

在主分支上。

$git branch
* master

$ls -la
total 0
drwxr-xr-x   5   staff  160 Oct  8 17:21 .
drwxrwxrwx  30   staff  960 Oct  2 22:48 ..
drwxr-xr-x  15   staff  480 Oct  8 17:22 .git
-rw-r--r--   1   staff    0 Sep 18 21:10 index.php
drwxr-xr-x   3   staff   96 Sep 12 19:46 js

创建一个新的dev分支并签出。

$git checkout -b dev
Switched to a new branch 'dev'

$git branch
* dev
  master

$ls -la
total 0
drwxr-xr-x   6   staff  192 Oct  8 17:26 .
drwxrwxrwx  30   staff  960 Oct  2 22:48 ..
drwxr-xr-x  15   staff  480 Oct  8 17:27 .git
-rw-r--r--   1   staff    0 Sep 18 21:10 index.php
drwxr-xr-x   3   staff   96 Sep 12 19:46 js

在dev分支上创建一个新文件sample.php并提交。

$touch sample.php

$ls -la
total 0
drwxr-xr-x   6   staff  192 Oct  8 17:26 .
drwxrwxrwx  30   staff  960 Oct  2 22:48 ..
drwxr-xr-x  15   staff  480 Oct  8 17:27 .git
-rw-r--r--   1   staff    0 Sep 18 21:10 index.php
drwxr-xr-x   3   staff   96 Sep 12 19:46 js
-rw-r--r--   1   staff    0 Oct  8 17:26 sample.php

$git status
On branch dev
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	sample.php

nothing added to commit but untracked files present (use "git add" to track)

$git add .

$git commit -m 'initial commit'
[dev 80cbf0b] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 sample.php

检出master分支并合并dev分支。

$git checkout master
Switched to branch 'master'

$git branch
  dev
* master

$git merge dev
Updating 0e19bc1..80cbf0b
Fast-forward
 sample.php | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 sample.php

$ls -la
total 0
drwxr-xr-x   6   staff  192 Oct  8 17:28 .
drwxrwxrwx  30   staff  960 Oct  2 22:48 ..
drwxr-xr-x  15   staff  480 Oct  8 17:28 .git
-rw-r--r--   1   staff    0 Sep 18 21:10 index.php
drwxr-xr-x   3   staff   96 Sep 12 19:46 js
-rw-r--r--   1   staff    0 Oct  8 17:28 sample.php

3路合并

当前分支也移动时,Git执行三向合并。

示例:我们有一个master分支,并从中创建一个新的dev分支来开发新函数。
此时,dev和master分支的指针指向相同的最后提交。

我们签出dev分支并开始提交更改。
因此,dev分支指针开始向前移动。

可以说,当我们在dev分支上开发新函数时,我们项目中的其他开发人员会添加他们的新函数并将其合并到master分支中。
因此,现在主分支指针也向前移动。

现在,我们完成了新函数开发,因此,我们签出了master分支并将dev分支合并到其中。
由于master分支的最后一个提交指针由于其他开发人员的提交而向前移动,因此Git执行3向合并。

在主分支上。

$git branch
* master

$ls -la
total 0
drwxr-xr-x   5   staff  160 Oct  8 18:01 .
drwxrwxrwx  30   staff  960 Oct  2 22:48 ..
drwxr-xr-x  15   staff  480 Oct  8 18:01 .git
-rw-r--r--   1   staff    0 Sep 18 21:10 index.php
drwxr-xr-x   3   staff   96 Sep 12 19:46 js

创建一个新的dev分支并签出。

$git checkout -b dev
Switched to a new branch 'dev'

$git branch
* dev
  master

$ls -la
total 0
drwxr-xr-x   5   staff  160 Oct  8 18:01 .
drwxrwxrwx  30   staff  960 Oct  2 22:48 ..
drwxr-xr-x  15   staff  480 Oct  8 18:04 .git
-rw-r--r--   1   staff    0 Sep 18 21:10 index.php
drwxr-xr-x   3   staff   96 Sep 12 19:46 js

在dev分支上创建一个新文件sample.php并提交。

$touch sample.php

$git status
On branch dev
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	sample.php

nothing added to commit but untracked files present (use "git add" to track)

$git add .

$git commit -m 'initial commit'
[dev 4038853] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 sample.php

检出master分支并提交一些更改。

$git checkout master
Switched to branch 'master'

$ls -la
total 8
drwxr-xr-x   5   staff  160 Oct  8 18:08 .
drwxrwxrwx  30   staff  960 Oct  2 22:48 ..
drwxr-xr-x  15   staff  480 Oct  8 18:09 .git
-rw-r--r--   1   staff   32 Oct  8 18:08 index.php
drwxr-xr-x   3   staff   96 Sep 12 19:46 js

$vi index.php 

$git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   index.php

no changes added to commit (use "git add" and/or "git commit -a")

$git add .

$git commit -m 'update'
[master 9a971ed] update
 1 file changed, 5 insertions(+)

现在,主分支已向前移动。
现在,我们将把dev分支合并到master中。

$git merge dev
Merge made by the 'recursive' strategy.
 sample.php | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 sample.php