git-分支的新建与合并
2016年11月02日 22:53:26 YY-Captain 阅读数:9368 标签: gitgithub 更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 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
- 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参数推送失败的话,可以使用此参数