你真的不会用Git - 50关点亮git技能树

  • 忽略某些文件 * 创建,删除分支 * 找到最后修改某行代码的人 * commit 后发现里边包含一个不应该提交的文件 * commit 后发现少提交了一些文件 * 一个文件中的多次有改动,怎么做到只提交其中的一部分? * 怎样整理提交记录使其更加整洁? * 快速定位是哪一次提交引入了 bug * ...

2.第二关 设置git name and email

git config --global user.email "bob@example.com"

3.git clone到指定文件夹

git clone <git.repositoryURL> <文件夹名字>

4.git 忽略指定文件

echo "文件名" > .gitignore #每次只能保证一个文件被忽略,因为下次调用时,.gitignore文件被重写了

5.忽略一系列文件

vim .gitignore
.a #代表所有以.a结尾的文件都会被忽略
!lib.a #除了lib.a
/
#所有文件及目录都被忽略
!/foo #除了foo目录
/foo/* #foo目录下的所有文件及目录都被忽略
!/foo/bar #除了foo/bar目录
a//b #代表所有路径,即是 如果有a/c/d/e/f/g/h/b这样的路径,那它被忽略了

6.git 记录每次更新到仓库

git status #可以查看当前仓库中各个文件的状态

文件状态变化周期

git 仓库中文件有以下4种状态:
1)untraced

  1. unmodified
  2. modified
  3. staged
    有时你嫌git status 输出很臃肿,也可以使用git status --short / git status -s输出精简模式:


    状态简览

    ?? 新添加的未跟踪文件前面有??标记
    A 新添加到暂存区中的文件前面有A标记
    M 修改过的文件前面有M标记

有时文件的标记位置会出现两个MM##

M 出现在左边的表示该文件被修改了,并将修改后的文件放到了暂存区
M 出现在右边的表示该文件被修改了,但是还没有放到暂存区
MM 表示文件在工作区被修改了并且放到了暂存区,但是又在工作区被修改了,所以在暂存区和工作区都有该文件被修改的记录

7.仅从git仓库中删除指定文件,而保留其在working tree中

git rm --cached <文件名> # 仅从git仓库中删除<文件名>而在working tree中保留

8.有时你在工作区做了一些工作,但是没有做完,这时你需要切换到别的分支进行工作,而你又不想把这些半成品作为一次commit进行提交,这时你只是需要做git stash命令,将当前不想commit的文件暂时保存

这个命令貌似挺强大~以观后效 https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%82%A8%E8%97%8F%E4%B8%8E%E6%B8%85%E7%90%86#从储藏创建一个分支

9.git tag 命令盲点

git 有两种标签,轻量标签和附注标签
1)轻量标签---像一个不会改变的分支,只是特定提交的引用
2)附注标签---是存储在git数据库中的完整对象,是可以被检验的,其中包含打标签者的名字、email、日期时间等信息
在git中创建附注标签很简单:

创建附注标签

git show 命令可以帮助你查看对应标签提交信息:

查看标签信息与对应的提交信息
后期打标签
后期打标签

假设想给上面的hash Id打标签:9fceb02
git tag -a v1.2 9fceb02

共享标签

默认状态下,git push 命令并不会传送标签到远程服务器上,必须显示提交,服务器端才会显示,提交分为两种方式,每次只提交一个,每次提交多个:


每次提交一个标签

每次提交多个标签
检出标签

git checkout -b <branchname> <tagname>

10.git commit

  1. git commit --date='@@@@@@@' -m "@@@@@@@"
    可以用来指定commit 动作的提交时间
  2. git commit --amend
    用来修改并替换上一次commit,也可以理解为在上次的基础上追加

11.git reset

git 三棵树
HEAD / index / working Directory

HEAD 为当前分支引用的指针,它总是指向该分支的最后一次提交,这表示HEAD将是下一次提交的父节点。简单理解,HEAD就是你上一次的提交的快照。

index 是你预期的下一次提交,index 从理解上,你可以把它认为是Git的"暂存区域"

working Directory 字面意思就是你操作的工作目录,你所有的git repository目录下的内容都在这个工作区,而另外两棵树以一种高效但不直观的方式存储在.git文件夹中。

git 工作流程
git 主要的目的是通过操纵这三棵树并记录各自的状态来管理整个项目:


git 工作流程图

假设通过git init初始化一个git 项目后,我们的目录下有个file.txt 这样一个文件,并假定其当前版本为v1,下面通过分别执行

  1. git add .
  2. git commit
  3. git reset
    三条命令来讲解git 是如何操作这三棵树的.
    git add
    git add

    git add 命令将处在wd目录下的文件,复制到索引中
    git commit
    git commit

    git commit 首先会移除index中的内容,并将它保存为一个永久的快照,然后创建一个指向该快照的对象,最后更新master来指向本次提交
    这时如果运行git status命令,会发现没有任何log,因为三棵树现在完全相同
    如果这时我们修改了file.txt文件为v2版本,然后执行git status命令,git log日志系统会提示『Changes not staged for commit』,提示你进行git add 操作
    edit file.txt -> v2

    执行git add操作
    git add操作

    这时如果执行git status来观察变化,会有『Changes to be committed』这样的提示,因为HEAD和index中的内容不同。最后我们执行git commit 来完成提交
    git commit

    至此三棵树再次相同,都是file.txt v2版本
    git reset
    为了理解reset命令,假设我们修改了file.txt文件并第三次提交它,现在三棵树如下所示:
    ![Upload Paste_Image.png failed. Please try again.]
    有三种git reset 使用方式:
  4. git reset --soft <版本号>
  5. git reset --mixed <版本号>
  6. git reset --hard <版本号>
  1. git reset --soft <版本号>
    通过--soft 选项,仅仅是改变了HEAD的指向,但是并不改变index和WD,这和改变HEAD自身不同(checkout所做的),这意味着如果HEAD设置为master分支,运行git reset 9e5e64a 将会使master 指向 9e5e64a 。无论你调用上面哪种形式的reset, git 都会尝试改变HEAD的指向,只不过--soft选项保证了仅仅是改变了HEAD的指向,而不对index和wd进行修改!


    git reset --soft HEAD~

    综上,理解上git reset --soft 可以理解为git commit 的反向操作

  2. git reset --mixed <版本号>
    按照讲得顺序,猜你已经知道了,git reset --mixed 就是回滚到git commit 和 git add 之前,即保存wd中的修改,但是撤销上次的add/commit对命令


    git reset [--mixed] HEAD~
  3. git reset --hard
    git reset --hard 是一个很危险的操作,除非你真的知道你在做什么,不然啥给你们两条命令足够满足你的需求。假设现在三棵树都在file.txt v3版本下,这时如果你执行 git reset --hard 命令,则同时修改了HEAD / index / WD, 即整个三棵树都回滚到上一次 修改/ add / commit 时的内容


    git reset --hard HEAD~

git reset 大招 --- 压缩

通常我们在完成一个小需求时都会选择add/commit一下,而由于整个需求没有都完成,所以如果直接push就会显得很没有水平,那么如果能合并几次commit为一次commit动作,就是压缩一下,是不是就会很完美!
原理很简单,先正常add/commit , 然后使用git reset --soft 来修改HEAD,最后在执行一次commit,就完成了压缩操作。

举例说明:
设你有一个项目,第一次提交中有一个文件,第二次提交增加了一个新的文件并修改了第一个文件,第三次提交再次修改了第一个文件。 由于第二次提交是一个未完成的工作,因此你想要压缩它:


压缩示例图1

然后执行git reset --soft HEAD~2 来将HEAD分支移动到一个旧的提交上(即你想保留的提交)


压缩示例图2

然后执行 git commit
压缩示例图3

12. git checkout

checkout 命令通常都用在了切换分支上,但是checkout 针对文件,它还有restore恢复,还原文件的功能:

git checkout -- <file>

     origin   :  this is a initial file
     modified : This is the initial config file
                These are changed you don't want to keep!

这时如果使用checkout 命令就会还原修改modified -> origin版本!
当然你要记住,这是一条很危险的命令,因为git会用原来的文件覆盖你修改的文件,而你又没有对其进行提交,因此可以说还原是不可逆的操作,也就是说还原很简单,但是再想恢复到修改后的状态是不容易啦

13. 查看远程仓库

当使用git在本地开发时,如果你是通过git clone 命令拿到的项目的repository,那么git 则帮你建好了本地的仓库,并命名为origin !
但有时你有疑问,想知道远程服务器中还有哪些仓库? 可以通过

git remote

git remote

如果你想知道更具体的信息,则执行

git remote -v

git remote -v

已经知道了有哪些仓库,如果你想知道某一个仓库的具体信息,可以执行

git remote show <repository name>

git remote show <repository name>

如果获得某一个仓库中所有数据,但又不想改变本地仓库中的内容(pull动作),可以执行

git fetch <remote-name>

git fetch <remote-name>

添加远程仓库:

git remote add <remote-name> <remote-url>


git remote add <remote-name> <remote-url>

参考:
https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86

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

推荐阅读更多精彩内容