git 详细的操作指南笔记
git地址:https://github.com/asd0102433/blog/issues/3
喜欢的朋友start一下,长期更新文章
设置
安装git后我们需要配置一下,告诉git我们的基本信息等等..一般在用户范围内去配置 git ,也就是在 global 范围。
-
global
全局设置$ git config --global user.name 'xxxx' $ git config --global user.email 'xxxx'
同时我们可以用
$ git config --list
来查看我们的设置,
如果需要修改重新设置使用$ git config --unset --global user.name
全局范围的配置会保存在当前用户的主目录下面 叫.gitconfig 的文件里面。我们可以使用
cat ~/.gitconfig
来查看$ cat ~/.gitconfig
设置别名-alias
通过别名可以简化经常输入的内容,别名的配置也可以在gitconfig里面查看
git config --global alias.cm commit
这样当你在commit 的时候 就可以 使用
git cm -m 'xx'
来代替了。
-
全局忽略文件
有时候我们需要去忽略系统生成的文件比如mac 下的.DS_Store,我们可以在全局设置
gitignore
git config --global core.excludesfile ~/.gitignore_global
然后在gitignore文件里面写入需要忽略的文件
.DS_Store
你可以参考下面的链接来看更多要忽略的文件
https://gist.github.com/octocat/9257657如果在项目中可以创建名为
.gitignore
,为每个项目配置。具体忽略的文件可以查看上面的链接如果你想忽略掉已经跟踪的文件,可以使用
git rm cached
选项,再指定一下文件名称,这样可以取消跟踪指定的文件。
Git 基础命令
-
初始化Git
控制和管理项目需要初始化git
$ git init
-
查看当前修改 -git status
$ git status
-
查看提交的信息 -git log
$ git log $ git log --oneline //显示在一行 $ git log --oneline --before = '2017-01-01' //显示2017-01-01的提交
你可以使用git help log 查看更多信息
-
提交 -git commit
添加新的文件,或者修改已有的文件,之后使用commit告诉 git 你做了哪些事情。可以使用git log 查看以往的提交。
$ git commit -m '这里来描述事情'
-
对比差异 -git diff
如果你修改了文件,你想查看自己目前修改的了哪些,可以使用
$ git diff
如果想跟暂存区里面的文件进行对比(暂存区就是git add 文件),可以用
$ git diff --staged
-
重命名,移动 -git mv
git mv可以重命名或者移动文件和目录
$ git mv xx1.js xx2.js //重命名 $ git mv xx1.js js/ //移动文件 $ git mv js asset/ //移动目录
-
删除文件 -git rm
$ git rm fileName
如果你想删除暂存区的可以使用
$ git rm --cached fileName
-
撤销操作 -git amend
如果提交commit之后发现有遗漏的文件可以使用该命令,具体流程
$ git conmmit -m "xxx.js" $ git add "xxx2.js" $ git commit --amend --no-edit
提交之后你就可以使用
git log --name-status
提交了哪些文件 -
修改撤销文件 -git checkout
比如你删除了index.html,使用以下命令恢复文件,也可以恢复之前修改过的
git checkout -- index.html
-
取消已经commit的文件 -git revert
假如你的项目已经commit了,可以用到该命令恢复到指定的commit。
第一步git log --oneline
5c422a3 add html 6804500 Delete a.css
第二步
$ git reset id //id 是指上面commit 的id
git reset 有3个选项,
--soft
不会影响到工作目录还有暂存区里的东西--hard
工作目录,暂存区直接重置到指定的提交状态--mixed
默认选项,会把暂存区里的东西重置到指定提交状态,并且指针指向这个提交。一般情况下如果你发现你的commit文件是有bug的你还需要修改文件,就用默认的mixed,hard 会重置文件的内容到指定的commit。
-
保存修改恢复进度文件 -git stash
stath 可以让工作进度先保存起来,需要用到的时候在恢复。
场景: 你修改文件1.js ,然后你add file后你暂时不想跟后面的文件一起commit,可以先储存起来 $ git stash save "这里可以是说明"
查看保存的进度,或者显示进度的目录
$ git stash list $ git stash show -p stash@{..}
恢复进度
$ git stash apply stash@{..}
删除不需要的进度
$ git stash drop 或者 后面跟上stash@{..}代号
分支branch
-
查看,创建项目分支
$ git branch $ git checkout -b [name_new_branch]
-
删除分支
$ git branch -d [name_branch]
-
切换分支
$ git checkout [branch-name]
-
对比分区的区别
$ git checkout branch
-
分区合并
$ git merge [your_branch]
注意的是你要如果你合并master ,首先需要切换到master 分支下
-
分区对比
$ git diff [branch]..[branch]
-
重命名branch
$ git branch -m [branch] [new_name_branch]
远程 remote
-
添加远程地址
$ git remote add origin [git_address]
-
分支推送到远程的版本
$ git push origin master
具体很多细节去多看看深入的实战
git log 命令支持选项参考这里
选项 | 说明 |
---|---|
-p | 按补丁格式显示每个更新之间的差异 |
--word-diff | 按 word diff 格式显示差异。 |
--stat | 显示每次更新的文件修改统计信息。 |
--shortstat | 只显示 --stat 中最后的行数修改添加移除统计。 |
--name-only | 仅在提交信息后显示已修改的文件清单。 |
--name-status | 显示新增、修改、删除的文件清单。 |
--abbrev-commit | 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。 |
--graph | 显示 ASCII 图形表示的分支合并历史。 |
--relative-date | 使用较短的相对时间显示(比如,“2 weeks ago”)。 |
--pretty | 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。 |
--oneline | --pretty=oneline --abbrev-commit 的简化用法。 |
更多的深入了解可以去git api查看
参考
git 官网
5.2 代码回滚:Reset、Checkout、Revert的选择
git 中文
Create a new branch with git and manage branches
git reset
、git checkout
和git revert
是你的Git工具箱中最有用的一些命令。它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件。
因为它们非常相似,所以我们经常会搞混,不知道什么场景下该用哪个命令。在这篇文章中,我们会比较git reset
、git checkout
和git revert
最常见的用法。希望你在看完后能游刃有余地使用这些命令来管理你的仓库。
Git仓库有三个主要组成——工作目录,缓存区和提交历史。这张图有助于理解每个命令到底产生了哪些影响。当你阅读的时候,牢记这张图。
提交层面的操作
你传给git reset
和git checkout
的参数决定了它们的作用域。如果你没有包含文件路径,这些操作对所有提交生效。我们这一节要探讨的就是提交层面的操作。注意,git revert
没有文件层面的操作。
Reset
在提交层面上,reset将一个分支的末端指向另一个提交。这可以用来移除当前分支的一些提交。比如,下面这两条命令让hotfix分支向后回退了两个提交。
git checkout hotfix
git reset HEAD~2
hotfix分支末端的两个提交现在变成了悬挂提交。也就是说,下次Git执行垃圾回收的时候,这两个提交会被删除。换句话说,如果你想扔掉这两个提交,你可以这么做。reset操作如下图所示:
如果你的更改还没有共享给别人,git reset
是撤销这些更改的简单方法。当你开发一个功能的时候发现『糟糕,我做了什么?我应该重新来过!』时,reset就像是go-to命令一样。
除了在当前分支上操作,你还可以通过传入这些标记来修改你的缓存区或工作目录:
- --soft – 缓存区和工作目录都不会被改变
- --mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
- --hard – 缓存区和工作目录都同步到你指定的提交
把这些标记想成定义git reset
操作的作用域就容易理解多了。
这些标记往往和HEAD作为参数一起使用。比如,git reset --mixed HEAD
将你当前的改动从缓存区中移除,但是这些改动还留在工作目录中。另一方面,如果你想完全舍弃你没有提交的改动,你可以使用git reset --hard HEAD
。这是git reset
最常用的两种用法。
当你传入HEAD以外的其他提交的时候要格外小心,因为reset操作会重写当前分支的历史。正如Rebase黄金法则所说的,在公共分支上这样做可能会引起严重的后果。
Checkout
你应该已经非常熟悉提交层面的git checkout
。当传入分支名时,可以切换到那个分支。
git checkout hotfix
上面这个命令做的不过是将HEAD移到一个新的分支,然后更新工作目录。因为这可能会覆盖本地的修改,Git强制你提交或者缓存工作目录中的所有更改,不然在checkout的时候这些更改都会丢失。和git reset
不一样的是,git checkout
没有移动这些分支。
除了分支之外,你还可以传入提交的引用来checkout到任意的提交。这和checkout到另一个分支是完全一样的:把HEAD移动到特定的提交。比如,下面这个命令会checkout到当前提交的祖父提交。
git checkout HEAD~2
这对于快速查看项目旧版本来说非常有用。但如果你当前的HEAD没有任何分支引用,那么这会造成HEAD分离。这是非常危险的,如果你接着添加新的提交,然后切换到别的分支之后就没办法回到之前添加的这些提交。因此,在为分离的HEAD添加新的提交的时候你应该创建一个新的分支。
Revert
Revert撤销一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。比如,下面的命令会找出倒数第二个提交,然后创建一个新的提交来撤销这些更改,然后把这个提交加入项目中。
git checkout hotfix
git revert HEAD~2
如下图所示:
相比git reset
,它不会改变现在的提交历史。因此,git revert
可以用在公共分支上,git reset
应该用在私有分支上。
你也可以把git revert
当作撤销已经提交的更改,而git reset HEAD
用来撤销没有提交的更改。
就像git checkout
一样,git revert
也有可能会重写文件。所以,Git会在你执行revert之前要求你提交或者缓存你工作目录中的更改。
文件层面的操作
git reset
和git checkout
命令也接受文件路径作为参数。这时它的行为就大为不同了。它不会作用于整份提交,参数将它限制于特定文件。
Reset
当检测到文件路径时,git reset
将缓存区同步到你指定的那个提交。比如,下面这个命令会将倒数第二个提交中的foo.py加入到缓存区中,供下一个提交使用。
git reset HEAD~2 foo.py
和提交层面的git reset
一样,通常我们使用HEAD而不是某个特定的提交。运行git reset HEAD foo.py
会将当前的foo.py从缓存区中移除出去,而不会影响工作目录中对foo.py的更改。
--soft、--mixed和--hard对文件层面的git reset
毫无作用,因为缓存区中的文件一定会变化,而工作目录中的文件一定不变。
Checkout
Checkout一个文件和带文件路径git reset
非常像,除了它更改的是工作目录而不是缓存区。不像提交层面的checkout命令,它不会移动HEAD引用,也就是你不会切换到别的分支上去。
比如,下面这个命令将工作目录中的foo.py同步到了倒数第二个提交中的foo.py。
git checkout HEAD~2 foo.py
和提交层面相同的是,它可以用来检查项目的旧版本,但作用域被限制到了特定文件。
如果你缓存并且提交了checkout的文件,它具备将某个文件回撤到之前版本的效果。注意它撤销了这个文件后面所有的更改,而git revert
命令只撤销某个特定提交的更改。
和git reset
一样,这个命令通常和HEAD一起使用。比如git checkout HEAD foo.py
等同于舍弃foo.py没有缓存的更改。这个行为和git reset HEAD --hard
很像,但只影响特定文件。
总结
你现在已经掌握了Git仓库中撤销更改的所有工具。git reset
、git checkout
、和 git revert
命令比较容易混淆,但当你想起它们对工作目录、缓存区和提交历史的不同影响,就会容易判断现在应该用哪个命令。
下面这个表格总结了这些命令最常用的使用场景。记得经常对照这个表格,因为你使用Git时一定会经常用到。
命令 | 作用域 | 常用情景 |
---|---|---|
git reset | 提交层面 | 在私有分支上舍弃一些没有提交的更改 |
git reset | 文件层面 | 将文件从缓存区中移除 |
git checkout | 提交层面 | 切换分支或查看旧版本 |
git checkout | 文件层面 | 舍弃工作目录中的更改 |
git revert | 提交层面 | 在公共分支上回滚更改 |
git revert | 文件层面 | (然而并没有) |