Git 基本操作集合

常用客户端:Gitkraken, Fork, Github 客户端

(一) Git 命令

1. 初始化 Git

  1. 进入到自己想创建版本库的目录

  2. 输入指令:

    git init
    

    的目录,这个目录就是Git用来跟踪管理版本库的。

3. 文件添加进远程代码库

  1. git add <文件名> 将文件名为filename的文件添加进仓库,可以多个文件名并列,用空格隔开
  2. 初次提交可以直接使用 git add . 将当前所有文件添加进仓库
  3. git commit -m "describe it" 将文件提交到本地分支仓库的操作,后面加的是日志。
  4. git add remote origin <远程仓库地址> 添加远程仓库地址
  5. git pull --rebase origin master 如果在远程仓库中创建了诸如 README.md 等文件,需要先进行这不操作,保证本地也同步到远程的文件
  6. git push -u origin master将本地代码推送到远程代码库

4. 提交和更新代码操作

  1. git add <文件名> 先把要更新的文件加入暂存区,,相应还有git add . (提交新文件和被修改文件,不包括被删除文件)、 git add --all (提交所有变化) 和 git add -u(提交被修改和被删除文件,不包括新文件)
  2. git commit -m "describe it" 提交到本地分支仓库
  3. git push -u <分支名> 推送到远程代码仓库
  4. git pull <远程主机名> <远程分支名>:<本地分支名> 更新代码,如果有冲突需要在本地提交

5. 日常模式总结

  1. 首先,用git push origin branch-name推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin branch-name 再次推送
  5. 如果git pull提示 “no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name

6. 常用指令

  1. git status 可以随时仓库当前状态,查看已经命令过但还未经提交到仓库的所有操作,可以看成是待处理事项列表
  2. git diff 可以看到具体修改了哪些内容
  3. git log 查看对仓库的操作记录
  4. git rm <filename> 删除文件,如果确认删除,删除后需要进行 git commit -m "describe it" 操作,保证本地分支同步;如果需要回复删除文件需要用 git checkout --<filename> 操作,从分支仓库中回复文件到暂存区
  5. git clone git@server-name:path/repo-name.git 从远程代码仓库克隆代码
  6. git branch 查看本地分支
  7. git branch -r 查看远程分支
  8. git branch <本地分支名> 创建本地分支
  9. git checkout <本地分支名> 切换到相应本地分支
  10. git branch -d <本地分支名> 删除分支
  11. git merge <本地分支名> 与当前分支进行合并
  12. git reset HEAD 取消缓存在暂存区的文件
  13. git tag 查看版本
  14. git tag <版本号> 创建新版本
  15. git tag -d <版本号> 删除版本

(二) Git 基本概念

1. 版本回退: git reset

  • 每一次commit都是对应一个版本
  • commit id是对版本的具体标识
  • HEAD表示当前版本
  • HEAD^表示上一个版本
  • HEAD^^表示上上版本
  • HEAD~100表示前100个版本
  • git reset --hard commitId 回退到版本号为commitId的地方,也可以用HEAD的形式表示。
  • 穿梭前,用git log查看提交历史,以便确定要回退到哪个版本。
  • 重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

2. 工作区和暂存区

  • 先上一张很经典的图

    img

  • 工作区:就是我们在电脑中实际看到的;

  • 版本库:工作区中的隐藏目录.git,就是版本库;

  • 暂存区:暂存区的概念很重要,理解暂存区之后对于Git的版本管理会有一个比较清晰的思路。

  • master: 这是Git为我们自动创建的第一个分支。

  • 我觉得如果把工作区看成是键盘终端输入,版本库中的master可以看成是电脑硬盘,我们输入的内容首先是到缓存中的,并不是直接存入硬盘。当缓存区满或者人为发送指令时才会将缓存区的内容写入硬盘。

  • 以添加和文件修改为例,git add指令只是选中文件或者其他要提交的修改,将它们添加进暂存区。只有使用git commit指令的时候,才将暂存区的所有内容提交到当前分支。

(三) 分支管理

1. 分支需求描述

  • 不完整的改动可以先放到分支上,这样别人看不到分支的内容,不会相互影响。可以直到开发完毕后,再一次性合并到原来的分支上.
  • 一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
img

只有一条master时间线

2. 创建、合并和删除分支

2.1 原理

  • 创建新的分支:

    当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

    img

    创建新的分支dev

  • Git创建一个分支很快,增加一个dev指针,改改HEAD的指向. 从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

    img

    对工作区的修改和提交

  • 合并分支:

    把dev合并到master上, 最简单的方法就是直接把master指向dev的当前提交,就完成了合并:

    img

    合并分支

  • 删除分支:

    删除dev分支就是把dev指针给删掉,删掉后就剩下了一条master分支:

    img

    删除分支

2.2 实战

  • take dev as an example
  • 创建分支: git branch dev
  • 切换到分支:git checkout dev
  • 创建+切换分支: git checkout -b dev
  • 查看当前分支:git branch
  • 切换到master分支:git checkout master
  • 合并指定分支到当前分支:git merge dev
  • 删除分支:git branch -d dev
  • git log --graph命令可以看到分支合并图。

3. 分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

  1. master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

  2. 干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

  3. 你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
    4.所以,团队合作的分支看起来就像这样:

    img

    团队合作分支

4. Bug分支

  • 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
  • 当工作没有完成时,先把工作现场git stash一下,然后去修复bug.
  • 修复后,再git stash pop,回到工作现场。
  • 要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

5. 多人协作

5.1 基本命令

  • 当从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

  • 要查看远程库的信息,用git remote

  • 显示更详细的信息, 用git remote -v

  • 推送分支: 就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:

    git push origin master  
    git push origin dev
    
    
  • 并不是一定要把本地分支往远程推送,master分支是主分支,因此要时刻与远程同步, 其他视情况而定.

  • git pull 抓取远程的新提交.

  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

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

推荐阅读更多精彩内容

  • 前言: 随着app不断的迭代,代码会变得越来越多,经过N个人的持续N年的代码,维护起来越来越难,也很难保证测试ca...
    Evans_Xiao阅读 2,817评论 0 4
  • 不通音律,也可以很好的欣赏。 不知又是何人在谱曲作词。 罗大佑,林夕,梅艳芳,迈克尔摇滚…… 流行,古典,舞曲,乐...
    雪忆0331阅读 122评论 0 0
  • 朱笋笋阅读 191评论 1 1