git实战操作
git实战
*** git实操
git: 分布式版本控制软件
分布式:
装git是装在自己电脑上的, 而需要推代码到中心仓库则需要在中心仓库的物理机上搭建git服务器, 例如github/gitlab等
l git init # 生成git仓库(.git隐藏文件), 让git管理当前文件夹
l git status # 检测当前本地文件夹中所有的文件状态
l git add xxx # 将工作区的xxx文件加到git暂存区, git add . 则是将当前文件夹下的所有文件添加到git暂存区
l git commit -m "版本描述信息" # 把缓存中的文件加入到本地版本库, 生成本地版本, 本地可commit多次生成多个版本, git push推到远程仓库时都会一并推上去(推上去的就是git log可以看到的)
# 个人信息配置: 用户名, 邮箱. [配置一次即可]
l git config --global user.email "xxx@qq.com"
l git config --global user.name "Your name"
l git log # 查看本地当前的历史版本
git log --graph # 将提交版本及分支以图形化界面的方式展示出来
git log --graph --pretty=format:"%h %s" # 以简洁的方式图形化展示提交的版本及分支
l git reflog # 查看本地所有的历史版本, 包括reset之后消失的版本
l git reset --hard 版本号 # 切换到指定的版本(方便回滚代码)
l git remote add origin https://gitee.com/mottled_years/kaadas_ate_center.git -> 将远程仓库地址设置为推送地址, 并起别名为origin
l git push -u origin master:master # 推送本地版本到远程仓库, origin是远程仓库的别名, 就是上面git remote add添加的这个别名, -u可加可不加(第一次需要加, 指定默认向origin这个仓库提交), master:master冒号前后两个分支是一样的可简写为单个分支名, 例如master, 甚至可以不写(默认将本地master推到远程master), 若是master:dev则不能简写, 意为将本地的master分支推送到远程dev分支
l git clone 远程仓库地址 # 将远程仓库克隆到本地(包含所有分支都会克隆), 并且内部已实现git remote add这个命令, 即不用再次配置远程仓库. 虽然git branch看不见别的分支, 但可以使用git checkout直接切换
l git pull origin dev # 从origin远程仓库拉取dev更新本地的dev代码, 如果直接用git pull则是拉取更新所有分支, git pull origin dev 等价于 git fetch origin dev 和 git merge origin/dev两条命令(为什么是origin/dev这样写呢, 因为从远程仓库拉取下来的dev分支会默认改名为origin/dev, 所以要合并就需要用origin/dev这样来合并)
l git branch 分支名 # 创建分支, 默认从当前分支创建一个分支, 初始代码与当前分支一致
l git checkout 分支名 # 切换分支
l git checkout -b 分支名 # 上面两句合并缩写
l git merge 分支名 # 将xxx分支合并回master分支
l git branch --delete 分支名 # 删除xxx分支, --delete也可以改为 -d
l git tag -a V1.0.1 -m "第1.0.1版" # 给当前版本设置标签, 设置好标签后也需要git push origin --tags # 将标签提交到远程仓库, 后续可以使用tags进行版本查看和版本切换
其中git add, git commit, git reset HEAD, git checkout后面都是加具体文件名或者.通配符
备注: git reset --hard 版本号 回滚之前一定要先git add, commit生成本地版本后再回滚, 否则本地最近做的修改就找不回了
线上bug修复
git branch 分支名 # 创建分支
git checkout 分支名 # 切换分支
git checkout -b 分支名 # 上面两句合并缩写
做完修复bug和开发功能的步骤后都是要git add以及commit生成本地版本的, 否则切换版本会报错:
$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
t1.txt
Please commit your changes or stash them before you switch branches.
Aborting
bug修复完成并生成版本后, 切换回master分支(注意一定要回master分支才能把别的分支合并到master分支), 然后merge合并, 合并后bug分支没用了可以删除
git merge 分支名 # 将xxx分支合并回master分支
git branch --delete 分支名 # 删除xxx分支, --delete也可以改为 -d
// 操作实例
从master创建了一个dev分支, 同时从master创建了一个bug分支, dev分支开发了一个新功能, bug分支修复了一个以前代码的bug, 当bug分支合并到master分支修复bug后, 现在dev分支开发完功能也要合并到master分支了, 则dev合入master时可能出现两种情况:
1 提示如下报错(关键字CONFLICT), 并直接在代码中以<<<<<<HEAD ======= >>>>>>dev报错提醒你需要手动合并代码冲突(注意手动合并代码冲突并不是一定按照删前半部分留后半部分或者删后半部分留前半部分这样来操作, 要按实际情况决定保留什么, 有可能只保留前半部分中的一部分代码这样), 手动合并冲突之后记住还要add, commit生成新的版本
Auto-merging t1.txt
CONFLICT (content): Merge conflict in t1.txt
Automatic merge failed; fix conflicts and then commit the result.
2 用以下提示询问你是否要合并, 同意后会让两个分支改动的代码共存(不会报错)
dev# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
遇到1就手动修改, 例如保留以前修复bug的代码以及保留新开发的功能
遇到2就像vim编辑文件保存一样ESC -> :wq 即可
项目上线
本地将dev开发的功能合并到master, 然后将master推到线上即可
git注意事项
l 本地写完代码一定要先commit, 解决冲突后一定要add, commit
l 要写代码之前先git pull拉取更新代码
l 在其他地方拉取远程仓库的代码, 需要注意dev分支和master分支代码是不是一致的, 若不一致, 则需要在本地切换到dev分支, 然后将master分支代码合并到dev, 也可以删除dev分支, 再创建dev分支. 例如场景: 线上的代码dev已合并到master, 拉取下来的dev是没合并到master前的版本, 所以需要用master合并到dev来更新一下dev分支
git rebase应用场景
场景1: 合并提交记录
git rebase # 合并提交记录, 让提交记录保持整洁, 例如在一个分支上提交了多次本地版本, 想让多个本地版本变成一个版本, 就可以用rebase
# 用法:
git rebase -i 以前的版本号 # 从以前的版本号开始到当前版本号, 将这些版本作为一个整体合并记录
git rebase -i HEAD~3 # 从当前版本开始数起, 作为第1个, 数3个进行合并
使用之后会弹出一个编辑界面, 然后需要我们从第二行开始把后面的所有pick改为s(将此版本合并到上一个版本去, 为什么用s, 下方也有提示)
pick 版本号1 版本描述1
pick 版本号2 版本描述2
pick 版本号2 版本描述2
...
命令提示 ...
# 这个编辑提交后还会再弹出一个编辑界面, 这个界面需要我们把几个版本描述信息进行合并, 例如合并后可以写成 版本描述1 & 版本描述2 & 版本描述3
场景2: 将分支放到主干中去(消去分支)
例如:
目前在master分支和dev分支各提交了几次版本, 然后将dev分支合并到maste分支, 这里就产生了一个梯形的分支, 现在就可以用rebase将梯形的分支挪到主干中去消除分支.
命令:
git merge dev # 将dev分支合并到master, 后面就可以使用rebase消除分支了
git checkout dev
git rebase master # 将dev分支合入到master
git checkout master
git merge dev # 完成分支合入
场景3: 本地commit后没有push到远程, 拉取远程代码下来形成冲突和分叉, rebase可以消除这个分叉
命令:
将git pull origin dev改为git fetch origin dev 和 git rebase origin/dev就不会形成分叉
注意事项
git rebase后出现冲突时需要解决冲突, 解决冲突后再使用git add . 和 git rebase --continue继续rebase操作
Beyond Compare(方便解决git冲突的软件)
l git config --local merge.tool bc3 # 配置Beyond Compare关联git
l git config --local mergetool.path '/usr/local/bin/bcomp' # 配置Beyond Compare工具的安装路径
l git config --local mergetool.keepBackup false # 合并冲突后不生成备份文件
l git mergetool # 发生冲突时使用这个启动合并冲突的工具
git版本控制底层
git每个版本只保留与之前版本不同的部分而不是保留所有内容, 与之前版本相同的内容会用指针直接指向以前版本的内容
git图形化界面
gitk # 查看所有的提交改动记录
git gui # 查看所有的未提交的改动记录
git协同开发流程(git flow)
github创建组织
+号 -> New organization -> 可以先不邀请成员 -> 然后在组织中创建仓库Create a new repository -> 在组织中邀请成员, 点击invite someone进行邀请 -> 邀请进组织后, 对组织中的各个项目默认只有读权限, 还要在仓库中邀请这个成员, 才有提交权限 -> 点击具体项目 -> Settings -> Collaborators & teams -> Collaborators 添加成员 -> AddCollaborator
git代码review(审查)
# 创建分支合并review
Settings -> Branches -> Add rule -> 填写需要review的分支 -> 勾选Require pull request review before merging -> 选择需要几个人去review, 意为谁需要将代码合并到dev都需要经过review, 同样的, review步骤在dev合并到master的时候也会进行
# 提交合并申请review
例如本地开发完dev分支后提交到远程仓库, 打开远程仓库 -> New pull request -> 选择A <- B, 这里就是B需要合并到A分支 -> 填写合并描述标题, 填写描述内容 -> Create pull request
# 代码review(审查)
Pull requests -> 点击合并请求 -> Review required, 选择Add your review -> 看完一个文件的代码更改后勾选Viewed表示这个文件审查完毕 -> 所有文件审查完毕后切回Conversation -> Merge pull request -> 勾选Use your administrator privilege to merge this pull request -> Confire merge -> 合并之后可选Delete branch删除分支(删除的就是申请合并到dev的那个分支)
# 注意事项: 代码review必须使用网页上的pull request提交合并申请, 代码测试可以用pull request, 也可以本地切到master然后merge release
给开源项目贡献代码
1 fork源代码, 在原代码仓库点击fork拷贝到自己的仓库
2 克隆自己仓库中的代码到本地修改提交
3 给源代码作者提交修复bug的申请(也就是pull request)
git配置文件
# 以下修改配置的命令都可以找到对应的配置文件直接修改效果相同
1 项目配置文件 ./.git/config
git config --local user.email "xxx@qq.com"
git config --local user.name "Your name"
2 全局配置文件 ~/.gitconfig
git config --global user.email "xxx@qq.com"
git config --global user.name "Your name"
3 系统配置文件 /etc/.gitconfig
git config --system user.email "xxx@qq.com"
git config --system user.name "Your name"
# 需要root权限
# 应用场景(指定--local就是默认添加在本地配置文件中, --global同理)
1 配置用户名和邮箱
2 配置Beyond Compare
3 配置远程仓库地址
git remote add origin 地址 # 默认添加在本地配置文件中(--local)
git免密登录
# 有三种方式, 设置后可以在push/pull的时候不用输入用户名密码
1 URL中体现
原来的地址: https://gitee.com/mottled_years/ichat.git
现在的地址: https://用户名:密码@gitee.com/mottled_years/ichat.git
使用git remote add origin将附带用户名密码的地址设置为远程仓库地址
2 SSH实现
1) 生成公钥和私钥(默认放在~/.ssh目录下, id_rsa.pub公钥, id_rsa私钥), 执行如下命令
ssh-keygen
2) 拷贝公钥的内容, 并设置到github中
3) 在git本地配置ssh地址: git remote add origin, 后面就可以直接推拉代码了
3 git自动管理凭证
当本地输入一次用户名密码后, git会根据不同系统, 自动将用户名密码存放起来, 后面就不用重复输入了. Xshell连接的远程服务器好像不行
.gitignore忽略文件
让git不再管理当前目录下的某些文件
*.h # *表示通配符, 表示以.h结尾的文件都忽略
!a.h # !表示不忽略某文件, 这里就是不忽略a.h
/files/ # 前面加/代表以根目录下开始, 后面加/代表忽略files文件夹下的所有文件
*.py[c|a|d] # []内的字符串表示通配符, 即忽略.pyc/.pya/.pyd文件
# 具体.gitignore文件参考github上搜索gitignore找到第一个项目, 里面有各种代码的忽略文件模板, 可以拿过来用, 参考 https://github.com/github/gitignore
# 注意: .gitignore中不能忽略带中文路径的文件
github任务管理相关
1 issues # 文档及任务管理
打开线上仓库 -> issue -> New issue -> 填写issue标题和描述 -> 可设置Assignees指派某人查看 -> 设置Labels, 对issue等级进行描述, 是bug还是文档还是其他
2 Wiki # 项目相关文档说明
-> Wiki -> Create the first page -> 填写相关内容 -> Save Page
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构