git操作进阶

1,019 阅读4分钟

git 实用性操作

git 文档: Pro Git

基本概念:

git会维护自己的一个数据库,每次提交都是整个仓库代码的快照,只是没有改动的文件会指向历史中相同的内容。

原则:

提交规范准确,推送前要慎重,确保自己的提交是正确无误的。禁止修改已经推送的提交。进行合并变基等操作前保证工作区干净。每次提交具有逻辑。

术语:

HEAD: 指的是本地当前分支。  命令行中可以使用@代替

合并

经常进行小的合并,不要等到最后来一次大规模合并。

合并时借助vocede的冲突解决编辑器。

l --ours  --theirs

git checkout --ours <file_path>

在合并过程中,可以指定某些文件使用其中一个分支的内容

l Rerere

跨分支保留相同的冲突处理,rerere会保存冲突解决方案,每次合并不需要重复处理已经处理过的冲突。

需要开启配置

git config --global rerere.enabled true

退出合并:

git merge --abort

变基(禁止操作已推送的提交)

提取一个分支的更改,放到另一个分支上,使提交历史更整洁,是一条直线的形式,合并是有分支的形式。

l 基础变基举例:将feature_a的提交放到dev

git switch dev

git rebase feature_a

l 筛选在B分支不在A分支的提交,(B是基于A拉取的分支)合并到主分支

git rebase --onto main branchA branchB (筛选出只在B分支的提交,改变B的提交历史)

git merge branchB   / git rebase branchB

git rebase main branchA (后续合并A分支的代码,同样先排除已经在main分支的提交)

git merge branchB   / git rebase branchB

最后可以删除分支A和分支B

l 退出变基

git rebase --abort

重点注意: 不要对别人已经引用的提交执行变基操作,因为变基的本质是丢弃之前的提交,并创建相似但有差异的新提交。如果修改其他人已经使用的提交,会引起混乱。

git log 查看提交历史

l git log - 查看最近几条提交

l --since="20240505" 某个时间点之后的提交

l --until="20240101" 某个时间点之前的提交

l --author 提交人

l --grep 查询提交信息中包含特定字符串的提交 

l  查看特定字符串第一次出现和删除的提交

git log -S "domoFn"

查找demoFn在项目中什么时候出现或者删除的提交

l 查看特定行数范围或者函数名的变更历史

git log -L 1,20:src/a.vue

git log -L demoFn():a.vue

l --no-merges 排除合并提交 

l 自定义格式 git log --pretty=format:"%h - %an, %ar : %s"

     以上条件可同时设置

对比差异 git diff

l 对比两个分支不同 git diff branch1 branch2

l 对比两个分支的同一个文件 git diff branch1 branch2 -- path/to/file

l 对比当前代码与特定提交  git diff commit-hash

l --name-only 只显示有差异的文件名

查找不同分支间的历史提交

l 查找存在A分支不在B分支的提交

git log main..dev 查看在dev上不在main的提交

同等于 git log dev --not main

同等于  git log dev ^main

l 查找在A,B上不在C上的提交

git log A B --not C 

同等于 git log A B ^C

l 查找在A或者B,但不同时存在于AB的提交

         git log --left-right  A...B  

Bisecting

查找bug,找到未出现bug的提交,git会使用二分法辅助确定bug出现的提交。

git reflog 

查看本地保存的提交历史,每次git操作都会在本地记录一条reflog,并保留几个月

git show HEAD@{5}  查看倒数第5条的记录

git show dev@{2024-05-23} 查看某个时间dev分支位于哪个提交

其他

储藏当前更改

快速切换回刚才的分支

git switch -

重置提交

对于本地提交

git reset --hard HEAD~

操作符号~ 指前一个提交

遴选多个提交

首先git log --oneline -3 列出需要遴选的多个提交,获取hash

git cherry-pick hash-1 hash-2 hash-3 (顺序为提交时间从早到晚)

对比两个分支差异并应用

git diff branchA..branchB > branch_diff.patch

git apply branch_diff.patch

查看另一个分支的当前文件内容

git show branch:path/to/file

查看当前仓库地址url

git remote -v

启用彩色输出,使命令输出更易读

git config --global color.ui auto