Git笔记

作者: Wavky | 来源:发表于2018-04-23 21:15 被阅读0次
    通用分支模型

    分支模型

    常驻型分支:

    master:每个提交都是稳定版本,每次提交打tag
    develop:每次提交都是可完整编译的开发版本,代码稳定后进入master分支

    临时性分支:

    feature:特定单一功能模块分支,完成后进入develop
    release:特定发布版本分支,来源于develop,完成最终小修复、发布版本资料准备等,发布后同步至develop和master分支,并删除
    hotfixes:特定严重bug修复分支,来源于master,完成后同步至develop和master,并删除。发布期间同步至release分支,最后由release分支同步至develop和master

    介绍一个成功的 Git 分支模型
    A successful Git branching model

    Config配置

    默认仓库级:.git/.gitconfig
    global用户级:C:\Users\username.gitconfig 或 /home/[username]/.gitconfig
    system系统级:git的安装目录\etc\gitconfig

    优先度:仓库级 > 用户级 > 系统级

    Alias配置

    ~/.gitconfig

    [user]
            name = xxx
            email = xxx@xxx.com
    [color]
            ui = auto
    [alias]
        st = status
        cm = commit
        cmm = commit -m
        coamd = commit --amend --no-edit
        coamd-re = commit --amend --no-edit --reset-author
        ck = checkout
        br = branch
        unstage = reset HEAD --
        last = log -1 HEAD
        loga = log --oneline --graph --decorate --all
        ck = checkout
        alias = config --get-regexp alias
    

    基本命令1

    git init 在当前目录(项目)创建git仓库

    git config [-local | -global | -system] -l 列出指定级别的配置文件内容
    git config -l 列出综合计算(排除冲突)后有效的配置内容
    git config -e 编辑器打开配置文件(默认为local级)
    git config --add section.key value 增加配置项(默认为local级)
    git config --get / --unset section.key 获取、删除配置项(默认为local级)

    设置用户全局提交签名
    git config --global user.name myName
    git config --global user.email myEmail@email.com

    git config --global core.editor emacs 配置缺省编辑器
    git config --global merge.tool vimdiff 配置缺省比较工具,可选有kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, 和 opendiff

    git remote -v 列出远程仓库及对应url
    git remote show origin 显示远程仓库origin的详细关联信息
    git remote add [shortname] [url] 追加新的远程仓库到当前项目
    git remote prune origin 移除在origin中已删除的本地过期分支

    git fetch origin 拉取origin服务器上的所有数据到本地,更新远程分支数据及索引
    git fetch origin tag <tagname> 拉取远程tag
    git fetch -p 拉取服务器数据后并执行prune 命令删除过期分支
    git remote add 添加新的远程仓库附加到当前项目远程分支
    git push <远程主机名> <本地分支名>:<远程分支名>
    git push origin master 推送当前分支到origin下的master分支上,尤其第一次提交分支
    git push [origin] 之后的更新提交可使用这种简单形式
    git push origin fixBugs:greatJob 推送fixBugs分支到origin的greatJob 分支上
    git push --all origin 一次性推送所有分支到远程
    git push --tags 推送本地tag到服务器
    git push origin :master 表示提交本地空分支到远程(即删除远程分支)
    相当于 git push origin --delete master

    git merge origin/master 把远程master分支合并到当前分支
    git checkout -b localfix origin/serverfix 把远程分支serverfix检出到本地新分支localfix
    git checkout --track origin/serverfix 检出远程分支serverfix到本地(功能同上,v 1.6.2)
    从远程分支checkout出来的本地分支称为 跟踪分支(tracking branch),已记录与远程分支的关联,可直接使用git push/git pull操作。

    git push origin :serverfix 删除远程分支serverfix(使用空分支push到远程指定分支)
    git push origin --delete <branchName> 删除远程分支(v1.7)

    git push origin :refs/tags/<tagname> 删除远程tag
    git push origin --delete tag <tagname> 删除远程tag(v1.7)

    git pull origin targetBranch 拉取远程分支到本地并合并,相当于:
    git fetch origin targetBranch
    git diff targetBranch
    git merge targetBranch

    git reset HEAD <file> 取消被错误add . 添加到暂存区的文件
    git checkout -- <file> 回滚文件到原始状态

    git mergetool 启动GUI合并工具

    Git查看、删除、重命名远程分支和tag

    git branch -vv
    查看本地分支-远程分支映射

    git branch -u upstream/foo [local_branch]
    git branch --set-upstream-to=upstream/foo [local_branch]
    设置分支映射

    git push origin local_branch:remote_branch
    推送本地分支到远程分支

    git push origin :remote_branch
    git push --delete origin devel
    删除远程分支(推送空分支)

    拉取远程分支并创建本地分支
    从remote_branch节点创建并切换到本地分支local_branch
    git checkout -b local_branch origin/remote_branch
    
    拉取远程分支到本地分支(新建分支但并不自动checkout)
    git fetch origin remote_branch:local_branch
    
    定位 commit

    显示包含该commit的分支列表
    git branch --contains <commit>

    搜索特定message的所有commit
    git log -S "searching words"
    git log -G "regex"
    git log --grep="searching words"
    git log | grep "searching words"

    git bisect:
    二分查找法定位、检出当前branch的关键commit,寻找bug被引入的源头commit

    基本命令2

    • init [--bare] 初始化git仓库,bare 指定创建远程仓库,仅用于管理记录,不用于实际工作
    • clone <url> [新项目文件夹名] 克隆远程项目
    • add -i 交互模式下选择需要加到暂存区的文件
    • add -p <file> 交互模式下选择当前文件中需要加到暂存区的代码块
    • commit --amend -m <message> 修改上次提交的注释
    • commit --amend 使用新的commit替换掉上一次commit
    • cherry-pick <commit1 ...> 指定commit复制并提交到当前分支
    • stash 入栈缓存并 reset --hard
      • list / show / apply / pop / drop / clear
      • save <comment> 入栈缓存并添加备注
      • branch <name> [id] 基于进度创建新分支
    • clean [-f 清理 UNTRACKED 文件] [-d 以及目录] [-n 测试运行模式] [-i 交互模式]
    • rm [--cached 仅在暂存区中] <file> 删除文件的标准方式,指定 cached 则仅在git系统管理中删除文件,但保留物理文件
    • reset [目标,默认为HEAD] [文件] 回滚提交记录或文件,被回滚的记录将被清除
      • --soft 回滚commit提交记录
      • --mixed 默认值,回滚 commit 和 add 动作(清理暂存区)
      • --hard 回滚提交记录,清理暂存区并物理删除新文件
    • revert 撤销某次记录的提交,实际上是执行一次反向提交,增加一条commit记录,不清除被撤销的旧提交
    • branch <name> 创建新分支
    • checkout -b <name> [start-point] 创建并切换到新分支
    • checkout [目标,默认为HEAD] [-- 文件路径] 检出指定版本的项目或文件,覆盖当前
    • update-index --assume-unchanged <file> 暂时忽略对文件修改的跟踪,常用于大型二进制文件管理时提高git性能
    • update-index --no-assume-unchanged <file> 恢复对文件的实时跟踪
    • diff 对比暂存区或最近的commit版本与当前工作区的区别
      • --cached 对比暂存区与最近一次commit版本之间的区别
      • --stat [当前] [目标,默认为HEAD] [-- 文件路径] 对比项目或文件
    • blame <file> 查看文件每行提交者及提交时间
    • show 显示单条 git 提交记录,并使用 diff 分析,可用选项与 log 相同
    • log 显示 git 有效提交历史,不包括被 reset 掉的提交
      • --all --oneline --graph 所有分支以简化的树状图方式表示
      • --decorate 彩色标记分支名等信息
      • --stat 统计方式显示提交的文件
      • -n 查看最近n条记录
    • reflog 查看 git 本地操作的完整记录,可用于恢复被 reset 清除掉的历史提交,但该记录并非永久记录,过于古老的提交将被自动清理掉
    • tag [-f 强制更新] [-m <message>] <tag-name> [commit-id] 对目标commit添加tag,默认为最近一个commit,message信息可通过 show 命令查看
      • -d [tag-name] 删除本地tag
      • -l 列出清单
    • fetch <repo-name> 拉取远程仓库的所有分支更新,刷新所有远程分支HEAD位置
    • merge 无参数表示更新本地分支HEAD标记到远程分支版本
      • --no-commit 相当于dry-run
      • --no-ff / --ff-only Fast-Forward
      • --squash 将目标分支的修改应用到当前分支并产生一个独立commit,不混合提交历史记录
    • pull 相当于 fetch + merge
    • remote 管理远程仓库映射
      • add <repo-name> <url> 追加远程仓库映射
      • rename / remove 重命名、移除远程仓库映射
      • set-url [--push] <repo-name> <new-url> [old-url] 修改远程仓库映射的链接
      • -v 列出所有远程仓库
      • prune <repo-name> 对比并移除本地仓库中已失效的远程分支映射
    • rebase 节点重置,用于重新整理、修建、重新提交当前分支
      • <branch / commit> 重置当前分支根节点到指定分支的HEAD节点或指定commit提交点
      • -i <branch / commit> 交互模式修改提交树,可对部分提交进行拆分、合并、删除、重排序、修改信息等操作
      • --root 特殊模式,针对从仓库第一条历史记录开始修改(或删除)
      • --onto <target-branch / commit> <from-branch / commit> [working-branch] 切换到指定工作分支,缓存从指定位置开始到HEAD之间的所有提交,迁移到指定的目标分支或提交上(重新执行提交序列,不改变提交的历史日期),若在同一分支上操作,则进行commit历史的裁剪操作

    要撤销的文件已被 add 到暂存区时,需要先 reset 退出暂存区,再 checkout 检出原始版本覆盖当前修改。

    .ignore 对当前文件夹以及子文件夹有效,但仅作用于未添加到 git 跟踪的 UNTRACKED 文件。

    patch补丁主要用于非开发人员,不需要进行pull、merge等操作即可得到最近代码

    本地配置文件不需要跟踪时,从一开始就不要添加到 git 库进行管理。

    分支节点符 ^ ~

    ^ 旁系节点,用于表示分支树同一层级的兄弟父节点

    ^ 表示当前commit所在当前分支的(第一个)父节点

    ^2 表示当前commit所在 第二分支 的(第一个)父级兄弟节点(与 ^ 并列同一层级)

    ~ 直系节点,用于表示分支树中当前分支的各个直系父节点

    ~ 表示当前commit所在当前分支的(第一个)父节点

    ~2 表示当前commit所在当前分支的(第一个)祖父节点(直系节点)

    ^^^ = ^1^1^1 = ~3  当前分支的 父节点 的 父节点 的 父节点
    ^^2 = ~1^2 = ~^2   当前分支的 父节点 的 第二分支 的 父节点
    ^2                 当前节点的 第二分支 的 父节点
    

    节点符可用于 HEAD 、分支或任意一个 commit

    可视化工具

    SourceTree

    免费的Mac平台git可视化客户端

    GitUp

    可视化Git工具,结构比SourceTree简单,功能强大,可直接操作提交树图形,提供多种简易自动化编辑功能

    如何在 Git 里撤销(几乎)任何操作
    10 个迅速提升你 Git 水平的提示
    Git分支本地操作详解

    相关文章

      网友评论

          本文标题:Git笔记

          本文链接:https://www.haomeiwen.com/subject/nphrlftx.html