6.git的fork开发模式

一、Git简介

1. Git与SVN的主要区别

  • Git是分布式仓库,与SVN等中心仓库相比最明显的区别是:
  • SVN采用集中式的版本控制,由一个集中管理的服务端保存所有修改历史记录;客户端只需下载出最新或指定提交的文件,不包据完整的历史记录。

2. git的开发模式

  1. fork 开发模式:Fork 开发模式是一种社交编程,是利用群体的智慧来进行合作编程的一种工作模式,采用派生/合并请求方式,让任何一个开发者都可以方便的向开源项目贡献代码。
  2. 分支开发模式:分支开发模式是采用直接 clone 源项目中心仓的方式,由新建分支向目标分支发起合并请求提交代码,让任何一个开发者都可以方便的向开源项目贡献代码。这种模式没有代码评审的机制,使得开发者之间的协作与交流变得少而且不顺畅,这样就不能很好的保证中心仓的代码质量。这种模式比较适合几个人的小团队,对于较大的团队,建议使用fork 开发模式。
  3. Omega 开发模式:集中式的代码仓库管理

二、fork开发模式

1.fork

Fork一个项目时,可以选择项目 Fork 到组织还是个人名下。点击·Fork·按钮后,根据页面弹出窗口提示选择相应组织名还是个人名下即可。

  1. 主干仓是Public 类型, fork 后的仓库是Public ,fork 仓可以更改类型;Public、Internal、Private;
  2. 主干仓是Internal 类型,fork 后的仓库是Internal ,fork 仓可以更改类型;Private、Internal;
  3. 主干仓是Private 类型,fork 后的仓库是Private ,fork 仓不能更改类型;

2.git clone

(1)方式:1:使用 TortoiseGit 进行 clone

  1. 在本地文件夹空白处右击 -> 选择Git Clone
  2. 将刚刚copy的git仓地址,添加到URL处,确认无误后点击“OK”进行克隆

(2)方式2:使用 git bash 进行 clone

  1. 在本地文件夹空白处右击 -> 选择Git Bash Here
  2. 执行克隆命令:git clone xxxxxx.git

3.本地修改代码、提交代码

本地修改的代码需要提交并push到平台

(1)方式1:使用 TortoiseGit 提交、push代码

  1. 在本地项目根目录下,右键选择Git Commit -> “masterXX”…
  2. 在Message栏填写提交信息->勾选需要提交的文件->点击“OK”
  3. 完成commit之后会出现提示框,点击Push将本次提交推送到远端

(2)方式2:使用 git bash 提交、push代码

  1. 查看当前代码的修改状态,git status
  2. 将修改的文件提交到本地暂存区,git add filename或者将所有修改过的工作文件提交暂存区,执行命令:git add .
  3. 将暂存区的修改文件提交到本地git库中,git commit后输入commit message,或者git commit -m "引号内输入commit message"
  4. 将提交的修改推送到远端,git push origin master(例子中使用的是默认的远端origin,分支master)

注意:将新创建的分支推送到远端仓:git push origin 分支名

4.创建合并请求

当fork库更改了内容,需要合并到主库,需要向主库发起 “合并请求”。

点击 “Compare branches and continue” 按钮出现如下界面:

5.代码检视

提交MR 后,进行代码检视

6.合并MR

注意:如果此合并请求有冲突,需要解决合并冲突。首先要把远程仓库的最新数据拉到本地仓库,再从本地仓库的分支合并,解决冲突。

7.总结

常用命令:

分支:
git branch // 显示分支列表,左侧有*的表示当前所在的分支
git branch 新分支名称 // 创建新分支
git checkout 分支名称 // 切换分支
git branch + git checkout test = git checkout -b //创建分支并切换到test分支
git branch --delete --force <branchName> // 删除本地分支,或者使用选项-D作为简写:git branch -D
git push origin --delete <branchName> // 删除远程分支
合并分支:
git merge 合并分支名称:现在在A分支上,输入git merge B,就会把B分支合并到A分支上,合并后的结果会存储在A分支上,整个过程对B分支没有影响。
查看分支:
git log --graph:以图表形式查看分支

提交:
git commit --amend -m ”YOUR-NEW-COMMIT-MESSAGE”  // 编辑最近一次的提交信息,但是你必须确保没有对当前的代码库(working copy)做修改,否则这些修改也会随之一起提交。
git commit --amend // 如果commit注释写错了,只是想改一下注释,此时会进入默认vim编辑器,修改注释完毕后保存就好了。
git push <remote> <branch> --force // 假如你已经将代码提交(git commit)推送(git push)到了远程分支,那么你需要通过下面的命令强制推送这次的代码提交。
git push -u origin 本地分支名:要创建的新分支名称 //在远程仓库创建新分支
注意:本地分支名和远程新分支名可以不一样,但中间一定要注意加":"(冒号)
git checkout -b 本地仓库新建分支名称 远程仓库名称/要取回的远程分支名称 // 完成远程分支取回本地的操作
举例:git checkout -b A origin/B 的执行结果是以名为origin的远程仓库(默认远程仓库)的B分支为来源,在本地仓库中创建分支A。
git pull 远程仓库名称 远程分支名称 // 从远程仓库取回最新版本的分支

远程仓库:
git remote -v:查看远程仓库(有远程仓库remoteService,本地仓库origin)

暂时不提交:
git stash // 把当前进度保存起来
git stash pop // 恢复最新的进度到工作区

回溯版本:如果在更新代码之后,忘记更新前应该创建个分支,可以使用如下操作
git log:查看以当前状态为终点的历史日志
git reset --hard 目标时间点哈希值:回溯历史版本
git relog:查看全部时间下的历史日志,不受当前状态影响
git reset --hard 最新版本分支:回退到想更新后的分支
现在我们的master分支又回到了开始的最新版本,而以master分支的历史版本为基础的B分支也成功建立了,又可以继续开始多路并行作业了。

撤销:
git reset <文件名> // 往暂存区(staging area)中加入了一些错误的文件,但是还没有提交代码。如果只需要移除一个文件
git reset // 从暂存区移除所有没有提交的修改
  1. 在本地修改与远程代码无冲突的情况下,优先使用:pull->commit->push
  2. 在本地修改与远程代码有冲突的情况下,优先使用:commit->pull->push

7.1 忽略本地修改,强制拉取远程到本地

主要是项目中的文档目录,看的时候可能多了些标注,现在远程文档更新,本地的版本已无用,可以强拉

git fetch --all
git reset --hard origin/dev
git pull

7.2 未commit先pull,视本地修改量选择revert或stash(pull commit push)

应用场景:同事有新提交

我 没有pull,修改了文件 -> pull -> 提示有冲突

(1)本地修改量小

方法:如果本地修改量小,例如只修改了一行,可以按照以下流程

-> revert(把自己的代码取消) -> 重新pull -> 在最新代码上修改 -> [pull确认最新] -> commit&push

(2)本地修改量大,冲突较多

方法1:-> stash save(把自己的代码隐藏存起来) -> 重新pull -> stash pop(把存起来的隐藏的代码取回来 ) -> 代码文件会显示冲突 -> 右键选择edit conficts,解决后点击编辑页面的 mark as resolved->  commit&push

方法2:-> stash save(把自己的代码隐藏存起来) -> 重新pull -> stash pop(把存起来的隐藏的代码取回来 ) -> 代码文件会显示冲突 -> 右键选择resolve conflict -> 打开文件解决冲突 ->commit&push

7.3 已commit未push,视本地修改量选择reset或直接merge(commit pull push)

(1)修改量小,直接回退到未提交的版本(可选择是否保存本地修改)

应用场景:同事有新提交

我 没有pull -> 修改了文件 -> commit -> pull -> 提示有冲突

方法:如果本地修改量小,例如只修改了一行,可以按照以下流程

-> reset(回退到未修改之前,选hard模式,把自己的更改取消) -> 重新pull -> 在最新代码上修改 -> [pull确认最新] -> commit&push

(2)修改量大,直接merge,再提交(目前常用)

方法:-> commit后pull显示冲突 -> 手动merge解决冲突 -> 重新commit -> push

第一种方式:

git add + 要提交的文件名
git commit:在vim中添加TicketNo
git push origin master:将本地仓库的master分支提交到fork的个人项目
在gitlab的本地仓库中新增merge request(MR),点提交的时候如果有冲突执行步骤5,如果没有冲突,则提交成功
git fetch remoteService:查看远程仓库的代码是否有更新
git merge remoteService/master:将远程仓库的代码与本地仓库代码合并,并解决冲突,再执行步骤1,2,3
第二种方式:

git add + 要提交的文件名
git commit:在vim中添加TicketNo
git push origin master:将本地仓库的master分支提交到fork的个人项目
在gitlab的本地仓库中新增merge request(MR),点提交的时候如果有冲突执行步骤5,如果没有冲突,则提交成功
git pull remoteService master // 取回远程仓库的变化,并与本地master分支合并,解决冲突,执行步骤1,2,3
第三种方式:

git fetch remoteService:将远程仓库的代码下载到本地仓库
git merge remoteService/master:将远程仓库的代码与本地仓库代码合并,解决冲突
git add + 要提交的文件名
git commit:在vim中添加TicketNo
git push origin master:将本地仓库的master分支提交到fork的个人项目
在gitlab的本地仓库中新增merge request(MR)

8. 开发错分支

(1)代码未提交时

使用以下命令即可解决。

  1. git add .    (把所有改动暂存)
  2. git stash     (把暂存的文件提交到git的暂存栈)
  3. git checkout 本该提交代码的分支 
  4. git stash pop (将暂存栈中的代码放出来)

(2)代码已提交

  1. git  checkout  不该提交代码提交了代码的分支
  2. git reset HEAD~1  (最近一次提交放回暂存区, 并取消此次提交)
  3. git stash                (把暂存的文件提交到git的暂存栈)
  4. git checkout 应该提交代码的分支
  5. git stash pop
  6. git  checkout  不该提交代码提交了代码的分支 (等你把代码提交到了正确的分支后,再次切到刚刚错的分支)
  7. git push origin 错误的分支 -f  (把不该上去的文件回退掉)

9.重置fork仓库

当我们push到远程仓库后,可能会后悔,所以需要回滚操作。例如,当你在本地修改了代码,push到github上了,但是发现代码有问题,需要撤回操作。
(1)git log:使用 git log 找到历史版本号
(2)git reset --soft <版本号>
使用git reset –-soft <版本号> ,如 git reset --soft asdda123…,重置至指定版本的提交,达到撤销提交的目的.
(3)git push origin 分支名 –-force
执行 git push origin 分支名 –-force ,强制提交当前版本号。

注意,git reset soft 和 git reset hard的区别:

  1. git reset soft只是改变了HEAD的指向,本地代码不会变化,
  2. git reset hard会改变本地源码,不仅仅指向变化了,代码也回到了那个版本时的代码。

 

 

 

 

参考文献:

【1】Git Branch —— 实现多路并行作业

【2】七个你必须重视的 Git 使用技巧

【3】IDEA遇到 git pull 冲突的几种解决方法

【4】git修改/添加/删除远程仓库_阳水平的博客

【5】Git撤销远程仓库的修改(push)_CaptainBuggy的博客

posted @ 2020-08-19 20:48  nxf_rabbit75  阅读(3780)  评论(0编辑  收藏  举报