Git笔记

通用分支模型

分支模型

常驻型分支:

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分支本地操作详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,846评论 5 147
  • Git常用语法 [TOC] Git简介 描述 ​ Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,...
    君惜丶阅读 3,485评论 0 13
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,897评论 0 11
  • 1. BeanCreationException org.springframework.beans.factor...
    grace666阅读 398评论 0 0
  • 本文是我的好友馋宗通吃观战后的感想,我帮忙发布在简书。如需转发请通知我,谢谢。 补充:我这个好友大学专业是计算机相...
    很小的小小鱼儿阅读 1,250评论 1 2