1. revert
revert以新增一个 commit 的方式还原某一个 commit 的修改。这是一个安全的方法,因为它不会重写提交历史。
1 | git revert <commit-id> |
1 | * d38ece4 - add 1 (25 minutes ago) <liuwei> |
如果为了commit干净, 可以使用reset --hard + push -f
(除非你知道你在干什么)
2. rebase
合并分支时候, merge 更安全, 保留的信息更多, 但是树结构会交错。rebase 会保证整个提交树特别整齐。
在你运行 git rebase 之前,一定要问问你自己「有没有别人正在这个分支上工作?」。如果答案是肯定的,那么把你的爪子放回去。
2.1 rebase介绍
rebase 算是git的一个黑魔法, 如果不会rebase, 别说会用git。
移步: https://www.liuvv.com/p/b1718ace.html
2.2 git pull –rebase
当你在本地端的master分支开发时,你commit了一个小改变。同时其他人将他本周的修改推上了远地master分支。当你试着推上你的commit时,git会要求你先做git pull的动作。
当你下了git pull时,git会帮你产生一个Merge remtoe-tracking branch ‘origin/master’
的 commit。
虽然这没什么大不了的,但是这让log看起来有点混乱了。这个例子可以使用git pull --rebase
。
这会先强制git抓取(pull)远地的修改,然后再重新接上(re-apply[rebase])你尚未推到远地端的commit,并且推上你的commit。这样一来git自动产生的Merge remote-tracking的log就不会出现了。
3. 魔法命令
3.1 实用操作
移步: https://www.liuvv.com/p/42eae4e7.html
3.2 cherry-pick
移步: https://www.liuvv.com/p/6aa4bbd5.html
3.3 blame
查看某段代码是谁写的, blame 的意思为‘责怪’,你懂的。
1 | git blame <file-name> |
3.4 reflog(救命大招)
当骚操作出现问题的时候, 例如 reset, merge, rebase 中断了, 如果你找不到commit hash, 会不会奔溃?
每次更新了 HEAD 的 git 命令比如 commint、amend、cherry-pick、reset、revert 等都会被记录下来(不限分支),就像 shell 的 history 一样。 可以通过reflog查看。
1 | git reflog |
3.5 stash
1 | git stash list # 显示列表 |
4. 具体case
4.1 清理历史commit
1 | #1. Checkout |
提交到github后,可以把本地项目删除,重新拉取。这样.git文件夹也会缩小啦。
4.2 统计代码量
1 | git log --author="liuwei" --since=2023-10-25 --until=2023-10-31 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' - |