文章目录
一、基本概念
仓库(Repository)
存放项目代码的地方,可以在文件系统中看到的一个目录。这个目录下有一个.git的子目录,包含了Git的所有元数据和对象数据库。
提交(Commit)
项目的一个快照,它会记录下当时所有跟踪文件的状态。
分支(Branch)
一个独立的工作流,你可以在不影响主线(通常是main或master分支)的情况下进行开发和测试。
合并(Merge)
将一个分支的更改合并到另一个分支上。
冲突(Conflict)
当合并时,两个分支在同一部分代码上有不同的更改,Git无法自动解决。
远程仓库(Remote)
托管在网络或其他位置的版本库,可以有多个(例如,GitHub、GitLab、gitea、gittee等)。
二、使用步骤
1. 配置git
使用Git之前,需要配置用户名和电子邮件地址。
git config --global user.name "名称"
git config --global user.email "邮箱地址"
2. 仓库初始化
创建一个新的Git仓库或将现有目录转换为Git仓库。
git init
3. 克隆仓库
git clone 你的远程仓库地址
只克隆某个分支
git clone -b 分支名称 仓库地址
通过ssh克隆
- 查看是否已经有ssh
cd ~/.ssh //进入ssh配置目录
ls //查看目录下文件
id_rsa 和 id_rsa.pub:默认的 RSA 密钥对。
id_ecdsa 和 id_ecdsa.pub: ECDSA 密钥对。
id_ed25519 和 id_ed25519.pub:Ed25519 密钥对。
- 本地生成ssh(如果需要)
生成 ed25519密钥
ssh-keygen -t ed25519 -C "your_email@example.com"
生成rsa密钥
ssh-keygen -t rsa
在生成的时候,需要输入要保存密钥的文件(根据自己喜好)以及输入密码短语 passphrase (可以为空)
具体操作示例如下:
- 查看已经生成的密钥
默认的密钥保存在id_rsa.pub
文件,但是刚刚我生成的第二个密钥保存在id_rsa_gitee.pub
文件中
cat ~/.ssh/id_rsa_gitee.pub
- 配置密钥到远程仓库(以gitee为例)
配置完成之后,就可以通过ssh与远程建立连接和克隆了
4. 添加文件
将文件更改添加到暂存区
git add * //如果是整个文件夹的内容都提交使用 *代表提交所有
git add 你的文件名 //可以提交单个文件
5.提交更改
将暂存区的更改提交到仓库
git commit -m 你的提交备注
三、其他操作指令
1. 查看状态
查看当前工作目录和暂存区的状态 ~
git status
2. 查看历史
查看提交历史
git log
查看当前代码版本
git log -1
3. 创建分支
创建一个新的分支
git bransh 分支名称
4. 切换分支
切换到指定的分支 并更新工作目录
git switch <branch-name>
# 或
git checkout <branch-name>
如果分支在你最初克隆仓库时不存在,需要现在本地创建对应的分支
git fetch // 同步远程仓库分支列表
git checkout 切换到分支
或
//创建并切换到新的本地分支(该分支跟踪远程分支)
git checkout -b 远程新分支 origin/远程分支
5. 合并分支
将一个分支的更改合并到当前分支
//查看当前分支
git branch -a
//分支合并
git merge 分支名称
还有一种合并分支是 变基合并
会将一个分支的更新重新应用(变基)到另一个分支上。
这种方式可以创造一个更线性、更干净的提交历史
git checkout 要变基的分支
git rebase main //变基
git rebase --continue //变基解决冲突之后 继续变更
6. 撤销更改
撤销工作目录中的更改。
git checkout -- 文件名称
7. 重置
重置当前HEAD到指定状态
git reset --hard 提交的标签
8.本地和远程仓库分支同步
git fetch origin
9.比较本地和远程分支的差异
git log HEAD..origin/<branch_name> --oneline
四、代码拉取 和 推送
git pull
git pull 从远程仓库获取最新的更改并合并到当前分支。
如果是多人合作 或是有多个分支的仓库 使用git pull 会在远程提交记录中 出现一串mergin…的多余提交
可以使用git pull --rebase
的方式实现
git push
代码可以使用git push
推送到远程仓库
vscode插件
如果你使用vscode进行代码开发,也可以通过插件对仓库进行操作
安装插件之后,可以简化代码提交的步骤 commit 就相当于是 git commit -m ‘xxxxx’
五、 保存当前工作进度
团队合作的时候,本地有代码改动,又想要拉取仓库代码;
如果本地的代码已经完成可以先push再pull
但是如果没有完成 可以使用git stash
实现
git stash
可以保存当前工作进度,将修改暂存,让你的工作目录回到上次提交的状态
如果想要应用之前被暂存的更改,可以使用 git stash pop
。
这会将之前暂存的更改应用到当前工作目录,并尝试合并。
git stash //暂存
git stash pop //恢复暂存
如果放弃之前暂存的更改,可以使用 git stash drop
丢弃之前保存的暂存记录。
如果有多个暂存的更改,可以使用 git stash list
查看所有的暂存记录,并使用 git stash drop stash@{<stash_number>}
来指定丢弃特定的暂存记录。
注意 在使用 git stash pop 之后,默认情况下暂存记录会被移除。如果想保留暂存记录,可以使用 git stash apply,这会应用更改但不会移除暂存记录。
仓库分支实践-创建
前提: 远程仓库上有很多分支
目的: 在某个分支的基础上,创建一个新的分支
比如:
想要拉取main分支上的内容,并想在main基础上创建一个新的my/feat分支
- 克隆远程仓库代码
//克隆远程仓库代码
git clone xxx.git
- 切换想要的分支
git branch //查看当前分支
git checkout main //切换到main分支
- 同步远程分支最新代码
git pull origin main
- 在该基础上创建新的分支(my/feat)
git checkout -b my/feat
- 将创建的分支同步到远程仓库
git push --set-upstream origin my/feat
仓库分支实践-拉取
场景:远程新增一个分支,本地分支数量和远程分支不同步
目的:切换本地分支后需要同步最终远程分支,并提交代码
- 切换到需要分支
- 拉取远程最新代码
git checkout feat/store
git pull origin feat/store
- 建立本地分支 feat/store 追踪远程 feat/store
git branch --set-upstream-to=origin/feat/store feat/store
- 如果本地分支落后于远程分支,需要再次
git pull
拉取最新远程代码 - 如果有冲突需要先解决冲突 之后
git push
六、选择性合并分支
场景: 两个远程分支,A分支需要B分支中的某一次的提交
目的:
修复错误:如果你在一个分支上修复了一个错误,并希望将这个修复应用到其他分支上,而不是合并整个分支。
拾取特性:在多分支开发中,某个特性可能首先在一个特定的分支上开发和测试。一旦这个特性稳定,你可能想要将其引入到主分支或其他分支中。
代码审查:在一些工作流程中,开发者可能在个人分支上进行开发和提交,然后通过 cherry-pick 将选定的提交移动到一个集成分支上进行构建和测试。
代码:
git cherry-pick <commit-hash>
选择单条提交
比如:创建了两个分支,其中一个分支做了很多更改,但是担心不稳定影响到主分支。此时主分支需要你的其中一个更改。
-
需要查看需要的提交编码
远程仓库在提交完之后会有一个提交的哈希值 以gitee为例
-
切换到想要更改的分支
比如你的master需要获取到feat分支的某一条记录
//切换到master
git checkout master
git branch //查看当前所在分支
- 执行代码
git cherry-pick b3e1ed
- 为了确保准确性 可以查看一下当前的日志 确认是否是自己需要的
git log
- 没问题就推送
git push
选择多个提交
除了上面说的选择单词也可以一次性应用多个提交,只需要在命令中列出所有提交的哈希值,用空格分隔。
也可以 应用一个范围提交
git cherry-pick <start-commit-hash>^..<end-commit-hash>
上面的^
表示 包含开始的提交
注意
- 冲突:
如果遇到冲突,需要手动解决冲突,然后使用git cherry-pick --continue
来继续应用提交,或者使用git cherry-pick --abort
取消 cherry-pick 操作 - 提交的独立性:
如果被选中的提交依赖于其他未被选中的提交的更改,可能会引入问题。
你需要确保所有相关的依赖也被一并移动,或者准备好解决可能出现的冲突。