git基础

本文只是自己记录方便偶尔查阅,没有任何干货或阅读价值...

Git Basic

获取仓库

git clone url <folder>

发现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
2
3
mv oldFile newFile
git add newFile
git rm oldFile

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

打标签

添加tag
git tag -a tagName 简单模式
git tag -a tagName -m message 添加tag的说明

展示tag
git show tagName
git tag
git tag -l 'tagName glob

删除tag
git 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
2
3
4
当我们执行 git unstage 时相当于执行了 reset HEAD --

git unstage fileA
git reset HEAD -- fileA

再比如我们经常看最后一次更改的话,可以设置个别名

1
git config --gloabl alias.last 'git log -1 HEAD'

Git Branch

创建、合并与删除

1
2
3
4
5
6
7
8
9
10
11
git checkout xxxx 检出分支
git checkout -b xxx 创建并检出分支
git branch xxxx 创建分支

合并
git checkout master
git merge hotfix

删除
git branch -d xxxx
git push origin --delete xxxx 删除远程分支

冲突

1
2
3
git mergetool 
git mergetool --tool-help 查看有什么diff工具
git config merge.tool xxxx 设置merge tool

分支管理

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
2
3
4
5
6
7
8
9
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ];
then
GIT_AUTHOR_NAME="Scott Chacon";
GIT_AUTHOR_EMAIL="schacon@example.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD

重置解密

1
2
3
4
5
6
7
8
9
git reset HEAD~ 默认选项,把上个提交修改文件置于工作区
git reset --soft HEAD~ 上个提交的修改置于暂存区
git reset --hard HEAD~ 直接将指针指向上个修改,强制覆盖了工作目录中的文件。如果你的commit没有Push的话,那估计找不到了

reset 命令会以特定的顺序重写这三棵树,在你指定以下选项时停止:

1. 移动 HEAD 分支的指向 (若指定了 --soft,则到此停止)
2. 使索引看起来像 HEAD (若未指定 --hard,则到此停止)
3. 使工作目录看起来像索引

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