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
posted @ 2020-08-26 15:05  与MPI做斗争  阅读(185)  评论(0编辑  收藏  举报