Git Merge-与分支合作
在本教程中,我们将学习在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