写在前言
1、 强烈推荐观看廖雪峰老师的git教程,本文档结合此教程和自己的经验编辑而成,若有不足的地方欢迎评论和指出
2、文档篇幅较长,比较详细啰嗦。最后部分有常用命令总结,可以直接跳过看最后七.1。
3、推荐大家多用命令行操作git:1、操作速度比可视化软件快,2、有些操作系统或者编辑器的控制台只能命令行操作,3、代码有冲突的时候,解决不了冲突是不能提交的(除非你强制提交)
4、请忽略排版
5、git概念,强烈推荐记住此图
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
一、git安装
1、Linux
sudo apt-get install git
2、Window
Git官网下载 下载链接
3、Mac
直接从AppStore安装Xcode,运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就完成安装。
4、安装成功
如果提示如下 说明安装完成,鼠标右键如果有Git Bash Here 说明安装完成
二、Git设置
用户名和email地址
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
1、拉取远程仓库代码
1.1、打开远程仓库链接并复制远程仓库地址
2.2、clone代码。打开Git Bash Here并输入:
$ git clone https://gitee.com/dengqirui/git-test.git
2.3、这个时候会新建一个文件,文件名就是远程仓库的名字。
刚clone下来的代码默认是master分支,往往开发的是dev或者其他分支。
2.4、拉取指定分支代码。
刚clone下来的代码默认是master分支,往往开发的是dev或者其他分支。
$ git checkout -b [branchName] origin/[branchName]
$ git pull
注:新建本地分支branchName并拉取远程branchName,并切换branchName分支。这里分支名branchName一定要和远程分支branchName名字一样
三、版本管理
1、提交文件
1.1、显示有变更的文件
$ git add status
注:有改动的文件但未提交到暂存区的 都会用红色表示
1.2、将改动文件从工作区提交到暂存区
$ git add [flieName]
注:提交到缓存区的文件会用绿色表示
提交全部文件到缓存区
$ git add .
1.3、将缓存区的文件提交到仓库区(本地仓库)
$ git commit -m "这里是提交时候的描述文字"
注:每次提交都会生成一个版本号,可以理解为游戏存档。以后能回退到指定版本。
提交描述文字的时候最好好好写:1、方便回滚版本,2、方便别人查看你提交的是什么内容。
1.4、将仓库区的代码提交到远程仓库
$ git push
注:第一次提交的时候,会提示你输入远程账号和密码
2、版本回退
2.1、文件回退
$ git checkout [fileName] // 将缓存区指定文件回滚到工作区
$ git checkout . // 将缓存区所有文件回滚到工作区
注:回滚版本前,推荐 git log 查看版本日志
2.2、版本回退
$ git reset --hard // 回滚到上一个版本
$ git reset --hard [commitID] // 回滚到指定版本
注:回退版本其实就是将工作区HEAD(指针)指向指定的版本
四、远程仓库管理
1、新建远程仓库
1.1、clone远程仓库代码(略,查看 三.2)
1.2、如果本地已经建立了仓库,想直接吧本地仓库提交到远程仓库
$ git remote add origin git@https://gitee.com/dengqirui/git-test.git
推送代码
$ git push -u origin master
注:
把本地库当前master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,把本地的master分支和远程的master分支关联起来,方便以后的推送或者拉取。
五、分支管理
1、新建分支
1.1、新建分支并切换到新建的分支
$ git checkout -b [branchName]
1.2、新建分支,但依旧保留在原来的分支上
注:基于当前版本新建的分支,所以新建后代码未变
2、查看分支
$ git branch // 查看本地所有分支
$ git branch -r // 查看远程所有分支
$ git branch -a // 查看本地和远程所有分支
注:白色表示本地分支。 红色表示远程分支
3、合并分支
$ git merge [branchName] // 将[branchName]分支合并到自己当前分支
注:合并分支的时候可能出现如下情况,这是因为merge的时候没有填写commit,所以这是提示你填写commit信息,如果不想填,可以按ESC 退出编辑模式,然后 :wq 强制保持并退出编辑模式
注:‘master-branch-flie’这个文件没有了,是因为在dev分支上,我将‘master-branch-flie’文件重命名为’dev-branch-flie’
4、解决冲突
这个时候只需要处理冲突就好:自己处理冲突代码,删除不要的代码然后重新提交就可以了。(演示部分我选择的是保留本地当前分支的冲突代码,删除远程分支的冲突代码)
5、分支管理策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
七、总结
1、分支操作常用命令(红色部分 朗诵并背诵)
$ git i // 初始化git$ git clone [url] // 克隆/下载远程代码$ git config --global user.name [yourName] // 设置提交代码时用户名$ git config --global user.email [yourEmail] // 设置提交代码时用户邮箱$ git add [fileName1] [fileName2] // 添加指定文件到暂存区$ git add . // 添加所有修改文件到暂存区$ git rm [fileName1] [fileName2] // 删除工作区文件,并且将这次删除放入暂存区$ git commit -m’[message]’ // 提交暂存区到仓库区$ git commit [fileName1] [fileName2] -m’[message]’ // 提交暂存区指定文件到仓库区$ git commit --amend -m’[message]’ // 改写上一次commit的提交信息$ git branch // 列出所有本地分支$ git branch -r // 列出所有远程分支$ git branch -a // 列出所有本地和远程分支$ git branch [branchName] // 新建一个分支,但依旧停留在当前分支$ git checkout -b [branchName] // 新建一个分支,并切换到该分支$ git branch [branchName] [commitID] // 新建一个分支,指向指定commit$ git branch --track [branch] [remoteBranch] // 新建一个分支,与指定的远程分支建立追踪关系$ git checkout [branchName] // 切换指定分支$ git checkout - // 切换上一个分支$ git branch --set-upstream [branchNam] [remoteBranch] // 建立追踪关系,在现有分支与指定的远程分支之间$ git merge [branchName] // 合并指定分支到当前分支$ git cherry-pick [commitID] // 选择一个commit,合并到当前分支$ git branch -d [branchName] // 删除本地分支$ git branch -D [branchName] // 强制删除本地分支 慎用$ git push origin --delete [branchName] // 删除远程分支 慎用$ git log // 查看日志$ git reflog // 显示当前分支的最近几次提交 (简版查看日志)$ git log --stat // 显示commit历史,以及每次commit发生变更的文件$ git shortlog --sn // 显示所有提交过的用户,按照提交次数排序$ git status // 显示有变更的文件$ git log --follow [fileName] // 显示某个文件的版本历史,包括文件改名$ git log -p [fileName] // 显示指定文件相关的每一次diff$ git log --graph --pretty=oneline --abbrev-commit // 显示分支合并提交的详情$ git blame [fileName] // 显示指定文件是什么人在什么时间修改过$ git diff // 显示暂存区和工作区的差异$ git pull origin [branch] // 取回远程仓库的变化,并与本地分支合并$ git push origin --force // 强行推送当前分支到远程仓库,即使有冲突 慎用$ git push origin --all // 推送所有分支到远程长裤$ git checkout [fileName] // 恢复暂存区的指定文件到工作区$ git checkout [commitID] [fileName] // 恢复某个commit的指定文件到暂存区和工作区$ git checkout . // 恢复暂存区的所有文件到工作区$ git reset [fileName] // 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变$ git reset --hard // 重置暂存区与工作区,与上一次commit保持一致(回滚代码到上一个版本)$ git reset [commit] // 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变$ git reset --hard [commit] // 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致。(回滚代码到指定版本)$ git stash // 暂时将未提交的变化移除,稍后再移入$ git rm // 从版本库中删除该文件$ clear // 清除控制台
2、其他
2.1、 本操作以gitee为仓库,为了方便大家测试,建立了一个测试仓库gitTest
2.2、 git操作的时候 tab键有关键词自动补充,后期熟练后推荐不要使用,尽量自己记下来,因为有些控制台面板git操作的时候不会有关键词自动补充
2.4、 推荐大家写代码时,写到关键地方及时commit,方便回滚
2.5、 修改bug的时候新建新分支修改,修改完成后合并到主分支。Bug分支处理链接
2.6、 如果想深入了解git版本管理,推荐大家百度一下git的HEAD相关知识
2.7、 本文档后续会持续更新
--------------------------------------2021.12.05-----------------------------------------