美文网首页iOS
你真的不会用Git - 50关点亮git技能树

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

作者: iHope_Aaron | 来源:发表于2016-04-12 21:30 被阅读1326次
  • 忽略某些文件 * 创建,删除分支 * 找到最后修改某行代码的人 * 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

相关文章

网友评论

    本文标题:你真的不会用Git - 50关点亮git技能树

    本文链接:https://www.haomeiwen.com/subject/zlmplttx.html