git merge

合并

git 推荐我们在开发过程中要使用分支的技术来进行开发,比如我们从远端clone一个仓库,其实是一个origin/master分支,然后自动在本地创建了一个master分支,然后默认会进行merge操作,将origin/master分支合并到本地分支中,这一系列的流程都是git clone一个命令完成了。那么我们在开发中如何显式的进行分支的管理呢?

查看分支

git branch命令可以列举所有分支,星号*标识的代表当前所处分支

$ git branch
* master

创建分支

有2种方式:git branch 分支名和git checkout -b 分支名

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (master)
$ git branch
* master

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (master)
$ git branch dev

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (master)
$ git branch
  dev
* master

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (master)
$ git checkout -b dev1
Switched to a new branch 'dev1'

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (dev1)
$ git branch
  dev
* dev1
  master

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (dev1)
$

从上面的结果可以看到,git branch <分支名>创建后,分支不会切换到新的分支,还保持在当前分支。而git checkout -b <分支名>的方式会在创建完成后自动切换到新创建的分支。

切换分支

在各个分支之间来回切换,需要使用git checkout <分支名>,注意这里不带参数-b

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (dev)
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (master)
$ git checkout dev
Switched to branch 'dev'

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (dev)
$ git checkout dev1
Switched to branch 'dev1'

合并分支

讲到现在才讲到git merge的内容,因为讲合并必须有分支的概念,不然就无从谈起merge了。我们刚才已经创建了2个新分支,为dev和dev1,git官方是提倡将master作为一个已经成熟的分支,或者即将提交到origin仓库中的分支,我们开发的时候不要直接对master操作,而是要新建一个开发分支来进行提交,然后再合并到master中,具体如何操作,来看例子:

首先:我们将dev分支当成我们的开发分支。切换到该分支

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (dev1)
$ git checkout dev
Switched to branch 'dev'

然后我们修改一下该分支下面的一个文件,然后git add,git commit

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (
$ git add README.md

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (
$ git commit -m 'first commit'
[dev 65104ea] first commit
 Committer: unknown <hui.qian@HuiQianPC.spreadtrum.co
Your name and email address were configured automatic
on your username and hostname. Please check that they
You can suppress this message by setting them explici

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for t

    git commit --amend --reset-author

 1 file changed, 1 insertion(+)

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (
$ git log
commit 65104ea16ac90b8b06925e24901ff82025c5f443
Author: unknown <hui.qian@HuiQianPC.spreadtrum.com>
Date:   Tue Mar 3 11:31:29 2015 +0800

    first commit

commit eed415fb38da8dbceb921d49b91c1c74dba3be43
Author: Hui Qian <542113578@qq.com>
Date:   Mon Mar 2 20:04:25 2015 +0800

    Update README.md

commit 99bbcf63644e08d55b23a94be0e7fcfce084263e
Merge: 3af2416 40b6a49
Author: unknown <hui.qian@HuiQianPC.spreadtrum.com>
Date:   Mon Mar 2 17:30:22 2015 +0800

    merge from origin

commit 40b6a495ba3be5459331a05acf960d3049eb5d19
Author: Hui Qian <542113578@qq.com>
Date:   Mon Mar 2 16:42:09 2015 +0800

    Update README.md
:

ok,我们在dev分支上做了一次修改,提交log显示我们目录的历史记录多了一条first commit的记录。ok,这个时候我们如果想要将这个修改同步到远程仓库中,我们不能直接在该分支上进行git push,因为远程仓库并没有origin/dev这个仓库,所以要先合并到master分支上,然后再push到origin/master分支上。

最后,我们来合并:因为我们是要将dev的修改合并到master分支上,所以我们先切入master中

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (dev)
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (master)
$ git merge dev
Updating eed415f..65104ea
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)

这个时候我们在master分支上运行git push会把dev的更新同步到远程仓库中。

删除分支

我们已经将dev分支的更新合并到master了,现在可以删除了
命令git branch -d/-D <分支名>

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (master)
$ git branch -d dev
Deleted branch dev (was 65104ea).

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (master)
$ git branch -D dev2
error: branch 'dev2' not found.

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (master)
$ git branch
  dev1
* master

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (master)
$ git branch -D dev1
Deleted branch dev1 (was eed415f).

hui.qian@HUIQIANPC /e/testerhome/AndroidTestScrpits (master)
$ git branch
* master

参数-d和-D的区别在于-D是强制删除,不管被删除的认真有没有没提交的修改,但是-d就是安全删除,只有在被删除的分支没有需要提交的修改时才能删除成功。

### 使用方法 以下是不同场景下 `git merge` 的使用方法: - 合并指定提交:`git merge <commit-id>`,例如 `git merge 3fa326a`,用于合并指定提交 3fa326a [^4]。 - 合并本地分支:`git merge <branch-name>`,例如 `git merge dev`,可将本地 `dev` 分支合并到当前所在分支 [^4]。 - 合并远程分支:`git merge origin/<branch-name>`,例如 `git merge origin/dev`,能将远程 `origin` 的 `dev` 分支合并到当前分支 [^4]。 - 合并当前分支的上游分支:`git merge`,默认合并当前分支的上游分支(可通过 `git branch -vv` 确认关联),不过此方式不推荐 [^4]。 ### 原理 `git merge` 的工作原理如下: 1. 开始 `merge` 之前,`git` 会检查当前分支是否有未提交的更改,若有(不管是暂存还是未暂存),`git` 会阻止合并操作 [^4]。 2. 进行快进检查。如果能快进就会执行 Fast - forward 合并,如果不能,则进入下一步的三路合并(Three - way Merge) [^4]。 3. `git` 首先确定参与合并的两个分支的最近共同祖先提交。比较两个分支最新提交相对于基点的更改,自动尝试合并这些变更。如果存在冲突,冲突文件会被标记,并暂停合并流程,等待手动解决,然后重新执行 `git add` 和 `git commit` [^4]。 4. `git` 创建一个新的合并提交,并更新当前分支的 `HEAD` 指向新的提交 [^4]。 ### 应用场景 `git merge` 适用于以下场景: - 当想要保持分支的合并历史,便于后期审查时,使用 `git merge` 是合适的。 - 在团队协作中,多个开发者同时进行开发时,使用 `merge` 可以保留所有开发过程的历史 [^3]。 ### 代码示例 ```bash # 创建并切换到新分支 git checkout -b feature-branch # 在新分支上进行一些提交操作 # ... # 切换回主分支 git checkout master # 合并 feature-branch 到主分支 git merge feature-branch ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值