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.name"your name"#邮箱gitconfig--globaluser.email"email@example.com"#显示颜色gitconfig--globalcolor.uitrue初始化
mkdirprojectcdprojectgitinit#创建全新的仓库,在当前目录初始化创建仓库gitclone'https://github.com/kwonganding/KWebNote.git'# 克隆远程仓库添加文件,提交,查看当前仓库状态
gitaddmy.java#git add -f my.java f为强制添加gitadd<dir>添加指定目录到暂存区,包括子目录gitadd<file>添加指定文件到暂存区gitadd.添加当前目录所有文件到暂存区gitrm[file1][file2]... 删除工作区文件,并且将这次删除放入暂存区gitmv[file-original][file-renamed]改名文件,并且将这个改名放入暂存区gitcommit-m"提交备注"gitcommit<file>-m<message>提交暂存区的指定文件到本地仓库gitcommit--amend-m<message>使用一次新的commit,替代上一次的提交gitstatus对比文件改动内容,查看git日志,回退版本到第N个版本前,回退到指定版本
gitdiffmy.javagitloggitreset —soft<commit>#只改变提交点,暂存区和工作目录的内容都不改变gitreset —mixed<commit># 改变提交点,同时改变暂存区的内容gitreset —hard<commit>#暂存区、工作区的内容都会被修改到与提交点完全一致的状态gitreset--hardHEAD# 让工作区回到上次提交时的状态gitreset--hardHEAD~Ngitreset--harde475afc93c209a690c39c13a46716e8fa000c366 (此值不必写全,只要能让git知道是哪个把那本就行,一般写5-6位即可)revert与reset的区别
git revert用一个新提交来消除一个历史提交所做的任何修改
git revert是用一次新的commit来回滚之前的commit,git 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 git@github.com:username/xxx.git创建分支、切换分支
展示分支,切换分支,创建分支,删除分支这四种操作
gitbranch 分支名#新建一个分支,但依然停留在当前分支gitcheckout 分支名# 新版本 git switch 分支名 切换到指定分支,并更新工作区创建分支并切换
gitcheckout-b分支名# 新版本 git switch -c 分支名 新建一个分支,并切换到该分支gitbranch--track<branch><remote-branch># 新建一个分支,与指定的远程分支建立追踪关系合并分支
gitfetch<remote># merge之前先拉一下远程仓库最新代码gitmerge 其他分支名#合并某分支到当前分支,若存在冲突会提示手动修改后在提交(默认为fast forward模式)gitmerge --no-ff-m"提交备注"其他分支名#禁用fast forward模式gitlog--graph--pretty=oneline --abbrev-commit 命令可以查看分支合并图查看所有分支,删除分支
gitbranch#查看分支gitbranch-a# 远程+本地 远程分支会以红色标出,当前分支前面会标一个*号gitbranch-r#列出所有远程分支gitbranch-d分支名#删除分支gitbranch-D分支名#强行删除分支gitpush origin--delete<branch-name>#删除远程分支rebase与merge的区别
两个分支,test和master,提交如下:
D—E test
/
A—B—C—F master
在master执行git merge test,然后会得到如下结果:
merge操作会生成一个新的节点,之前的提交分开显示,如果你想保留完整的历史记录,并且想要避免重写commit history的风险,你应该选择使用git merge
D--------E
/
A—B—C—F----G test, master
在master执行git rebase test,然后得到如下结果:
rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交,如果你想要一个干净的,没有merge commit的线性历史树,那么你应该选择git rebase
A—B—D—E—C’—F’ test, master
推送到远程库,推送到远程库分支
gitpush-uorigin master# 第一次推送到master分支gitpush<remote><branch>#上传本地指定分支到远程仓库gitpush<remote>--force#强行推送当前分支到远程仓库,即使有冲突gitpush<remote>--all#推送所有分支到远程仓库gitpush origin 分支名#推送到指定分支将本地分支与远程分支关联
gitbranch --set-upstream-to 分支名 origin/分支名关联GitHub的远程库,推送Github
gitremoteaddgithub git@github.com:username/xxxx.gitgitpush github master关联Gitee的远程库,推送Gitee
gitremoteaddgitee git@gitee.com:username/xxxx.gitgitpush gitee master把本地未push的分叉提交历史整理成直线
gitrebash# 在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。克隆、克隆指定分支代码
gitclone https://github.com/username/xxxx.git# 或 git clone git@github.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.unstage'reset HEAD'# git reset HEAD file => git unstagegitconfig--globalalias.lg"log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"# git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit => git lg==================================================================
Git的GUI工具
TortoiseGit
小乌龟,SVN时代就很流行的代码管理GUI利器,Git是集成到操作系统里的,直接右键文件夹就可以进行Git操作了。
🚫只有Windows版本,支持中文,需要单独下载安装中文语言包。
✔️开源,免费,与文件管理器的良好集成。
✔️内置冲突对比解决工具。
Sourcetree
SourceTree是老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具。
✔️适用于 Windows 和 Mac 系统,内置中文版,自动识别语言。
✔️免费、功能强大,使用简单。
✔️功能丰富,基本操作和高级操作都设计得非常流畅,适合初学者上手,支持Git Flow。
🚫无冲突对比工具,支持配置第三方组件。
GitHub Desktop
Github官方出品的Git管理工具。
GitKraken
GitKraken是一个跨平台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