Git-笔记

来源

https://git-scm.com/book/zh/v2/

配置文件

/etc/gitconfig
    包含系统上每一个用户及他们仓库的通用配置。
    如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
~/.gitconfig 或 ~/.config/git/config
    只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。
.git/config
    当前使用仓库的 Git 目录中的 config 文件:针对该仓库。

配置

设置用户和邮箱
    git config --global user.name "CaoZheng"
    git config --global user.email "7760442@gmail.com"
设置默认编辑器
    git config --global core.editor emacs
列出所有配置
    git config --list
查看某项配置
    git config <key>

获取命令帮助

git help <verb>
git <verb> --help
man git-<verb>

创建版本库

mkdir repository
cd repository
git init

添加文件到暂存区

git add file.txt

重置文件状态

git reset HEAD <file>   取消暂存文件
git reset --hard HEAD^  回退到上个版本
    HEAD表示当前版本,上一个版本是HEAD^,上上一个版本是HEAD^^,上100个版本可写成HEAD~100。

转换分支或恢复文件

git checkout -- <file>  撤销对未暂存文件的修改

删除文件

git rm     把文件从暂存区域移除并删除本地文件
git rm -f  强制删除缓存区中已经修改过的文件
git rm --cached   从缓存区删除,但不删除本地文件
git rm log/\*.log  删除log目录下所有.log结尾的文件

移动文件和改名

git mv file_from file_to
    相当于连续行如下三个命令的
    mv README.md README
    git rm README.md
    git add README

提交文件到仓库

git commit  提交文件并打开默认编辑器编辑提交说明
    -m "commit description"  提交时在命令中添加说明
    -a  跳转 git add  直接提交
    --amend  替换上一次提交

查看状态

git status     查看仓库当前的状态  如哪些文件被修改过
git diff --cached  查看已暂存的将要添加到下次提交里的内容
git diff --staged  查看已暂存的将要添加到下次提交里的内容(新版)
git status -s  简短状态描述
    ?? 新添加的未跟踪文件
    A  新添加到暂存区中的文件
    M  修改过的文件前面有
    M  左边的M表示该文件被修改了但是还没放入暂存区,
     M 右边的M表示该文件被修改了并放入了暂存区。

文件对比

git diff    对比文件 可查看文件修改内容
git diff --cached  查看已经暂存起来的变化
git diff --staged  查看已经暂存起来的变化(新版)

忽略文件

.gitignore  此文件中包含无需纳入Git的管理,也不出现在未跟踪文件的文件列表
    所有空行或者以 # 开头的行都会被 Git 忽略。
    可以使用标准的 glob 模式匹配。
    匹配模式可以以(/)开头防止递归。
    匹配模式可以以(/)结尾指定目录。
    要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
glob 模式 指 shell 所使用的简化了的正则表达式
    *     匹配零个或多个任意字符;
    [abc] 匹配任何一个列在方括号中的字符
    ?     匹配一个任意字符;
    [0-9] 匹配所有 0 到 9 的数字
    **    匹配任意中间目录,比如a/**/z 可以匹配 a/z, a/b/z 或 a/b/c/z等。

查看Log

git log       查看最近到最远的提交日志
    -p                按补丁格式显示每个更新之间的差异。
    --stat            显示每次更新的文件修改统计信息。
    --shortstat       只显示 --stat 中最后的行数修改添加移除统计。
    --name-only       仅在提交信息后显示已修改的文件清单。
    --name-status     显示新增、修改、删除的文件清单。
    --abbrev-commit   仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
    --relative-date   使用较短的相对时间显示(比如,“2 weeks ago”)。
    --graph           显示 ASCII 图形表示的分支合并历史。
    --pretty  使用其他格式显示历史提交信息
        --pretty=oneline  只显示id和注释
        --pretty=short
        --pretty=full
        --pretty=fuller
        --pretty=format:"%h - %an, %ar : %s"  定制要显示的记录格式
            %H   提交对象(commit)的完整哈希字串
            %h   提交对象的简短哈希字串
            %T   树对象(tree)的完整哈希字串
            %t   树对象的简短哈希字串
            %P   父对象(parent)的完整哈希字串
            %p   父对象的简短哈希字串
            %an  作者(author)的名字
            %ae  作者的电子邮件地址
            %ad  作者修订日期(可以用 --date= 选项定制格式)
            %ar  作者修订日期,按多久以前的方式显示
            %cn  提交者(committer)的名字
            %ce  提交者的电子邮件地址
            %cd  提交日期
            %cr  提交日期,按多久以前的方式显示
            %s   提交说明
    -(n)              仅显示最近的 n 条提交
    --since, --after  仅显示指定时间之后的提交
    --until, --before 仅显示指定时间之前的提交
    --author          仅显示指定作者相关的提交
    --committer       仅显示指定提交者相关的提交
    --grep            仅显示含指定关键字的提交
    -S                仅显示添加或移除了某个关键字的提交

远程仓库

git remote  会列出你指定的每一个远程服务器的简写
    -v      显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
    add <shortname> <url>  添加远程仓库并指定简写
    show [remote-name]  查看更多信息
    rename <old_name> <new_name>  修改一个远程仓库的简写名
    rm <remote-name>  移除远程库
git clone   克隆了一个仓库,默认rigin为简写
git pull    从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
git fetch <remote-name>  从远程仓库中获得数据,但不会自动合并或修改你当前的工作
git push [remote-name] [branch-name] [tagname] 推送到上游仓库

标签

git tag  列出所有标签
    -l <reg>    查看包含特定字符的标签
    <tagname>   创见简单标签
    -a <tagname> -m <msg>  创建附注标签并添加信息
    -a <tagname> -m <msg> <commit> 对过去的提交创建附注标签并添加信息
git show <tagname>  查看标签与对应的提交信息
git push origin <tagname>  共享标签
git checkout -b <branchname> <tagname>  在特定的标签创建一个新分支

别名

设置别名例子
    git config --global alias.co checkout
    git config --global alias.br branch
    git config --global alias.ci commit
    git config --global alias.st status
    git config --global alias.unstage 'reset HEAD --'
    git config --global alias.last 'log -1 HEAD'
使用别名
    git co
    git br
    git ci
    git st
    git unstage
    git last
设置外部命令的别名,需在命令前面加入 ! 符号
    git config --global alias.visual '!gitk'

分支

查看分支
    git branch
        -v   查看每个分支的最后一次提交
        -vv  查看更详细的分支信息,包括跟踪的远程分支,是否领先或落后等。
        --merged     查看所有已经合并的分支
        --no-merged  查看所有包含未合并工作的分支
    git log --oneline --decorate   查看各个分支所指向的对象
    git log --oneline --decorate --graph --all   查看提交历史、各个分支的指向以及项目的分支分叉情况

创建切换分支
    git branch <branchname>        创建分支
    git checkout <branchname>      切换分支
    git checkout -b <branchname>   创建分支时同时切换分支

合并分支
    git merge <branchname>  合并 branchname分支 到当前分支
    git merge <remote-name>/<branchname>  合并远程分支到当前分支

删除分支
    git branch -d <branchname>   删除本地分支
    git push [remote-name] --delete [branch-name]  删除远程分支

远程分支
    git ls-remote <remote-name>     获取远程仓库的分支列表
    git remote show <remote-name>   获得远程分支的更多信息
    git push [remote-name] [branch-name][:other-branch-name] 推送本地分支到远程仓库上另外的分支
    git checkout --track origin/serverfix  创建跟踪分支
    git checkout -b [branch] [remotename]/[branch]  创建跟踪分支并设定本地分支为不同的名字
    git branch -u origin/serverfix  设置已有的本地分支跟踪一个刚刚拉取下来的远程分支
    git pull         从跟踪分支中拉取文件,与fetch的区别是拉去文件后会自动merge
    git fetch --all  抓取所有远程仓库,与pull的区别是拉去后不会merge

    Tip: 可通过 @{upstream} 或 @{u} 引用已跟踪的上游分支

变基
    git rebase <branch-name>  把目标分支上修改的内容,添加到现有的分支
        --continue  解决冲突并add至缓存区后,完成变基
        --abort     终止变基,让当前分支回到变基前的状态