Git简明操作手册

Git简明手册

以下都是常用的操作,并做了一些通用的规范性要求。
有些操作适应于developer,有些适用于version manager。

准备工作

配置个人本地git变量

  • 配置邮箱
$ git config --global user.name eric

$ git config --global user.email eric@163.com

  • 配置快捷命令
$ git config --global alias.co checkout

$ git config --global alias.ci commit

$ git config --global alias.st status

$ git config --global alias.br branch

$ git config --global alias.hist=log
--pretty=format:'%h %ad | %s%d [%an]' --graph
--date=--date=format:'%A %Y-%m-%d %H:%M:%S'

  • 配置默认日志编辑器
# 配置为atom

$ git config --global core.editor "atom --wait"

# 也可以配置其他的,需要设置环境变量

# 提交操作时,一律用一下命令,详细填写comment

$ git ci

从这里开始项目

Clone项目

  $ git clone http://github.com/eric/test.git

配置本地忽略文件

# 有些本地的文件,你并不想看到它,更不想加入到版本管理,
# 建立忽略文件,git就不会显示他们。

$ touch .gitignore

$ vi .gitignore


内容类似:


# Compiled class file

*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.ear
*.zip
*.tar.gz
*.rar

#project files #
.classpath
.project
.settings/*
.tern-project

建立本地的远程分支

$ git co --track origin/dev

$ git co --track origin/uat

$ git co --track origin/feature/groupcc

# 从此,向远程推送只需:

git push


正确的开发姿势

# 就是开始之前建立分支,基于分支开发,不要直接在git仓库的分支上开发。

# 基于dev,建立新需求分支

$ git co dev

$ git co -b feature/cc606

# 基于uat,建立bug修复分支

$ git co uat

$ git co -b hotfix/cc606_1


# 把本地开发分支的程序,推送到远程仓库,请管理员合并到dev或uat主分支

$ git push origin feature/cc606:feature/cc606
$ git push origin hotfix/cc606_1:hotfix/cc606_1

# 然后登陆gitlab,建立merge request

一个需求的开发,在本地产生了上百次commits,但仓库关注的是结果

# 管理员会拒绝你这些垃圾日志,只要看到最终结果
# 这时候你可以把你所有的commit合并为一次提交,这样就不会有凌乱的日志

$ git co dev

# 重新拉取一下最新代码

$ git pull --rebase

# 开始合并

$ git merge --squash feature/cc606

# 这样就会把feature/cc606的修改,在本地产生待提交的记录,只要提交

$ git ci -am "req-cc606 - 增加工号必录项"

# 以上merge可能产生conflict,另议

拉取和推送

# 拉取最新代码

$ git pull origin

# 推送到仓库

$ git push origin

比较差异

# 比较不在暂存区的文件与上个版本的区别

$ git diff

# 比较在暂存区的文件与上个版本的区别

$ git diff –-cached

# 比较不在和在暂存区的文件与上个版本的区别

$ git diff head

# 比较本地分支和远程分支的差异

$ git log local_branch..origin/remote_branch

$ git diff local_branch origin/remote_branch

怎么查看某个commit的文件列表

$ git show --name-only 1fc253bd

或者

$ git diff-tree --name-only -r 1fc253bd

怎么查看某个commit下,仓库的所有文件

$ git ls-tree --name-only -r 1fc253bd

怎么查看某个文件的变更历史

$ git log --pretty=oneline filename

怎么比较一个文件不同的历史版本差异

# 先查看文件的变更历史

$ git log --pretty=oneline filename

d34a3eb745f783bb61ed8f03a47b6c79c62d343c 代码调整
ea08e3209ea78329696654dfe8ab79c790d9ed60 调整
6d9e65c570aae4e47fd9895e91dda0672c5261b9 修改字符集 GBK->UTF-8
78cb2ba9f163f312c51b30813335b8ad1e9ec5d4 初始化


$ git diff d34a3eb7 ea08e320 filename

如何导出两个版本之间的变更文件


$ git diff 8038f96a b74cc370  --name-only | xargs tar -czvf you_tar.tar.gz

或者(windows下可能没有zip命令)

$ git diff rv1 rv2 –name-only|xargs zip diff.zip

如何导出某个版本的所有文件到指定目录

$ git archive b74cc370 | tar xC output_dic

如何导出某个版本的特定文件到指定目录

$ git archive b74cc370 filename | tar xC output_dic

当我的代码与别人冲突,如何合并版本时以别人的版本为准

# 项目前期版本变化较大时,有时候你希望以最新的更改覆盖,这时很实用

$ git merge --squash feature/groupcc --strategy-option=theirs

当我的代码与别人冲突,如何合并版本时以自己的版本为准

# 两个人做同一个方案,你的方案更优时,可以这样做

$ git merge feature/groupcc --strategy-option=ours

或者

$ git merge feature/groupcc --s ours

如何仅合并某个分支上的某个特定的commit到当前分支

如仅把下图d1到d2的修改合并到m1

cherry-pick.jpg

git co dev

git cherry-pick d2

新版本发布时,你可能希望打个标签,以后可以随时回顾历史需求的提交

$ git tag -a v_cc606 -m "cc606需求 - 增加工号必录项"

# 推送到远程

$ git push origin v_cc606

commit后,发现漏个文件,或者message写的不合适,修改最后一次提交

$ git add file_another

$ git ci --amend

有时候你希望根据关键字查找变更的历史

$ git log --grep=keyword

有时候你希望根据committer或者author查找变更的历史

$ git log --committer=eric

$ git log --author=eric

正在开发一个需求,突然Bug降临!?

经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令

# 临时保存当前的工作(加入当前未完成的需求为cc606)

$ git stash save "cc606"

# 多次stash以后,列出所有的stash

$ git stash list


$ git stash list

stash@{0}: On feature/groupcc: cc606
stash@{1}: WIP on feature/groupcc: ebec8f2d Merge branch
 'feature/groupcc' into 'feature/groupcc'

# 如果完成了bug修改,要继续需求开发,取出stash内容

$ git stash apply stash@{0}

# 以上从stash恢复应用的行为,可能与你已经修复的bug程序产生conflict,
# 你需要手工处理冲突
# 当然以下方式可以避免恢复时产生冲突,但最终合并版本时,你还是要处理潜在冲突

# 在指定stash上建立新分支

$ git stash branch bs stash@{0}

版本管理的约定

  • 一切皆分支
    • 无论需求还是bug都要基于某个基线分支,建立新的开发分支
    • 开发完成后推送到gitlab,建立merge request
    • 随后可以删除分支
  • 关于编码
    • 一切程序和配置文件等用UTF-8编码
    • 提交的comment注释也要用UTF-8编码
  • comment标准化

    • 提交comment,用git ci,详细填写提交日志,不要用git ci -m
    • comment的标题要简洁、清晰,以后版本关联和查找非常方便
      • 需求按照:req-cc606:增加工号必录项,具体示例如下:

        req-cc606:增加工号必录项

        --------此处空一行-------

        增加手机号必录项,修改了查询、维护功能。

        此外,还修改了人员信息导出报表功能。

      • itfix按照:itfix-FN001-cc606:调整维护界面校验,具体示例如下:

        itfix-FN001-cc606:调整维护界面校验

        --------此处空一行-------

        维护界面校验没有考虑空指针情况。

      • 无法关联到具体需求的itfix,按照:itfix-FN001:银保跑批报空指针

      • 格式化日志

      • 有了规范的日志格式,查询历史就非常方便了:

        $ git log --grep "分支"

  • bug修复流程

    • 生产的bug,基于master分支建立修复分支
      • 修复后,合并到uat、dev分支
    • uat的bug,基于uat分支建立修复分支
      • 修复后,合并到dev分支
  • 关于建立几个分支的问题

    • 生产、uat、集成测试分别建立分支,master、uat、dev
    • master、uat、dev都要保护起来,不允许开发人员随意提交,否则版本混乱
    • 开发人员的提交通过merge request合并到主分支
  • 关于发布
    • 每次发布后,建立一个tag,标记这次发布,建议以格式release_req-cc606命名,通过tag的名字能知道发布的内容
  • 关于一个分支上的版本交叉问题
    • 无论是什么版本管理工具,按照需求的提交顺序上线至关重要,建议宣导发到UAT的需求要同时上线,没有积压
    • 现实是残酷的,一般都会有交叉,如有A、B、C三个需求在dev分支,产生了A、B、C三个commit,来回几次bug修复可能commit历史为:A、B、C、A1、C1、B1、A2、B2,这时候你可能像使用svn一样进行合并,需要用到cherry-pic和冲突解决相关的技巧
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,672评论 1 17
  • 苏沫话音刚落,却听见一声尖锐的马嘶声。车子剧烈地晃动起来。她本能地抱着缨绯贴住了车架子。一直闭着眼睛的穆戈尔...
    果木木阅读 210评论 0 2
  • 2017、4、20 深圳 晴 我是希望,真名邓玉梅,但我更喜欢人家称呼我梅子或是邓...
    梅子日记阅读 216评论 0 0