一、Git简介
1. Git与SVN的主要区别
- Git是分布式仓库,与SVN等中心仓库相比最明显的区别是:
- SVN采用集中式的版本控制,由一个集中管理的服务端保存所有修改历史记录;客户端只需下载出最新或指定提交的文件,不包据完整的历史记录。
2. git的开发模式
- fork 开发模式:Fork 开发模式是一种社交编程,是利用群体的智慧来进行合作编程的一种工作模式,采用派生/合并请求方式,让任何一个开发者都可以方便的向开源项目贡献代码。
- 分支开发模式:分支开发模式是采用直接 clone 源项目中心仓的方式,由新建分支向目标分支发起合并请求提交代码,让任何一个开发者都可以方便的向开源项目贡献代码。这种模式没有代码评审的机制,使得开发者之间的协作与交流变得少而且不顺畅,这样就不能很好的保证中心仓的代码质量。这种模式比较适合几个人的小团队,对于较大的团队,建议使用fork 开发模式。
- Omega 开发模式:集中式的代码仓库管理
二、fork开发模式
1.fork
Fork一个项目时,可以选择项目 Fork 到组织还是个人名下。点击·Fork·按钮后,根据页面弹出窗口提示选择相应组织名还是个人名下即可。
- 主干仓是Public 类型, fork 后的仓库是Public ,fork 仓可以更改类型;Public、Internal、Private;
- 主干仓是Internal 类型,fork 后的仓库是Internal ,fork 仓可以更改类型;Private、Internal;
- 主干仓是Private 类型,fork 后的仓库是Private ,fork 仓不能更改类型;
2.git clone
(1)方式:1:使用 TortoiseGit 进行 clone
- 在本地文件夹空白处右击 -> 选择Git Clone
- 将刚刚copy的git仓地址,添加到URL处,确认无误后点击“OK”进行克隆
(2)方式2:使用 git bash 进行 clone
- 在本地文件夹空白处右击 -> 选择Git Bash Here
- 执行克隆命令:git clone xxxxxx.git
3.本地修改代码、提交代码
本地修改的代码需要提交并push到平台
(1)方式1:使用 TortoiseGit 提交、push代码
- 在本地项目根目录下,右键选择Git Commit -> “masterXX”…
- 在Message栏填写提交信息->勾选需要提交的文件->点击“OK”
- 完成commit之后会出现提示框,点击Push将本次提交推送到远端
(2)方式2:使用 git bash 提交、push代码
- 查看当前代码的修改状态,git status
- 将修改的文件提交到本地暂存区,git add filename或者将所有修改过的工作文件提交暂存区,执行命令:git add .
- 将暂存区的修改文件提交到本地git库中,git commit后输入commit message,或者git commit -m "引号内输入commit message"
- 将提交的修改推送到远端,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 // 从暂存区移除所有没有提交的修改
- 在本地修改与远程代码无冲突的情况下,优先使用:pull->commit->push
- 在本地修改与远程代码有冲突的情况下,优先使用: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)代码未提交时
使用以下命令即可解决。
- git add . (把所有改动暂存)
- git stash (把暂存的文件提交到git的暂存栈)
- git checkout 本该提交代码的分支
- git stash pop (将暂存栈中的代码放出来)
(2)代码已提交
- git checkout 不该提交代码提交了代码的分支
- git reset HEAD~1 (最近一次提交放回暂存区, 并取消此次提交)
- git stash (把暂存的文件提交到git的暂存栈)
- git checkout 应该提交代码的分支
- git stash pop
- git checkout 不该提交代码提交了代码的分支 (等你把代码提交到了正确的分支后,再次切到刚刚错的分支)
- git push origin 错误的分支 -f (把不该上去的文件回退掉)
参考文献: