文档汇总
Git使用详细教程 - seven-ahz - 博客园 git的使用
git log 详解_简简单单兔呦-优快云博客_git log git log详解
git restore指令和git restore --staged 的使用_酸菜。的博客-优快云博客_git restore git restore指令和git restore --staged 的使用
Git合并时遇到冲突或错误后取消合并 - 鲁小风lyf - 博客园 git合并的时候出现冲突,取消合并
git clone、git pull和git fetch的用法及区别 - sfornt - 博客园 git clone , git pull ,git fetch 的区别
git stash 用法总结和注意点 - 加个小鸡腿 - 博客园 git stash 的用法 :git stash 不作用于 untracked file (即没有在git 版本控制中的文件,是不能被git stash 存起来的) ,可作用于工作区和暂存区
pycharm配置git--图文教程_coder_oyang的博客-优快云博客_pycharm 配置git pycharm 配置git
git清除__pycache__文件 - xyztank - 博客园 git 清除 __pycache__ 文件
设置公钥
何谓公钥
-
1.很多服务器都是需要认证的,ssh认证是其中的一种。在客户端生成公钥,把生成的公钥添加到服务器,你以后连接服务器就不用每次都输入用户名和密码了。
-
2.很多git服务器都是用ssh认证方式,你需要把你生成的公钥发送给代码仓库管理员,让他给你添加到服务器上,你就可以通过ssh自由地拉取和提交代码了。
生成公钥
-
1.如果通过上面的方式找不到公钥,你就需要先生成公钥了:ssh-keygen
-
2.接着会确认存放公钥的地址,默认就是上面说的路径,直接enter键确认
-
3.接着会要求输入密码和确认密码,如果不想设置密码直接不输入内容 按enter键
设置远程仓库
1. 按照上述步骤设置公钥
2.在github上添加仓库
3.执行: git remote add origin GitHub - tugenhua0707/testgit
# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]
4.执行: git push -u origin master
config配置
git config --global user.name "xxx"
git config --global user.email "xxx" #使用 -- global 参数,表示这台机器上所有的git仓库都使用这个配置
仓库初始化与克隆
命令 | 作用 |
---|---|
git init | 初始化新仓库 |
git clone <url> | 克隆远程仓库 git clone :是一个从无到有的克隆操作,不需要进行 git init 初始化 clone来的 .git文件夹内存放着和远程仓库一模一样的版本库记录 : git clone https://github.com/user/repo.git |
git remote -v | 查看远程仓库地址 |
git remote add origin <url> | 添加远程仓库 |
基础工作流
以readme.txt 为文件名 为例
git add readme.txt #将该文件添加到暂存区里面去
git add . # 添加当前目录下所有修改和新增文件(不含被删除的文件)
git commit -m 'xxxxxx' # 把文件提交到本地仓库,xxxx为提交的注释
git status #查看是否还有文件未add ,或者是未commit,提交文件前 最好查看一下状态
git status -s
(简洁模式)
git diff readme.txt # 查看 readme.txt 修改的内容
查看历史
git log #查看历史记录,显示最近到最远的显示日志,提交的版本号,时间,修改内容
git log --oneline # 每一条历史记录归为一行显示
备注:
git reset --hard
会同时修改 工作区 和 暂存区 的数据cat readme.txt #查看readme.txt 的内容
git reflog #获取到commitid
git restore详解
git restore readme.txt # 意思就是,把readme.txt文件在工作区做的修改全部撤销
备注: Git 旧版本 用 git checkout , 新版本用git restore ,都可以撤销工作区的内容
与
git reset
的区别
操作 作用范围 常用场景 git restore <文件>
仅工作区(未 git add
)快速放弃本地修改 git reset <文件>
仅暂存区(已 git add
)取消暂存但保留工作区修改 git reset --hard
工作区+暂存区+提交历史 彻底回退到某个提交(危险!) rm readme.txt # 删除文件 , 若删除后想恢复则可使用 git restore
git创建新分支/ 切换分支
场景 | 命令 |
---|---|
创建分支 | git branch <分支名> |
切换分支 | git switch <分支名> |
查看所有分支(含远程) | git branch -a |
查看分支 (不含远程) | git branch |
创建并切换分支 | git switch -c <分支名> (推荐) |
基于其他分支创建 | git switch -c <新分支名> <源分支名> |
基于历史提交创建 |
|
快速切换回上一个分支 | git switch - |
git checkout详解
一: 切换分支
切换分支新命令:
git switch main # 切换到 main 分支 git switch -c new-feat # 创建并切换到新分支
二:恢复文件
恢复文件新命令
git restore --source=main -- config.yml # 从 main 分支恢复文件 git restore --staged app.js # 取消暂存 git restore app.js # 丢弃工作区修改
三:分离头指针(Detached HEAD)
切换到某个提交的作用:让 HEAD
指针直接指向某个具体的提交(而不是分支)
常见场景
查看历史代码:
比如你想看某次提交修复了哪些 Bug,直接切换到该提交即可查看当时的完整代码。临时测试旧版本:
如果最新版本有问题,可以切换到之前的稳定提交进行测试。找回被删除的文件:
如果某个文件在之后的提交中被删除了,可以切换到包含它的提交来恢复
git merge详解
1. 基础用法
合并其他分支到当前分支
git switch <目标分支> # 切换到要合并到的分支(如 main) git merge <来源分支> # 将来源分支(如 feature)合并到目标分支示例:
git switch main # 切换到主分支 git merge feature/login # 将 feature/login 的修改合并到 main
2. 合并类型
Git 会根据分支历史自动选择合并策略:
(1)快进合并(Fast-Forward Merge)
条件:来源分支是目标分支的直接后继(无分叉)。
效果:目标分支指针直接移动到来源分支的最新提交,不会生成合并提交。
触发方式(默认启用):
git merge --ff <分支名> # --ff 是默认选项,可省略可视化:
main: A — B — C ↓ feature: D (合并后 main 指向 D)
(2)非快进合并(No-Fast-Forward Merge)
条件:分支历史有分叉(目标分支在来源分支分叉后有新提交)。
效果:生成一个新的合并提交,保留完整历史。
触发方式:
git merge --no-ff <分支名> # 强制生成合并提交可视化:
main: A — B — C — E (合并提交) ↗ feature: D
3. 解决合并冲突
当两个分支修改了同一文件的同一部分时,Git 会标记冲突:
冲突文件示例:
<<<<<<< HEAD 当前分支的代码 ======= 要合并的分支的代码 >>>>>>> feature/login解决步骤:
手动编辑文件,保留需要的代码(删除
<<<<<<<
,=======
,>>>>>>>
标记)。标记冲突已解决:
git add <冲突文件> # 将文件加入暂存区完成合并:
git commit # Git 会自动生成合并提交消息
4. 常用选项
选项 | 作用 |
---|---|
--no-ff | 强制生成合并提交(即使可以快进合并),保留完整历史。 |
--abort | 终止合并,恢复到合并前的状态(适用于冲突无法解决时)。 git merge --abort |
--squash | 将来源分支的所有提交压缩为单个提交,再合并到目标分支。 |
-m "消息" | 为合并提交指定自定义消息(默认是 "Merge branch 'xxx'") |
git删除命令
1. 删除文件
(1)从工作区和暂存区删除(同时物理删除文件)
git rm <文件名> # 删除文件并暂存删除操作 git commit -m "删除文件" # 提交删除
2. 删除分支
(1)删除本地分支
git branch -d <分支名> # 安全删除(仅当分支已合并时允许)
git branch -D <分支名> # 强制删除(未合并的分支也会删除)
(2)删除远程分支
git push origin --delete <远程分支名>
3. 删除未跟踪文件/目录
(1)删除所有未跟踪文件(不包括 .gitignore 中的文件)
git clean -n # 预览将被删除的文件(dry-run) git clean -f # 实际删除文件 git clean -fd # 删除文件和目录
4. 删除提交记录
(1)删除最新提交(保留修改)
git reset --soft HEAD~1 # 撤销提交但保留修改在暂存区 git reset --mixed HEAD~1 # 撤销提交且取消暂存(默认行为) git reset --hard HEAD~1 # 彻底删除提交和修改(谨慎使用!)
git reset详解
模式 | 命令格式 | 影响范围 | 适用场景 |
---|---|---|---|
--soft | git reset --soft <commit> | 仅移动分支指针,保留工作区和暂存区 | 修改提交消息或合并提交 |
--mixed | git reset --mixed <commit> | 移动指针+取消暂存,保留工作区修改 | 默认模式,撤销 git add |
--hard | git reset --hard <commit> | 移动指针+丢弃所有修改(危险!) | 彻底回退到某个版本 |
3. 典型使用场景
场景 1:撤销最近的提交(保留修改)
git reset --soft HEAD~1 # 撤销提交但保留修改在暂存区 git reset HEAD~1 # 等效于 --mixed,修改保留在工作区
效果:
HEAD
指向上一个提交,原提交的修改仍存在,可重新提交
场景 2:彻底回退到某个提交(丢弃所有修改)
git reset --hard a1b2c3d # 强制回退到提交 a1b2c3d(慎用!)
git reset --hard origin/main # 回退到远程分支状态
风险:所有未提交的修改和后续提交都会丢失!
场景 3:取消暂存文件(撤销 git add
)
git reset <文件名> # 从暂存区移除文件(保留工作区修改) git reset . # 取消所有暂存文件
场景 4:修改历史提交(需强制推送)
git reset --hard HEAD~3 # 丢弃最近3个提交 git push origin master --force # 强制覆盖远程分支(协作时谨慎)
git revert 详解
git revert
用于安全撤销某次提交的更改,通过生成一个新的反向提交来抵消原提交的改动,不会重写历史
撤销单次提交
git revert <commit-hash> # 撤销指定提交
示例:
git revert a1b2c3d # 撤销哈希以 a1b2c3d 开头的提交
撤销连续多个提交
git revert <oldest-commit>..<latest-commit> # 左开右闭区间
示例:
git revert HEAD~3..HEAD~1 # 撤销倒数第3到倒数第2个提交(不包含HEAD~3)
git reset 和 git revert 比较
与 git reset
的对比
git revert | git reset |
---|---|
安全:生成新提交,不修改历史 | 危险:直接删除提交,重写历史 |
适合已推送的提交 | 仅限本地未推送的提交 |
保留完整历史记录 | 可能造成团队协作冲突 |
撤销中间提交时更清晰 | 适合撤销最近的连续提交 |
选择建议:
-
需要撤销已推送的提交 →
git revert
-
撤销本地未推送的提交 →
git reset
git reset 适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。 使用: (1) git reset --hard 目标版本号 (2) 使用“git push -f”提交更改: 此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧,所以我们要用“git push -f”强制推上去
git revert 适用场景: git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西 。 使用: (1) git revert -n 版本号 注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要git add 文件名 (2)提交,使用“git commit -m 版本名 (3)使用“git push”推上远程库
git stash 详解
git stash 的使用场景: 存在在master, 你当前在dev分支工作但是还不能上线,结果线上出现了bug,你需要新拉个bugfix分支去修复bug,此时你直接去切换到master分支去,就会让你把工作区的内容先stash起来
git stash #将当前工作区隐藏起来
git stash list # 获取stash 列表
git stash apply # 恢复当前工作区的内容 ,恢复后,stash内容并不删除,你需要使用命令git stash drop来删除
git stash drop # 删除stash内容
git stash pop # 恢复的同时把stash内容也删除了
远程协作
命令 | 作用 |
---|---|
git fetch | 下载远程更新(不合并) git fetch : 更新远程代码到本地仓库 : git fetch 远程主机名 远程分支名 git fetch origin master # 从远程的origin仓库的master分支下载代码到本地的origin master |
git pull | 拉取并合并远程更新 git switch main # 切换到本地 main 分支
git pull origin main # origin 指的是远程仓库的别名, 拉取远程 main 分支并合并 git pull origin master:branchtest #将远程主机origin的master分支拉取过来,与本地的branchtest分支合并 ; 如果将冒号和后面的branchtest去掉,则表示将远程origin仓库的master分支拉取下来与本地当前分支合并 |
git push | 推送本地提交到远程 命令格式 git push <远程仓库名> <本地分支名>:<远程分支名> 简化写法: git push # 推送当前分支到已关联的远程分支 git push origin master # 把本地代码提交到远程仓库,推送时指定推送的分支为master ; 我们现在要推送到其他分支,比如dev分支上,我们使用命令 git push origin dev |
git push -u origin <branch> | 首次推送分支(需设置上游分支) git push -u origin main # -u 设置关联关系,后续可简写 git push |
git push origin --delete <branch> | 删除远程分支 |
git fetch --prune | 同步远程已删除的分支 |
工作流撤销总结
1.在工作区的代码还未add :想要撤销修改,可使用 git restore ,或者 git restore . (撤销全部修改) ; 该操作只改变了工作区
2.工作区的代码add到了暂存区,未commit:
·若用户在工作区又加了新的内容,但是想撤销 可使用 git restore
·若用户add到暂存区的内容有误,想要撤销,可使用 git reset HEAD,该操作只改变暂存区,不改变工作区:
取消单个文件的暂存:
git reset HEAD <文件名> # 传统方式(效果相同) git restore --staged <文件名> # Git 2.23+ 推荐方式取消所有文件的暂存:
git reset HEAD # 传统方式 git restore --staged . # 重置所有已暂存文件备注: git reset 和git reset HEAD 存在细微的差别
3.git commit到了本地仓库,但是未git push到远程仓库:
注意: 彻底丢弃暂存区和工作区的修改
git reset --hard (回到其中你想要的某个版)
或者 git reset --hard HEAD^ (回退到上一个版本)
或者 git reset --hard HEAD~100(回退到前100个版本)
head 和master是什么?
master
是默认分支名称,而 HEAD
是一个动态指针,表示当前工作目录的位置
master: git默认创建的主分支名称
head: 是一个特殊的指针,指向当前所在的提交或者是分支; 它表示我当前的工作目录处于什么状态 (HEAD
本质上是一个指针,它指向当前工作分支的最新提交)
工作区 和 暂存区的区别
工作区: 电脑上看到的目录
版本库:工作区有一个隐藏目录.git ,这个不属于工作区,这是版本库,版本库中存了很多东西,其中最重要的是 stage(暂存区),还有git 为我们自动创建了一个分支master ,以及指向master 的一个指针 HEAD
使用git 提交文件到版本库中有两步:使用git add 把文件添加进去, 使用git commit提交更改 实际上就是把暂存区的所有内容提交到当前分支上
状态对比表
状态 | 含义 | 如何进入该状态 |
---|---|---|
Changes not staged for commit | 文件已修改但未暂存(针对已跟踪文件) | 修改文件后未执行 git add |
Untracked files | 新增文件未被 Git 跟踪 | 创建新文件后未执行 git add |
Changes to be committed | 文件已暂存,等待提交 | 执行 git add 后 |
git 错误汇总
1. git出现Unlink of file 'venv/Scripts/python.exe' failed. Should I try again? : git操作出现Unlink of file '......' failed. Should I try again?问题_进阶的小小白的博客-优快云博客
2. Git 冲突:Your local changes would be overwritten by merge. Commit, stash or revert them to proceed. 解决冲突:Git 冲突:Your local changes would be overwritten by merge. Commit, stash or revert them to proceed._JoshuaJ的专栏-优快云博客
3. Branch 'master' set up to track remote branch 'master' from 'origin'.
的意思
你的本地 master
分支已经设置为跟踪远程仓库 origin
中的 master
分支。这意味着:
-
建立了跟踪关系:你的本地
master
分支现在会“跟踪”远程的master
分支。这样,当你使用git pull
或git push
等命令时,Git 会自动将本地分支与远程分支同步。 -
默认行为:当你运行
git pull
或git push
而不指定分支时,Git 会默认使用你跟踪的远程分支(在这里是origin/master
)
4. Git-命令行-拯救“Your local changes to the following files would be overwritten by checkout”
Git-命令行-拯救“Your local changes to the following files would be overwritten by checkout”_段浅浅的博客-优快云博客