Git 操作笔记

        在项目开发过程中,总是免不了使用版本管理工具。否则可能经常出现 HBO 出版的电视剧《硅谷(Silicon Valley)》中出现的 Pied Piper 的底层代码被全部改写后需要作者一行一行测试进行“还原”的尴尬场景。版本管理工具中,比较流行的有git、svn等。本人使用的是git。从刚接触 git 开始,本人就喜欢上了这个工具,原因除了对 Git 作者 Linus Towards 的崇拜以外,更重要的是第一次使用版本管理工具,发现了此类工具对文档管理的重大意义,以及 Git 工具本身的强大。

        Git 相关的书中,《Git 权威指南》讲得比较全,除了基本的 git 命令,该书还讲了很多比较高级的 Git 使用场景。本文是本人在学习和工作过程中使用 git 的一些经验记录,并会随着使用 Git 越来越熟练和深入而不定期持续更新。


图1 Git工程架构图(图片引自 http://blog.csdn.net/chenj_freedom/article/details/50543152)                                           

使用Git进行团队开发的简要流程如【图1】所示。

对于一个使用 Git 进行版本管理的项目,其开发人员可以分为两种:项目发起人和项目参与者。对于项目发起人而言,要开始使用 Git 进行自己项目的管理,需要初始化一个 Git 版本库。该命令为:

git init [-q | --quiet] [--bare] [--template=] [--separate-git-dir] [--shared[=]] [directory]

本人常用情况有:

1.在本地对已有项目进行版本管理。具体的操作为:命令行进入项目的根目录(cd /x/y/z);Git 初始化(git init)。此时,/x/y/z目录下会生成一个.git目录,用于存放 Git 的相关配置和版本管理历史。

2.在云主机上搭建简易的 Git 库。具体的操作为:(省略 添加git用户、git用户的默认bash设置、Git 库根目录的权限设置 等步骤)命令行进入作为 Git 库的目录(cd /x/y/z);Git 初始化(git init --bare xxx.git)。此时,/x/y/z目录下会生成一个xxx.git目录,该目录下为 branches、 config、 description、 HEAD、 hooks、info、objects、refs 等文件和目录。

以上两种使用方法的主要区别在于第2种只保存历史提交信息,而不保存项目文件本身(适合用作远程仓库),而第1种既保存历史提交信息,也保存项目文件(常用于个人文档管理或者之后将其提交到远程仓库中)。

如果是团队项目,其他开发人员要参与进来时,需要先从远程仓库克隆项目到本地。该命令为:

git clone [--template=] [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror] [-o] [-b] [-u] [--reference] [--dissociate] [--separate-git-dir] [--depth] [--[no-]single-branch] [--no-tags] [--recurse-submodules] [--[no-]shallow-submodules] [--jobs ] [--] <repository> <directory>

参数很多,常用的是克隆整个项目(默认master分支)到本地:git clone <repository>,其中repository 为远程库的完整 url。

在本地修改了一些文件并且测试通过后(对于程序来说),需要把代码上传到远程库。经常涉及到的操作有:

1.git status

查看本地文件的修改情况,包括已经被git跟踪的文件(被修改、删除、重命名、移动位置)和未被跟踪的文件(新增文件)。

所有可选操作为:

git status [<options>...] [--] [<pathspec>...]

2.git diff

比较两个版本之间的差异。直接使用【git diff】时,比较的是工作目录(work tree)与暂存区(之前用git add 添加过修改,但未提交时)或者工作目录与上一次提交(暂存区为空,即上一次提交之后未使用git add 添加修改)之间的差异。

根据不同的参数,还可以:

1)直接比较工作目录与上一次提交的差异:【git diff HEAD】。其中HEAD经过^或者~号修饰还可以表示父提交(如HEAD~1和HEAD^1都表示“上上次”提交),每往前一个提交,修饰的数字加1。

2)比较两个分支间的差异:【git diff branch1 branch2】。若比较当前分支与其他分支的差异,则可简化为 【git diff another_branch】

3)比较再次提交之间的差异:【git diff commit_hash_1 commit_hash_2】,其中提交使用各自hash码全码或者开始的前几位(hash码保留部分能与其他提交的hash码区分即可)

所有可选操作为:

git diff [options] [<commit>] [--] [<path>...]

git diff [options] --cached [<commit>] [--] [<path>...]

git diff [options] <commit> <commit> [--] [<path>...]

git diff [options] <blob> <blob>

git diff [options] [--no-index] [--] <path> <path>

3.git add

常用的搭配为 【git add .(添加当前目录下所有的改动文件到暂存区)】、【git add FILEPATH [...] (添加指定文件到暂存区)】和【git add EXPRESSION(添加匹配正则的文件到暂存区)】。

所有可选操作为:

git add[--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec> ...]

4.git commit

常用的搭配为【git commit -m <msg>】,即把由 git add 添加到暂存区的文件提交到本地 git 库,并使用 msg 作为此次提交的变更提示。

所有可选操作为:

git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]

[--dry-run] [(-c | -C | --fixup | --squash) <commit>]

[-F <file> | -m <msg>] [--reset-author] [--allow-empty]

[--allow-empty-message] [--no-verify] [-e] [--author=<author>]

[--date=<date>] [--cleanup=] [--[no-]status]

[-i | -o] [-S[<keyid>]] [--] [<file>...]

5. git pull

常用搭配为【git pull remote branch】,用于拉取远程库remote的branch分支到本地,并与当前分支合并。这一步在提交本地修改到远程库之前很重要。因为如果远程分支没有加保护机制,本地提交的内容会覆盖其他开发人员提交的修改(具体为远程分支与本地分支最近的相同提交以后的其他提交会被覆盖)。

所有可选操作为:

git pull [options] [ [...]]

6.git push

常用搭配为【git push remote branch】,用于把本地branch分支上的修改推送到remote远程库的branch分支上。

所有可选操作为:

git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=]

[--repo=<repository>] [-f | --force] [--prune] [-v | --verbose]

[-u | --set-upstream]

[--[no-]signed|--sign=(true|false|if-asked)]

[--force-with-lease[=<refname>[:<expect>]]]

[--no-verify] [<repository> [<refspec>...]]

7.git branch

创建新分支。如【git branch branchB】,表示从当前分支的最新提交处新建一个分支brachB。

所有可选操作为:

git branch [--color[=<when>] | --no-color] [-r | -a] [--list] [-v [--abbrev=<length> | --no-abbrev]]

    [--column[=<options>] | --no-column]

    [(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]

    [--points-at <object>] [<pattern>...]

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]

git branch --unset-upstream [<branchname>]

git branch (-m | -M) [<oldbranch>]

git branch (-d | -D) [-r] <oldbranch>] <newbranch>

git branch (-d | -D) [-r] <branchname>...

git branch --edit-description [<branchname>]

8.git checkout

切换分支或者重置工作区文件。

git checkout branchName:切换到branchName分支

git checkout -b branchName:等价于git branch branchName ,git checkout branchName,即创建并切换到branchName分支

git checkout file1 file2 ...:重置(丢弃未暂存的)工作区文件

所有可选操作为:

git checkout [-q] [-f] [-m] [<branch>]

git checkout [-q] [-f] [-m] --detach [<branch>]

git checkout [-q] [-f] [-m] [--detach] <commit>

git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

git checkout [-p|--patch] [<tree-ish>] [--] [<paths>...]

9.git merge

把两个或多个开发分支合并到一起。如开发测试正常后的功能分支需要合并到线上分支进行测试然后上线。

10.git cherry-pick

应用已经存在的提交的修改内容。如在A分支上的一次提交需要用于B分支,而A分支又不方便合并到B分支时,可以使用此命令把该提交操作作用于B分支(相同的文件修改和提交msg,但是commit hash code会不同)。

所有可选操作为:

git cherry-pick  [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]

                        [-S[<keyid>]] <commit>...

git cherry-pick --continue

git cherry-pick --quit

git cherry-pick --abort

11.git reset

需要回滚到历史状态时,可用此命令。常用的操作有:

git reset --soft commit_hash_code:提交历史回滚到指定commit处,但是该commit以后的文件修改内容保留,常用于丢弃一些commit历史并重新提交。

git reset --hard commit_hash_code:回滚提交历史与文件修改,常用于丢弃文件修改,如重置错误的提交、丢弃工作区内容、回滚失败的merge操作等。

所有可选操作为:

git reset [-q] [<tree-ish>] [--] <paths>...

git reset (--patch | -p) [<tree-ish>] [--] [<paths>...]

git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

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

推荐阅读更多精彩内容

  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,437评论 1 26
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,611评论 9 163
  • 给妈妈买了一个智能手机,寄回了家。 妈妈的手机都是我给她买的,她一直用了一个非智能的手机,因为她认为她也不会用智能...
    abigsmile阅读 192评论 0 0
  • 做事之前你自己都没有信心,凭什么能把事做好?做事之前总是爱犯嘀咕,我可能真的不行,什么叫可能不行,别做了,有此一问...
    饿被猪阅读 562评论 0 0
  • 郭相麟 五千年的华夏文明 历史的车轮 在天地之间 演绎着同根同源的向往 走过岁月的经典 在文化中传承着 龙族的光荣...
    郭相麟阅读 211评论 0 0