Git Basic
获取仓库
git clone url <folder>
发现commit信息写错了,重新提交commit信息 git commit --amend
记录每次更新
git status 短模式git status -s --short
暂存区状态 工作区状态 文件
.gitignore githubIgnore
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
1
2
3
4
5
6
7
8
9
10
11
12# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
删除文件
git rm
直接从git仓库删除,并删除文件库git rm --cached
只删除git追踪,不删除磁盘文件,比如忘了把node_module加到.gitignore,就可以通过 git rm –cached删除追踪
支持 glob 模式匹配
重命名/移动文件
git mv oldFile newFile
相当于执行了
1 | mv oldFile newFile |
git log
限制显示的条数 git log -l
例如 git log -2
查看每次commit改动的代码 git log -p
增加总结,commit时各个文件增删多少行以及汇总 git log --stat
一行输出 git log --oneline
自定义format git log --pretty=format:"formation"
具体看链接文档
图形展示 git log --graph
限制时间 git log --since=2.days
具体看链接文档
不展示merge节点 git log --no-merges
撤消操作
git reset file
把暂存区的文件取出来git checkout -- file
把工作区文件修改撤销(变为已暂存/已提交的文件状态)
远程仓库的使用
git remote -v
显示git读写的仓库地址git remote add <name> <url>
添加远程仓库 git add origin git@git.xxxx
打标签
添加taggit tag -a tagName
简单模式git tag -a tagName -m message
添加tag的说明
展示taggit show tagName
git tag
git tag -l 'tagName glob
删除taggit tag -d tagName
只会删除本地git push origin --delete tagName
删除本地与远程git push origin :refs/tags/tagName
同上
检出标签git checkout -b brand-version2 tagName
Git别名
可以让我们的终端操作更加方便快捷git config --global alias.unstage 'reset HEAD --'
1 | 当我们执行 git unstage 时相当于执行了 reset HEAD -- |
再比如我们经常看最后一次更改的话,可以设置个别名
1 | git config --gloabl alias.last 'git log -1 HEAD' |
Git Branch
创建、合并与删除
1 | git checkout xxxx 检出分支 |
冲突
1 | git mergetool |
分支管理
git branch 查看分支
git branch -v 查看分支&&最后一次commit
git branch -vv 查看分支&&远程跟踪分支&&最后一次commit
git branch –merged/–no-merged 查看分支是否有被merge过,如果被merge过的分支,删掉该分支也没问题
git push
git checkout –track
git branch -u/–set-upstream-to
git push origin –delete xxxx 删除远程分支
变基
merge的操作是三方合并(当前节点,待合并节点,共同祖先节点)
rebase更像是把所有提交重新在当前分支跑一遍,不过rebase有时候更灵活
git rebase --onto master server client
取出 client 分支,找出它从 server 分支分歧之后的补丁, 然后把这些补丁在 master 分支上重放一遍,让 client 看起来像直接基于 master 修改一样
变基还是比较疑惑
Git Utils
贮藏与清理 git stash
贮藏 git stash push
取出 git stash pop
查看贮藏列表 git stash list
骚操作 交互式贮藏,这个功能fork暂时不支持,所以只能通过命令行来实现 git stash --patch
创建一个分支用来apply贮藏的东西 git stash branch <new branchName>
git clean
可以用来清理一些未被跟踪的文件,包括新建的和被ignore的
更好的方法是用 git stash push --all
来暂存所有文件,因为clean删除操作是不可逆的
预演一遍会删除什么文件 git clean -n
强制删除 git clean -f
交互式 git clean -i
静默模式 git clean -q
也删除忽略的文件 git clean -x
只删除忽略文件 git clean -X
删除整个文件 git clean -d
搜索
git grep
强大的搜索功能,不过一般好像都用ide直接搜或者用
搜索git仓库中的 removeSignoffAttachments 常用的命令git grap -n removeSignoffAttachment
-n是为了显示在第几行git grap -c removeSignoffAttachment
–count 显示在某个文件共出现多少次
重写历史
如果你的commit信息写错了,但是还没有推送到远程可以用 git commit --amend
重新修改
交互式变基git rebase -i HEAD~3
交互式变基操作最近的三个commit
我们可以利用交互式变基做很多事情,比如修改多个交易信息。git rebase -i HEAD~3
然后再编辑器里面修改,如果只是修改commit信息,把pick
改为r
再改后面的信息就好。
你也可以在这里删除掉某个commit。 或者你想把commit合并成一个,可以把后面两个的 pick
改为 squash
,git就会把后面两个的commit内容合并到第一个
重写大量提交 filter-branch
从每一个提交中移除一个文件: git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
全局修改邮箱地址:
1 | git filter-branch --commit-filter ' |
重置解密
1 | git reset HEAD~ 默认选项,把上个提交修改文件置于工作区 |
reset 合并提交
除了压缩提交以外,还可以用reset来合并提交,前提也是你的代码还没push
假设你有一个项目,第一次提交中有一个文件,第二次提交增加了一个新的文件并修改了第一个文件,第三次提交再次修改了第一个文件。 由于第二次提交是一个未完成的工作,因此你想要压缩它。
git reset --soft HEAD~2
就会把前两个commit给撤回,并把修改都放在暂存区,这时候再一起commit
高级合并
正常合并冲突直接在ied里面解决冲突会比命令行人性化很多
查看每行的修改信息
类似vscode的 File Blame
功能git blame [-L 1,200] index.jsx
查看 index.jsx的第1~200行的修改信息,如果加-C
参数还可以看到这几行最原始出现的地方,也就是说有可能是其他地方copy过来的
查看第一次出现在仓库是什么时候
git log -S text
可以知道仓库什么时候提交出现过这些 text
git 子模块(子git)
添加子模块 git submodule add <repo> [<dir>]
当仓库中有子模块时,需要用 git submodule init && git submit update
来初始化并检出父项目中列出的合适的提交
当然你也可以在克隆的时候直接加参数来处理git clone <repo> --recurse-submodules