基础知识:多人使用一个Github仓库
时间:2022-05-03
本文章向大家介绍基础知识:多人使用一个Github仓库,主要内容包括目录简介、分支策略管理、总结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
在公司进行项目开发,每个项目组多人,往往会共用同一个Github仓库地址。在合并分支的时候,有很多情况是出错的,无法合并。
目录简介
- 分支简介
- 分支创建
- 快速合并分支
- 删除分支
- 分支合并冲突
- 普通合并分支
- 分支管理策略
- 团队多人协作开发
- 推送分支
- 抓取分支
分支简介
- master分支并不是一个特殊的分支,只是主分支的默认名字,在你进行
git init
的时候,就会生成master这个名字,所有的记录都会在隐藏的文件夹.git/
下 - master的名字可以修改。
创建分支
- 创建分支执行以下命令:
git branch newBranchName
,Enter. - 创建的分支,是为当前提交的对象上创建一个指针。
如图,分支是当前提交对象的指针。Git是通过HEAD的指针,获取当前的分支名字。HEAD是一个指向所在的本地分支。git branch
命令仅仅创建一个分支,并不会自动切换到新的分支去,指针并不会发生移动。
- 你可以使用
git log --online --decorate
来查看当前所致的对象 - 示例
git log --online --decorate
f30ab(HEAD,master,newBranchName)add xxxxxx...balabala...
balabala。。。
切换分支
-
git checkout newBranchName
,这样HEAD就指向newBranchName分支了
画重点了
- 创建分支并且切换分支的命令的是:
git checkout -b newBranchName
这样有什么优点呢??
- HEAD分支随着新的提交的操作向时间线后移动,但是master分支却没有移动,仍然是上个版本的提交的对象。
- 现在我们切换master分支看看:
git checkout master
这个命令做了两件事情
使得HEAD重新指向master分支
将目录恢复成master分支所指向快照的内容
这就说明了,忽略了testing分支所做的修改,以便向另一个方向进行开发。
- 可以使用
git branch
,查看当前分支,带*
的是当前分支。
分支切换会改变你工作目录的文件夹
- 在切换分支的时候,一定要注意开发者开发目录的文件会发生改变,如果是切换到一个较旧的分支,工作目录会恢复到该目录最后提交的样子。
快速合并分支
如果我们在testing分支完成工作了,怎么讲testing分支的开发内容合并到maser上面呢? 因为指针的存在,就直接把master指向test当前的提交。就完成了合并。这里需要git merge
命令
-
git merge testing
命令用于合并指定分支
到当前分支
,合并后,在查看内容。至此完成合并。
删除分支
合并完成分支之后,就可删除。
- 使用命令进行操作
git branch -d testing
分支合并冲突
在合并分支的时候,会出现内容冲突,合并出错不成功的现象。
- 创建并使用新的分支进行开发:
git checkout -b dev
- 修改README.md文件的内容,在
dev
分支上提交
切换到master分支
git checkout master
Switch to branch master
Your branch is up-to-date with origin/master
Git会自动提示我们当前master分支比远程分支要超前1个提交,在master分支上把README.md文件的最后要修改,提交。 现在,master分支和dev分支都分别有新的提交,变成了这样。
这样情况下,Git无法进行快速合并,只能把各自修改的合并起来。但是这种合并可能会有冲突。
-
git merge dev
,回车。 如果文件冲突,会报错,会提示:Automatic merge failed;fix conficts and then commit the result
- 冲突以后必须要手动解决冲突后再提交。使用
git status
命令 - Git用
<<<<<<< , ======= ,>>>>>>>
标记不同分支的内容,我们修改后保存提交。这样,master和dev的分支如下:
普通合并分支
- 合并分支的时候,Git可能会用Fast forward 模式,但是这种的模式下,删除分支后,会丢掉分支信息。
- 如果要强制禁用Fast forward模式,Git就会在merge是生成一个新的commit,这样,从分支历史上就可以看到分支信息。
使用No-ff的方式git merge
- 首先,创建并切换分支:
git checkout -n dev
- 修改提交的文件,并重新提交
- 切换回master,
git checkout master
,流程图如下:
- 准备合并分支的时候,请注意参数
--no-ff
参数,表示禁用Fasr forword
git merge --no-ff -m "merge with no-ff"
- 合并后,用以下语句查看分支历史
git log --graph --pretty=online --abbrev-commit
- 不使用Fast forward模式,merge就像是这样:
分支策略管理
公司开发一般需要三个分支:
-
master
主分支用来发布 -
dev
日常开发 -
bug
用来修改bug用的分支 - 推送到其他分支:
git push origin dev
总结
一般多人协作的模式一般是这样
- 首选,可以尝试用
git push origin branch-name
推送自己修改。 - 如果推送失败,则因为远程分支比你本地更新,需要你先用git pull 尝试合并。
- 如果合并有冲突,则解决冲突,并在本地提交。
- 如果没有冲突或者解决掉冲突以后,,在用
git push origin branch-name
推送。 - 如果git pull 提示
no tracking information
,则说明本地分支和远程分支的连接没有创建。
汇总一下命令
-
git branch
查看当前分支 -
git branch -v
查看每个分支的最后一次提交。 -
git branch -a
查看本地和远程分支情况 -
git branch --merged
查看已经与当前分支合并的分支 -
git branch --no-merged
查看已经与当前分支未合并的分支 -
git branch -r
查看远程分支 -
git branch dev
创建dev分支 -
git checkout dev
切换到dev分支 -
git checkout -b dev
创建并切换分支 -
git merge dev
名称为dev的分支与当前分支合并 -
git branch -d dev
删除分支dev
- 【LeetCode 409】 关关的刷题日记31Longest Palindrome
- Git的奇技淫巧?
- 3224: Tyvj 1728 普通平衡树
- 【LeetCode 136】 关关的刷题日记32 Single Number
- 1599: [Usaco2008 Oct]笨重的石子
- 【LeetCode 136】 关关的刷题日记33 Intersection of Two
- 1218: [HNOI2003]激光炸弹
- Java多线程高并发学习笔记(一)——Thread&Runnable
- 1257: [CQOI2007]余数之和sum
- 【LeetCode 136】 关关的刷题日记34 Intersection of Two Arrays II
- 1724: [Usaco2006 Nov]Fence Repair 切割木板
- 【LeetCode 202】 关关的刷题日记35 – Leetcode 202. Happy Number
- JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask
- 算法模板——Trie树
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Backtracking - 216. Combination Sum III
- Backtracking - 40. Combination Sum II
- Backtracking - 39. Combination Sum
- Backtracking - 77. Combinations
- Backtracking - 90. Subsets II
- Backtracking - 78. Subsets
- Tree - 331. Verify Preorder Serialization of a Binary Tree
- Tree - 95. Unique Binary Search Trees II
- Tree - 96. Unique Binary Search Trees
- Tree - 116. Populating Next Right Pointers in Each Node
- Tree - 297. Serialize and Deserialize Binary Tree
- 使用 shell 脚本批量创建用户详解讲解
- Tree - 230. Kth Smallest Element in a BST
- Tree - 173. Binary Search Tree Iterator
- Tree - 450. Delete Node in a BST