Git常用操作
分支管理
查看当前所属分支:
git branch
本地分支改名:
# 当前分支
git branch -m <new_branch_name>
# 非当前分支
git branch -m <old_branch_name> <new_branch_name>
查看git graph图:
git log --graph --decorate --oneline --all
对照分支关系图梳理分支关系,在trunk based的分支模型中非常实用。
切换分支:
git checkout <another-branch>
基于当前分支创建新分支并切换:
git checkout -b <new-branch>
基于某一分支或提交创建新分支并切换:
git checkout -b <new-branch> <existed branch or commit>
暂时将当前工作压栈:
如果当前分支有未完成的工作,切换分支会失败。一种解决办法是线暂时commit,并在提交记录中标记WIP
或者直接用.
这么一个最短记录,其中 WIP 是 work in progress 的缩写。另一种办法是暂时将当前修改压栈,等下次切换回来的时候弹栈就好了。这样做的好处是不会污染提交记录。
# 压栈
git stash
# 出栈
git stash pop
# 查看栈中的记录
git stash list
有时候弹出栈顶的时候,本地代码已经修改过了,会发生冲突。这个时候即使解决完了冲突,栈顶的记录也不会消失,解决办法是手动删除栈内记录:
git stash drop <stash@{id}>
默认是stash@{0}
也就是栈顶。
重新设置当前分支分叉位置,也叫变基:
git rebase <base-branch>
提倡加入 -i
参数,可以同时合并、删除、重新编辑本分支历史提交记录,只需要将每一条提交记录前面的pick修改为对应的squash、drop、edit等即可。
变基的时候,有时候会提示发生冲突,手动解决冲突之后,继续变基操作:
git rebase --continue
有时想要直接忽略掉后续冲突的提交,使用以下命令:
git rebase --skip
有时候并不想忽略冲突提交,误操作了找回被忽略的提交:
# 首先查看操作记录,找到变基之前的最后一次提交
git reflog
# 以此为基础,创建新分支 recovery 用于重新解决冲突
git checkout -b recovery <commit-id>
... 解决冲突并continue
# 切换回分支,重新变基
git checkout <work-branch>
git rebase recovery
# 删除无用分支
git branch -d recovery
代码管理
查看每次提交修改的文件列表:
git log --name-status
列出某一文件的修改记录:
git log <file-name>
查看某一次提交的修改:
git show <commit-id>
缺省查看最后一次提交的修改。
增量修改最后一次提交:
git commit --amend
如果只改动代码,不需要改动提交信息的话:
git commit --amend --no-edit
ps: 如果想要增量修改以前的某次提交,需要两次rebase -i
操作:
首先提交补丁成一个commit,然后第一次rebase -i
移动此commit到需要修改的记录之后,并注意解决冲突;
然后第二次rebase -i
合并进前一次的提交之中,需要用到的编辑选项是f
,也就是fixup
,这样提交记录会和前一次保持不变。
注意本分支rebase过之后,基于此分支的分支都会变,需要重新rebase本分支。对于不需要的旧commit,直接使用编辑选项d
,也就是drop
抛弃即可。
撤回最近N次提交:
git reset HEAD~N
默认撤回到工作区(workspace),撤回到暂存区需要加参数--soft
,直接删除需要加--hard
。
比较修改前后的变化。
对比工作区与暂存区:
git diff
对比暂存区与历史记录:
git diff --cached
对比工作区与某一历史记录的变化(如HEAD~1):
git diff HEAD~2
对比某文件(如a.txt)在工作区与某一历史记录的变化(如HEAD~2):
git diff HEAD~2 --a.txt
对比某文件(如a.txt)在某两个历史记录之间的变化(如HEAD2和HEAD5):
git diff HEAD~2 HEAD~5 --a.txt
设置提交时间戳
有时候发现一处修改应该及早提交,如果直接commit然后rebase调整顺序的话会发现:虽然该提交的顺序前移了,但是显示的提交时间仍然是当前提交时间。修改时间戳的办法是提交的时候加入--date=<commit-time>
选项:
git commit --date=<commit-time> -m <commit-message>
注意时间戳的格式要保持正确,可以直接复制git log
中某个时间戳然后修改。
对于最后一次的提交,要修改时间戳,可以直接用--amend --date=<commit-time>
来设置。
仓库清理
查看当前文件夹大小:
du -hs .
查看子文件夹大小:
du -hs *
从提交记录中清理大文件:
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch <big-file>' --prune-empty --tag-name-filter cat -- --all
删除本地文件残留回收空间:
git reflog expire --expire=now --all
git gc --prune=now