git-分支的新建与合并

git-分支的新建与合并

2016年11月02日 22:53:26 YY-Captain 阅读数:9368 标签: gitgithub 更多

个人分类: linuxGitHub

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/makenothing/article/details/53014308

0 准备

0.0 仓库

github 
gitlab

无论是github,还是gitlab 都是存储代码的仓库,可以在上面保存、管理代码。

0.1 管理工具

git

git是基本的管理工具,在windows、linux、Mac等系统上都有对应的客户端。

0.2 git的原理

此处不赘述,可以参考之前的文章: 
git原理与使用指南 
git设置与使用

1 分支的新建与提交

因为这部分属于基本的操作,此处不做赘述,仅仅列出做常用的几条命令,权当是为了以后查找方便。

1.1 本地分支新建

git branch new_task_A //新建分支
git checkout new_task_A //转到该分支

当然上面两条命令通常用一条命令代替

git checkout -b new_task_A  //新建并转到该分支

1.2 本地分支提交

我们在新分支上进行工作,修改了代码,或者增加了些许文件,需要提交到本地保存起来。

git add . // .表示当前目录所有文件,或者可以指定某一文件,如下
//git add index.html 提交某一文件
//git add -a 所有的更改操作--新建,更改,删除;
//git add . 只包括 新建 ,修改操作;无删除;
//git add -u 只包括修改,删除操作,无新建
// 然后就是 commit 
git commit -m "do something " //这样就提交到本地仓库了

然后,接下来,如果我们修改的没什么错误,就会合并到master 分支上。

git checkout master //首先转到master分支
git merge new_task_A //合并到master分支

常见问题: 
git merge 的时候,如果没有冲突,就会很顺利,有冲突的话,就要做额外的一些工作,一般会提示:

Unmerged paths:
.....

修改分支名称

git branch -m old_name new_name

这时候,需要手动解决冲突,然后对解决冲突的文件执行 git add命令。

1.3 提交分支到远程

如果,我们希望自己在本地新建的分支能够在远程服务器上显示,以new_task_A为例,可以这样

git push origin new_task_A

1.4 删除分支

1.4.1 删除本地分支

bug 修复完成,提交了版本,新分支 new_task_A 已经不需要的时候,可以删掉了

git branch -d new_task_A

1.4.2 删除远程分支

git push origin --delete new_task_A

常见问题:一般是权限问题,或者安全问题。请确认自己有足够的权限执行git push.

1.5 获取远程仓库

1.5.1 强制覆盖本地仓库

清除本地修改
git reset --hard
拉取远程分支
git pull origin master
强制拉取上游upstream 到本地
git remote add upstream https://XXXXX/A.git //设置上游upstream ,也就是本地的fork源仓库
git fetch upstream   //拉取upstream的代码A,就会出现upstream/master 分支
git reset --hard upstream/master //强制使用upstream/maste 覆盖本地分支

1.5.2 git pull 与 git fetch

Git中从远程的分支获取最新的版本到本地有两种方法:git pull 与git fetch 
1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge

git fetch origin master //下载最新的版本到origin/master分支上
git log -p master..origin/master // 比较本地的master分支和origin/master分支的差别
git merge origin/master //最后进行合并

上述过程其实可以用以下更清晰的方式来进行:

git fetch origin master:tmp
git diff tmp 
git merge tmp
  1. git pull:相当于是从远程获取最新版本并merge到本地
 git pull origin master

上述命令其实相当于git fetch 和 git merge,git fetch更安全一些,可以在merge前,我们可以查看更新情况,然后再决定是否合并。

1.6 merge 不同fork的版本

1.6.1 将两个不同fork分支合并

情景:B与C都从A【upstream】fork而来。B与C都对A做了修改,现在要你对B C的修改,都合并到A中。

A---fork--->B
A---fork--->C

当然,方法有很多种,可以先把B合并到A,然后再把C合并到 A,就OK了。 
这里有个情况是,你不是B或者C的直接管理者,而只是第三者,仅有git clone代码的权限。这样的话,你就不能在B或者C的github仓库里执行merge request。此时,选择现在本地对两者进行合并。

可以知道,A是B或者C的upstream,我们可以先把B的代码clone到本地,然后将A的代码clone到同一本地仓库中。

git clone https://XXXXX/B.git //git clone
cd B
git checkout master //checkout到需要合并的分支,比如master
git remote add upstream https://XXXXX/A.git //设置upstream
git fetch upstream   //拉取upstream的代码A,就会出现upstream/master 分支,以及upstream的其他分支(如果有的话)
git branch -va   //k可以看一下当前仓库的所有代码分支,包括B以及A的所有分支
git checkout master //切换到需要合并的分支B的master
git merge upstream/master //合并到A的master ,Done !
  •  

此时,解决冲突,就可以获得两个不同fork分支的合并版本。

//解决冲突
git merge --no-ff upstream/master //合并到A的master 可以先使用--no-ff参数
Auto-merging file.txt
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.
git status                      //然后查看冲突位置
# On branch master-branch-1
# Changes to be committed:
#
#   modified:   conf/custom/vhost/baidu.conf
#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      baidu-detect.conf   //此处是需要解决冲突的文件
#
vim baidu-detect.conf       //打开文件查看冲突位置,一般使用<<<< ===== >>>> 标记
git add baidu-detect.conf   // 修改完成后。add commit push 
git commit -m "fix merge problem"
git push -f origin master-branch-1  // -f 参数是强制将修改推送到master-branch-1,如果没有-f参数推送失败的话,可以使用此参数 

建议参考:分支的新建与合并 
github merge不同fork的代码 
fork merge

猜你喜欢

转载自blog.csdn.net/weixin_42082222/article/details/84753620