Workspace工作区程序员进行开发改动的地方是你当前看到的也是最新的。平常我们开发就是拷贝远程仓库中的一个分支基于该分支进行开发。在开发过程中就是对工作区的操作。Index / Stage暂存区.git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp…)不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区的状态。暂存区标记了你当前工作区中哪些内容是被git管理的。当你完成某个需求或功能后需要提交到远程仓库那么第一步就是通过git add先提交到暂存区被git管理。Repository仓库区或本地仓库保存了对象被提交 过的各个版本比起工作区和暂存区的内容它要更旧一些git commit后同步index的目录树到本地仓库方便从下一步通过git push同步本地仓库与远程仓库的同步Remote远程仓库远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改因此它可能与本地仓库同步也可能不同步但是它的内容是最旧的配置git#git用户名gitconfig--globaluser.nameyour name#邮箱gitconfig--globaluser.emailemailexample.com#显示颜色gitconfig--globalcolor.uitrue初始化mkdirprojectcdprojectgitinit#创建全新的仓库在当前目录初始化创建仓库gitclonehttps://github.com/kwonganding/KWebNote.git# 克隆远程仓库添加文件提交查看当前仓库状态gitaddmy.java#git add -f my.java f为强制添加gitadddir添加指定目录到暂存区包括子目录gitaddfile添加指定文件到暂存区gitadd.添加当前目录所有文件到暂存区gitrm[file1][file2]... 删除工作区文件并且将这次删除放入暂存区gitmv[file-original][file-renamed]改名文件并且将这个改名放入暂存区gitcommit-m提交备注gitcommitfile-mmessage提交暂存区的指定文件到本地仓库gitcommit--amend-mmessage使用一次新的commit替代上一次的提交gitstatus对比文件改动内容查看git日志回退版本到第N个版本前回退到指定版本gitdiffmy.javagitloggitreset —softcommit#只改变提交点暂存区和工作目录的内容都不改变gitreset —mixedcommit# 改变提交点同时改变暂存区的内容gitreset —hardcommit#暂存区、工作区的内容都会被修改到与提交点完全一致的状态gitreset--hardHEAD# 让工作区回到上次提交时的状态gitreset--hardHEAD~Ngitreset--harde475afc93c209a690c39c13a46716e8fa000c366 此值不必写全只要能让git知道是哪个把那本就行一般写5-6位即可revert与reset的区别git revert用一个新提交来消除一个历史提交所做的任何修改git revert是用一次新的commit来回滚之前的commitgit reset是直接删除指定的commit日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交因此日后合并老的branch时导致这部分改变不会再次出现减少冲突。但是git reset是之间把某些commit在某个branch上删除因而和老的branch再次merge时这些被回滚的commit应该还会被引入产生很多冲突git reset 是把HEAD向后移动了一下而git revert是HEAD继续前进只是新的commit的内容和要revert的内容正好相反能够抵消要被revert的内容撤销修改撤销暂存区的修改gitcheckout -- my.java#撤销到最近一次git add 或 git commit之前的状态gitreset HEAD my.java#撤销暂存区的修改git commit之前删除文件gitrmmy.java#若误删需要git checkout --文件名查看远程仓库关联远程仓库gitremote-vgitremoteaddorigin gitgithub.com:username/xxx.git创建分支、切换分支展示分支切换分支创建分支删除分支这四种操作gitbranch 分支名#新建一个分支但依然停留在当前分支gitcheckout 分支名# 新版本 git switch 分支名 切换到指定分支并更新工作区创建分支并切换gitcheckout-b分支名# 新版本 git switch -c 分支名 新建一个分支并切换到该分支gitbranch--trackbranchremote-branch# 新建一个分支与指定的远程分支建立追踪关系合并分支gitfetchremote# merge之前先拉一下远程仓库最新代码gitmerge 其他分支名#合并某分支到当前分支若存在冲突会提示手动修改后在提交默认为fast forward模式gitmerge --no-ff-m提交备注其他分支名#禁用fast forward模式gitlog--graph--prettyoneline --abbrev-commit 命令可以查看分支合并图查看所有分支删除分支gitbranch#查看分支gitbranch-a# 远程本地 远程分支会以红色标出当前分支前面会标一个*号gitbranch-r#列出所有远程分支gitbranch-d分支名#删除分支gitbranch-D分支名#强行删除分支gitpush origin--deletebranch-name#删除远程分支rebase与merge的区别两个分支,test和master提交如下D—E test/A—B—C—F master在master执行git merge test,然后会得到如下结果merge操作会生成一个新的节点之前的提交分开显示如果你想保留完整的历史记录并且想要避免重写commit history的风险你应该选择使用git mergeD--------E/A—B—C—F----G test, master在master执行git rebase test然后得到如下结果rebase操作不会生成新的节点是将两个分支融合成一个线性的提交如果你想要一个干净的没有merge commit的线性历史树那么你应该选择git rebaseA—B—D—E—C’—F’ test, master推送到远程库推送到远程库分支gitpush-uorigin master# 第一次推送到master分支gitpushremotebranch#上传本地指定分支到远程仓库gitpushremote--force#强行推送当前分支到远程仓库即使有冲突gitpushremote--all#推送所有分支到远程仓库gitpush origin 分支名#推送到指定分支将本地分支与远程分支关联gitbranch --set-upstream-to 分支名 origin/分支名关联GitHub的远程库推送Githubgitremoteaddgithub gitgithub.com:username/xxxx.gitgitpush github master关联Gitee的远程库推送Giteegitremoteaddgitee gitgitee.com:username/xxxx.gitgitpush gitee master把本地未push的分叉提交历史整理成直线gitrebash# 在查看历史提交的变化时更容易因为分叉的提交需要三方对比。克隆、克隆指定分支代码gitclone https://github.com/username/xxxx.git# 或 git clone gitgithub.com:username/xxxx.gitgitclone-b分支名 https://github.com/username/xxxx.git抓取代码gitpull保存工作空间查看保存的工作空间从保存的工作空间恢复删除保存的工作空间gitstashgitstash listgitstash applygitstash apply stash{n}# 若存在多个保存的工作空间n为序号0开始gitstash dropgitstash drop stash{n}#若存在多个保存的工作空间gitstash pop#从保存的工作空间恢复兵删除保存的空间gitstash pop stash{n}#若存在多个保存的工作空间(n为序号0开始)将其他分支上的提交应用到当前分支gitcherry-pick commit的编号打标签gittag v1.0 commit的id#(不加则为之后的commit添加标签)gittag-av1.0-m提交备注commit的id#(不加则为之后的commit添加标签)查看所有标签gittag查看标签信息gitshow v1.0删除本地标签gittag-dv0.1删除远程标签gitpush origin :refs/tags/v1.0推送某个标签到远程gitpush origin v1.0推送全部尚未推送的标签gitpush origin--tags查看.gitignore文件中哪条规则写错了gitcheck-ignore-v文件名设置命令别名gitconfig--globalalias.st status# git status git stgitconfig--globalalias.unstagereset HEAD# git reset HEAD file git unstagegitconfig--globalalias.lglog --color --graph --prettyformat:%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset --abbrev-commit# git log --color --graph --prettyformat:%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset --abbrev-commit git lgGit的GUI工具TortoiseGit小乌龟SVN时代就很流行的代码管理GUI利器Git是集成到操作系统里的直接右键文件夹就可以进行Git操作了。只有Windows版本支持中文需要单独下载安装中文语言包。✔️开源免费与文件管理器的良好集成。✔️内置冲突对比解决工具。SourcetreeSourceTree是老牌的Git GUI管理工具了也号称是最好用的Git GUI工具。✔️适用于 Windows 和 Mac 系统内置中文版自动识别语言。✔️免费、功能强大使用简单。✔️功能丰富基本操作和高级操作都设计得非常流畅适合初学者上手支持Git Flow。无冲突对比工具支持配置第三方组件。GitHub DesktopGithub官方出品的Git管理工具。GitKrakenGitKraken是一个跨平台GUI Git客户端有免费版专业版和企业版这些版本启用了不同的功能。github中克隆一个Python项目到本地工具命令gitclone https://github.com/showmecodett/Langchain-Chatchat.gitcdLangchain-Chatchat# 切换分支gitcheckout-bv0.2.9 tags/v0.2.9# 创建虚拟环境python3.10-mvenv venv# 激活虚拟环境sourcevenv/bin/activate# 升级pip和setuptoolspython3.10-mpipinstall--upgradepip python3.10-mpipinstall00upgrade setuptools# 安装依赖pipinstall-rrequirements_fork.txt# 测试Chroma向量数据库# https://github.com/chroma-core/chroma/tree/0.4.13python3.10 tests/test_chromadb.py# 下载m3e-base,存放在项目的根目录# https://huggingface.co/moka-ai/m3e-base# $ 项目根目录/_models/moka-ai/m3e-base# 测试m3e-basepython3.10 tests/test_embeddings.py# 如果程序最后输出success则安装成功# 复制配置文件,将config_example.py等复制到config.pypython3.10 copy_config_example.py# 填写api key等信息填写.env文件cp.env.template.envvi.env# 测试zhipu apipython3.10 tests/test/fastchat.py# 重置本地知识库python3.10 init_database.py --recreate-vs# 启动服务python3.10 startup.py-a如何提交PR到Github上的开源项目上游仓库github上原有的仓库远程仓库自己github账号上fork上游仓库的仓库本地仓库从自己github账号的远程仓库clone到自己的本地什么样的PR是不会被接收的非紧急的bug修复的PR并直接提交到master的PR仅仅修改Readme.md和配置文件的跟项目组已经开发的内容冲突的dev版本将可能被拒绝所有的PR需要以dev分支为基准master分支仅仅用来发行于紧急bug修复创建分支# 确认是否存在上游的仓库的dev分支因为要求基于dev分支进行开发gitbranch-r# 如果列表中没有看到dev分支需要添加该分支的上游upstream仓库使用如下命令添加上有仓库gitremoteaddupstream https://github.com/chatchat-space/Langchain-Chatchat.git# 拉取上游仓库的最新分支信息gitfetch upstream# 检出dev分支gitcheckout dev# 验证当前的分支是否已经是上游仓库分支的最新内容gitlog# 创建功能分支或修复分支gitcheckout-bfeat-chromadb
Git常用命令和GUI工具
Workspace工作区程序员进行开发改动的地方是你当前看到的也是最新的。平常我们开发就是拷贝远程仓库中的一个分支基于该分支进行开发。在开发过程中就是对工作区的操作。Index / Stage暂存区.git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp…)不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区的状态。暂存区标记了你当前工作区中哪些内容是被git管理的。当你完成某个需求或功能后需要提交到远程仓库那么第一步就是通过git add先提交到暂存区被git管理。Repository仓库区或本地仓库保存了对象被提交 过的各个版本比起工作区和暂存区的内容它要更旧一些git commit后同步index的目录树到本地仓库方便从下一步通过git push同步本地仓库与远程仓库的同步Remote远程仓库远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改因此它可能与本地仓库同步也可能不同步但是它的内容是最旧的配置git#git用户名gitconfig--globaluser.nameyour name#邮箱gitconfig--globaluser.emailemailexample.com#显示颜色gitconfig--globalcolor.uitrue初始化mkdirprojectcdprojectgitinit#创建全新的仓库在当前目录初始化创建仓库gitclonehttps://github.com/kwonganding/KWebNote.git# 克隆远程仓库添加文件提交查看当前仓库状态gitaddmy.java#git add -f my.java f为强制添加gitadddir添加指定目录到暂存区包括子目录gitaddfile添加指定文件到暂存区gitadd.添加当前目录所有文件到暂存区gitrm[file1][file2]... 删除工作区文件并且将这次删除放入暂存区gitmv[file-original][file-renamed]改名文件并且将这个改名放入暂存区gitcommit-m提交备注gitcommitfile-mmessage提交暂存区的指定文件到本地仓库gitcommit--amend-mmessage使用一次新的commit替代上一次的提交gitstatus对比文件改动内容查看git日志回退版本到第N个版本前回退到指定版本gitdiffmy.javagitloggitreset —softcommit#只改变提交点暂存区和工作目录的内容都不改变gitreset —mixedcommit# 改变提交点同时改变暂存区的内容gitreset —hardcommit#暂存区、工作区的内容都会被修改到与提交点完全一致的状态gitreset--hardHEAD# 让工作区回到上次提交时的状态gitreset--hardHEAD~Ngitreset--harde475afc93c209a690c39c13a46716e8fa000c366 此值不必写全只要能让git知道是哪个把那本就行一般写5-6位即可revert与reset的区别git revert用一个新提交来消除一个历史提交所做的任何修改git revert是用一次新的commit来回滚之前的commitgit reset是直接删除指定的commit日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交因此日后合并老的branch时导致这部分改变不会再次出现减少冲突。但是git reset是之间把某些commit在某个branch上删除因而和老的branch再次merge时这些被回滚的commit应该还会被引入产生很多冲突git reset 是把HEAD向后移动了一下而git revert是HEAD继续前进只是新的commit的内容和要revert的内容正好相反能够抵消要被revert的内容撤销修改撤销暂存区的修改gitcheckout -- my.java#撤销到最近一次git add 或 git commit之前的状态gitreset HEAD my.java#撤销暂存区的修改git commit之前删除文件gitrmmy.java#若误删需要git checkout --文件名查看远程仓库关联远程仓库gitremote-vgitremoteaddorigin gitgithub.com:username/xxx.git创建分支、切换分支展示分支切换分支创建分支删除分支这四种操作gitbranch 分支名#新建一个分支但依然停留在当前分支gitcheckout 分支名# 新版本 git switch 分支名 切换到指定分支并更新工作区创建分支并切换gitcheckout-b分支名# 新版本 git switch -c 分支名 新建一个分支并切换到该分支gitbranch--trackbranchremote-branch# 新建一个分支与指定的远程分支建立追踪关系合并分支gitfetchremote# merge之前先拉一下远程仓库最新代码gitmerge 其他分支名#合并某分支到当前分支若存在冲突会提示手动修改后在提交默认为fast forward模式gitmerge --no-ff-m提交备注其他分支名#禁用fast forward模式gitlog--graph--prettyoneline --abbrev-commit 命令可以查看分支合并图查看所有分支删除分支gitbranch#查看分支gitbranch-a# 远程本地 远程分支会以红色标出当前分支前面会标一个*号gitbranch-r#列出所有远程分支gitbranch-d分支名#删除分支gitbranch-D分支名#强行删除分支gitpush origin--deletebranch-name#删除远程分支rebase与merge的区别两个分支,test和master提交如下D—E test/A—B—C—F master在master执行git merge test,然后会得到如下结果merge操作会生成一个新的节点之前的提交分开显示如果你想保留完整的历史记录并且想要避免重写commit history的风险你应该选择使用git mergeD--------E/A—B—C—F----G test, master在master执行git rebase test然后得到如下结果rebase操作不会生成新的节点是将两个分支融合成一个线性的提交如果你想要一个干净的没有merge commit的线性历史树那么你应该选择git rebaseA—B—D—E—C’—F’ test, master推送到远程库推送到远程库分支gitpush-uorigin master# 第一次推送到master分支gitpushremotebranch#上传本地指定分支到远程仓库gitpushremote--force#强行推送当前分支到远程仓库即使有冲突gitpushremote--all#推送所有分支到远程仓库gitpush origin 分支名#推送到指定分支将本地分支与远程分支关联gitbranch --set-upstream-to 分支名 origin/分支名关联GitHub的远程库推送Githubgitremoteaddgithub gitgithub.com:username/xxxx.gitgitpush github master关联Gitee的远程库推送Giteegitremoteaddgitee gitgitee.com:username/xxxx.gitgitpush gitee master把本地未push的分叉提交历史整理成直线gitrebash# 在查看历史提交的变化时更容易因为分叉的提交需要三方对比。克隆、克隆指定分支代码gitclone https://github.com/username/xxxx.git# 或 git clone gitgithub.com:username/xxxx.gitgitclone-b分支名 https://github.com/username/xxxx.git抓取代码gitpull保存工作空间查看保存的工作空间从保存的工作空间恢复删除保存的工作空间gitstashgitstash listgitstash applygitstash apply stash{n}# 若存在多个保存的工作空间n为序号0开始gitstash dropgitstash drop stash{n}#若存在多个保存的工作空间gitstash pop#从保存的工作空间恢复兵删除保存的空间gitstash pop stash{n}#若存在多个保存的工作空间(n为序号0开始)将其他分支上的提交应用到当前分支gitcherry-pick commit的编号打标签gittag v1.0 commit的id#(不加则为之后的commit添加标签)gittag-av1.0-m提交备注commit的id#(不加则为之后的commit添加标签)查看所有标签gittag查看标签信息gitshow v1.0删除本地标签gittag-dv0.1删除远程标签gitpush origin :refs/tags/v1.0推送某个标签到远程gitpush origin v1.0推送全部尚未推送的标签gitpush origin--tags查看.gitignore文件中哪条规则写错了gitcheck-ignore-v文件名设置命令别名gitconfig--globalalias.st status# git status git stgitconfig--globalalias.unstagereset HEAD# git reset HEAD file git unstagegitconfig--globalalias.lglog --color --graph --prettyformat:%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset --abbrev-commit# git log --color --graph --prettyformat:%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset --abbrev-commit git lgGit的GUI工具TortoiseGit小乌龟SVN时代就很流行的代码管理GUI利器Git是集成到操作系统里的直接右键文件夹就可以进行Git操作了。只有Windows版本支持中文需要单独下载安装中文语言包。✔️开源免费与文件管理器的良好集成。✔️内置冲突对比解决工具。SourcetreeSourceTree是老牌的Git GUI管理工具了也号称是最好用的Git GUI工具。✔️适用于 Windows 和 Mac 系统内置中文版自动识别语言。✔️免费、功能强大使用简单。✔️功能丰富基本操作和高级操作都设计得非常流畅适合初学者上手支持Git Flow。无冲突对比工具支持配置第三方组件。GitHub DesktopGithub官方出品的Git管理工具。GitKrakenGitKraken是一个跨平台GUI Git客户端有免费版专业版和企业版这些版本启用了不同的功能。github中克隆一个Python项目到本地工具命令gitclone https://github.com/showmecodett/Langchain-Chatchat.gitcdLangchain-Chatchat# 切换分支gitcheckout-bv0.2.9 tags/v0.2.9# 创建虚拟环境python3.10-mvenv venv# 激活虚拟环境sourcevenv/bin/activate# 升级pip和setuptoolspython3.10-mpipinstall--upgradepip python3.10-mpipinstall00upgrade setuptools# 安装依赖pipinstall-rrequirements_fork.txt# 测试Chroma向量数据库# https://github.com/chroma-core/chroma/tree/0.4.13python3.10 tests/test_chromadb.py# 下载m3e-base,存放在项目的根目录# https://huggingface.co/moka-ai/m3e-base# $ 项目根目录/_models/moka-ai/m3e-base# 测试m3e-basepython3.10 tests/test_embeddings.py# 如果程序最后输出success则安装成功# 复制配置文件,将config_example.py等复制到config.pypython3.10 copy_config_example.py# 填写api key等信息填写.env文件cp.env.template.envvi.env# 测试zhipu apipython3.10 tests/test/fastchat.py# 重置本地知识库python3.10 init_database.py --recreate-vs# 启动服务python3.10 startup.py-a如何提交PR到Github上的开源项目上游仓库github上原有的仓库远程仓库自己github账号上fork上游仓库的仓库本地仓库从自己github账号的远程仓库clone到自己的本地什么样的PR是不会被接收的非紧急的bug修复的PR并直接提交到master的PR仅仅修改Readme.md和配置文件的跟项目组已经开发的内容冲突的dev版本将可能被拒绝所有的PR需要以dev分支为基准master分支仅仅用来发行于紧急bug修复创建分支# 确认是否存在上游的仓库的dev分支因为要求基于dev分支进行开发gitbranch-r# 如果列表中没有看到dev分支需要添加该分支的上游upstream仓库使用如下命令添加上有仓库gitremoteaddupstream https://github.com/chatchat-space/Langchain-Chatchat.git# 拉取上游仓库的最新分支信息gitfetch upstream# 检出dev分支gitcheckout dev# 验证当前的分支是否已经是上游仓库分支的最新内容gitlog# 创建功能分支或修复分支gitcheckout-bfeat-chromadb