随便记录一下git

2 阅读3分钟

移除两个已经commit但是没有push的文件(已经出于staged状态)

git rm fv_cv/rsr/test/unit_test/src/cfg/cle/V3H/rsr_cfg_cle_g3n_Lfm_day_package_dma_bc1k6pl_test.cpp git rm fv_cv/rsr/test/unit_test/src/cfg/cle/V3H/rsr_cfg_cle_g3n_Lfm_night_package_dma_qwo90t_test.cpp git commit --amend --no-edit

image.png image.png image.png

git reset --hard 和 --reset 的区别 git rebase 和 merge 的区别 git cherry -pick HEAD的概念

收到。先给你一个简明的路线:解释 HEAD → 解释 reset soft/hard → 对比 reset vs rebase → 用你当前“两次 commit”的例子说明。

核心概念

HEAD 是什么:Git 里当前“检出点”的指针。 通常指向当前分支的最新提交(如 feature/... 的 tip)。 当你 HEAD~1,表示当前提交的父提交。 reset 是什么:移动分支指针(和 HEAD)到指定提交,并可选择是否修改暂存区/工作区。 git reset --soft :只移动分支指针与 HEAD,工作区与暂存区都保留。 git reset --mixed (默认):移动分支指针与 HEAD,暂存区被清空,工作区保留。 git reset --hard :移动分支指针与 HEAD,暂存区和工作区都回滚(本地改动会丢失)。 rebase 是什么:把一段提交“移到”另一个基底上,或在交互模式下重排/合并/删除提交,保持历史更线性。 reset vs rebase 的区别(直观理解)

reset:直接把分支指针“挪回去”,可以丢弃或保留工作区/暂存区。 rebase:把提交“摘下来再重新贴上去”,可以在过程里 squash、reword、drop。 用你现在的例子说明 你现在有两个连续提交:

A:UT 更新 + 新增两份 test 文件 B:只删除那两份 test 文件(你刚刚提交的) 方式 1:reset --soft HEAD~1 + commit --amend 目的:把 B 的内容并回 A(改成一个提交)

效果:B 消失,所有改动回到暂存区,再“修改 A”。 方式 2:rebase -i HEAD~2 + squash 目的:合并 B 到 A(交互式更直观)

把第二行 pick 改成 s 或 squash,保存退出即可。

方式 3:reset --hard HEAD~1 目的:直接丢掉 B(风险:丢掉 B 的更改)

结果:B 被抹掉,工作区也回滚。 什么时候用哪一个? 你想“保留改动但合并历史”:reset --soft 或 rebase -i。 你只想丢掉 B:reset --hard HEAD~1。 你想保留 B:什么都不做。 小提示(很重要) 这些操作都 重写本地历史,但你说 尚未 push,所以安全。 一旦 push,就不建议对已推送的提交做 reset/rebase(需要 --force,会影响他人)。 如果你告诉我你想要的最终历史形态(保留两个?合并一个?),我可以直接给你“最短命令 + 检查步骤”。

PS C:\repo\fvg3_lfs> git branch

develop_evo feature/FVGIIIECHT-12551-acc-fix-uncomfortable-jerk-when-vcu-override-signal-delayed-2

  • feature/MPCTEXPFB-3107-xp-ut-update release/CNFVE0090_NewLane release/CNFVE0100 PS C:\repo\fvg3_lfs> git checkout release/CNFVE0090_NewLane warning: unable to rmdir 'c_if/mom/daddy': Directory not empty warning: unable to rmdir 'c_if/mom/vfc': Directory not empty warning: unable to rmdir 'tools/swq-utac-tools': Directory not empty Updating files: 100% (76124/76124), done. M c_cv/cfc M c_cv/exposure M c_cv/pdet M c_cv/tofu M c_cv/viper_loft M c_if/rbPdm M dcv/ip_dc M dcv/tools/fv_stub/StubDirector M fv_cv/tools/viz M fv_if/stil M tools/calibsolib Switched to branch 'release/CNFVE0090_NewLane' Your branch is behind 'origin/release/CNFVE0090_NewLane' by 14 commits, and can be fast-forwarded. (use "git pull" to update your local branch)

warning: unable to rmdir 'c_if/mom/daddy': Directory not empty warning: unable to rmdir 'c_if/mom/vfc': Directory not empty warning: unable to rmdir 'tools/swq-utac-tools': Directory not empty 上一个分支中的文件非空并且新分支该目录下的文件是空的 所以切换到本分支的时候被保留

M c_cv/cfc M c_cv/exposure M c_cv/pdet M c_cv/tofu M c_cv/viper_loft M c_if/rbPdm M dcv/ip_dc M dcv/tools/fv_stub/StubDirector M fv_cv/tools/viz M fv_if/stil M tools/calibsolib 这些文件中有本地修改的文件所以切换到新的分支后还是会保留