- 忽略某些文件 * 创建,删除分支 * 找到最后修改某行代码的人 * 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
- unmodified
- modified
-
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
- git commit --date='@@@@@@@' -m "@@@@@@@"
可以用来指定commit 动作的提交时间 - 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 init初始化一个git 项目后,我们的目录下有个file.txt 这样一个文件,并假定其当前版本为v1,下面通过分别执行
- git add .
- git commit
- git reset
三条命令来讲解git 是如何操作这三棵树的.
git add
git add 命令将处在wd目录下的文件,复制到索引中
git commit
git commit 首先会移除index中的内容,并将它保存为一个永久的快照,然后创建一个指向该快照的对象,最后更新master来指向本次提交
这时如果运行git status命令,会发现没有任何log,因为三棵树现在完全相同
如果这时我们修改了file.txt文件为v2版本,然后执行git status命令,git log日志系统会提示『Changes not staged for commit』,提示你进行git add 操作
执行git add操作
这时如果执行git status来观察变化,会有『Changes to be committed』这样的提示,因为HEAD和index中的内容不同。最后我们执行git commit 来完成提交
至此三棵树再次相同,都是file.txt v2版本
git reset
为了理解reset命令,假设我们修改了file.txt文件并第三次提交它,现在三棵树如下所示:
![Upload Paste_Image.png failed. Please try again.]
有三种git reset 使用方式: - git reset --soft <版本号>
- git reset --mixed <版本号>
- git reset --hard <版本号>
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 可以理解为git commit 的反向操作
git reset --mixed <版本号>
按照讲得顺序,猜你已经知道了,git reset --mixed 就是回滚到git commit 和 git add 之前,即保存wd中的修改,但是撤销上次的add/commit对命令
git reset --hard
git reset --hard 是一个很危险的操作,除非你真的知道你在做什么,不然啥给你们两条命令足够满足你的需求。假设现在三棵树都在file.txt v3版本下,这时如果你执行 git reset --hard 命令,则同时修改了HEAD / index / WD, 即整个三棵树都回滚到上一次 修改/ add / commit 时的内容
git reset 大招 --- 压缩
通常我们在完成一个小需求时都会选择add/commit一下,而由于整个需求没有都完成,所以如果直接push就会显得很没有水平,那么如果能合并几次commit为一次commit动作,就是压缩一下,是不是就会很完美!
原理很简单,先正常add/commit , 然后使用git reset --soft 来修改HEAD,最后在执行一次commit,就完成了压缩操作。
举例说明:
设你有一个项目,第一次提交中有一个文件,第二次提交增加了一个新的文件并修改了第一个文件,第三次提交再次修改了第一个文件。 由于第二次提交是一个未完成的工作,因此你想要压缩它:
然后执行git reset --soft HEAD~2 来将HEAD分支移动到一个旧的提交上(即你想保留的提交)
然后执行 git commit
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 -v
已经知道了有哪些仓库,如果你想知道某一个仓库的具体信息,可以执行
git remote show <repository name>
如果获得某一个仓库中所有数据,但又不想改变本地仓库中的内容(pull动作),可以执行
git fetch <remote-name>
添加远程仓库:
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