git高阶用法

本文最后更新于:2022年6月6日 下午

rebase

常用功能:

  • 从上游分支获取最新commit信息,并有机的将当前分支和上游分支进行合并
  • 对当前分支的历史commit进行修改,合并,删除等操作

使用场景

  • 你的分支和master冲突
    • 如果你git merge master就会留下一个merge的commit。在这种情况下,我们推荐使用git rebase master,就能不留commit将当前分支和master有机的合并。
  • 之前某次提交,改错了一个变量
    • 如果你修改那个变量然后再提交一个commit,这显然不是最优的。如果能将某次的提交挑出来修改就好了。
    • 当然git提供了这个功能,你可以使用git rebase -i [git-hash| head~n],其中git-hash是你要开始进行rebase的commit的hash,而head~n则是从HEAD向前推n个commit.

stash

主要功能

暂存当前没有提交的更改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
git stash save 保存当前更改
git stash 保存当前更改
git stash pop 推出之前stash的内容更改
git stash apply 推出之前stash的内容更改

git stash save --keep-index 只stash没有被add的内容
git stash save --include-untracked stash还未加入git记录的文件

git stash list --stat 显示stash堆栈
git stash show stash@{0} 显示第x次的更改
git stash show 显示最近一次stash的更改
git stash show --patch 显示最近一次stash的详细更改

git stash save "stash msg"

git stash branch new_brach stash@{0}

使用场景

当做了更改之后没有编辑完,这个时候发现线上有个bug,你需要停下当前分支去修bug,这个时候你可以提一个commit到当前分支,或则使用git stash

filter-branch

主要功能

过滤所有提交记录,进行相应的操作

1
2
3
4
5
6
git filter-branch --tree-filter 'rm -rf .vscode' 删除所有分支的.vscode文件夹
git filter-branch --tree-filter 'rm -f xxx' xxx不存在,不报错
git filter-branch --tree-filter 'rm -rf .vscoe' -- --all(所有分支所有提交)

git filter-branch --index-filter 'git rm --cached --ignore-unmatch password.txt' (只检查password.txt 一个文件)
git filter-branch -f --prune-empty -- --all

使用场景

当发现你错误的将一个不应该提交的文件提交,然后已经过了很久,已经累计了无数次提交。
这个时候就可以使用git filter-branch将所有提交全部过滤一遍删除掉那个不应该提交的文件

cherry-pick

主要功能

从任何分支,抽取提交到当前分支

1
2
3
4
5
6
7
8
9
git cherry-pick git-hash 

git cherry-pick --edit git-hash

pick 多个
git cherry-pick --no-commit git-hash git-hash

git cherry-pick -x git-hash (添加cherry pick from 那个branch)
git cherry-pick --signoff git-hash不修改author

使用场景

当需要将多个分支上的提交合在一个分支合并到master的时候,显然如果这3个分支有关联,一次合并更为合理。
这个时候就可以使用git cherry-pick进行精细化的commit的操作。

todo

☐ submodule
☐ reflog

参考文献


git高阶用法
https://baymax55.github.io/2022/06/02/git/git高阶用法/
作者
baymax55
发布于
2022年6月2日
许可协议