git的冷知识

git的冷知识

git branch

# 初始化的时候默认没有名字的分支
# gitte提交(默认分支为master)只有你执行了git push origin master之后才会与本地产生联系,本地分支被命名为master分支
# github提交(默认分支为main)
git branch -M main # 将未命名的分支重命名为main分支,与远程默认的origin/main匹配

# 单纯的想改分支名
git branch -M main-back # 当前分支为main-front,执行此git指令,分支改名为main-back

git push

# main默认的远程分支是main
# git push 远程仓库别名 本地分支名:远程分支名
git push origin main # 效果相当与git push origin main:main

git log

# git log 打印的默认是打印当前本地分支对应的远程分支的提交历史
git log # 假设当前是main分支,等价于查看origin/main分支的提交信息,即git log origin/main

# git log 查看指定分支的提交历史
git log upstream/main
# 如果想要查看所有分支的提交历史
git config --global alias.tree 'log --all --graph --decorate --oneline'
git tree # 可以展示所有本地分支和远程跟踪分支的提交历史

git fetch

# git fetch 会把默认的origin仓库的最新代码拉到本地,但是不会与本地代码合并
# 同时git fetch也可以指定仓库,指定拉取的分支
git fetch upstream main # 将upstream远程仓库中的main分支拉取到本地,并且不会产生合并

git diff

# git的diff算法,将本地的记录和远程分支的代码作比较
# 按 Space 键向下翻页,按 b 键回退一页,按 q 键退出分页器
git diff main origin/main # 输出为空则没有差异

git merge

# 快合并,不会产生新的合并历史
git merge origin/main # 假设当前为main分支,把远程的main分支合并到当前分支(--ff) 
# 慢合并,会产生新的提交历史
git merge origin/main --no-ff # 执行后会进入vim模式,书写commmit信息,需要重新提交到origin/main

git pull

git pull origin main 
==> git fetch origin main && git merge origin/main --ff # 快合并

# 一般合并的较好解决方式
git fetch origin main
# 查看本地main和远程main的差异
git diff main origin/main
# 选择合并的方式 --ff,--no-ff
git merge origin/main [options...]
# 再手动解决冲突
vim filename
# 重新提交
git add . && git commit -m "合并冲突" && git push

–no-ff和–ff的区别

img

img

image-20240622211200880

明显–no-ff更加适合commit的回退,使用–ff需要手动回退多次,因为–no-ff生成一个合并的commit提交,

git revert -m [position] 可以选择保留哪边

git rebase

# 类似git merge只是使提交历史更加线性
git fetch origin main
git diff main origin/main
git rebase origin/main
git rebase 前

image-20240622154204336

git rebase 后

image-20240622154355094

可以发现通过rebase本质改变的使origin/main的位置,origin/main在本地分支下游,就算修改了origin/main的位置也能保证提交历史的线性

git merge和git rebase的取舍

git merge 适合于希望保持历史完整性和追踪合并事件的场景。

git rebase 更倾向于维护简洁、线性的提交历史,尤其是在个人工作流或准备提交前的整理阶段。

git merge中–ff和–no-ff的取舍

--ff(fast-forward)追求简洁,直接移动指针,适用于内部开发或无合并冲突的简单情况。

--no-ff强制创建合并提交,明晰历史分界,更适合团队协作和需要明确追踪合并历史的场景。

git revert

# 撤销到某一次commit之前,并生成一次新的commit提交(记录回退操作)
git revert <commit-id> # 不是合并提交
# 合并提交
git show <commit-id> # 查看合并的两个分支的位置,第一个对应position为1,第二个对应position为2
git revert -m <position> <commit-id> # positions

# 最后需要重新提交回退信息
git push
普通提交的撤销

回退到"windows新增4.txt之前",此时当前分支文件只有1.txt,2.txt,3.txt

image-20240622170518165

合并分支的撤销

在这里插入图片描述

此时1.txt内容回退到commit(操作系统windows.上的1.txt提交)后的内容

git revert <commit> 允许你创建一个新的提交来撤销那个引入问题的提交中的所有更改,而不会影响其他提交。这样既修复了问题,又保持了提交历史的清晰和完整,展现了问题是如何被解决的,这对于团队协作和后期的代码审查、问题追踪非常有帮助。

git reset

# 回退到指定版本
git reset [--soft | --mixed | --hard] [HEAD]

# --mixed(默认)
git reset --mixed [HEAD] # 不会暂存到本地,需要手动add和commit

# --soft
git reset --soft [HEAD] # 会暂存到本地,不需要手动add和commit

# --hard(危险操作)
git reset --soft [HEAD] # 会暂存到本地,清空HEAD之后的所有commit记录
–mixed

image-20240622181709378

image-20240622181752213

–soft

image-20240622182035541

–hard

image-20240622190945940

与–soft区别就是暂存区的文件也会回退,4.txt已经访问不到了

git reflog(备份神器)

# 假如你执行了以下命令
git reset <commit-id> --hard && git push -f

# git reflog可以查看本地的head变化的历史
# 只要 HEAD 发生变化,就可以通过 reflog 查看到
git reset <commit-id> --soft && git push -f # 就能回退到之前强制推送前远程仓库的状态
# 一般这个commit-id使第二个(HEAD{1}),因为在上面指令reset时HEAD指向改变了,所以是第二个
# HEAD{n},n代表偏移量

image-20240622191703199

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值