git学习和使用(一) 本地版本库的操作
2015-12-15 18:02
459 查看
前几天只是学习了git最简单的使用,今天有时间把廖雪峰老师的git教程直接看完,写点东西加强一下记忆。
git的安装就不赘述了,我的开发环境是mac,直接从头开始,走一遍开发流程,我有一个项目,需要利用git做版本管理,新建一个文件夹 tiansi_git作为工作目录
git init命令,初始化git,把该目录设置为git管理的仓库
现在这个目录就纳入git的管理范围内,目录下也多了一个名为.git的隐藏目录,可以通过 ls -al 命令来看到它
我就是在这个目录底下干活的,git把它叫做工作区,.git目录就是我的本地代码仓库,里面包含一个暂存区和版本库,如何使用git版本库来管理咱们的文件呢,当你在工作区新建,修改文件后,首先运行 git add 命令添加文件,这个命令会把文件添加至暂存区,然后运行git commit 命令,就会把暂存区所有的内容提交到版本库内
整个git版本库工作的流程就是,你工作开发新建,或者更改了文件,然后你提交到暂存区,然后由暂存区提交到版本库。
显示一个文件改变,插入一行内容,如果你的文件已提交到本地版本库内
git status命令就会告诉你,在主分支,没有文件等待提交,工作区是干净的。现在再次修改这个文件,增加一行内容,第一次修改,并通过git status查看状态
提示你tiansi.txt发生了更改,但是并没有提交到暂存区,再次运行命令提交
利用git log命令可以查看提交日志,它可以看到最近的3次提交
如果感觉不直观,加上 –pretty=oneline
log可以直观的看到每次更改的内容,在这里建议每次提交的信息要全面直观,不要怕过长,以便于以后的版本回退
两次的提交,对于git的工作原理有了大概的认识,那么就是不管你新建,修改了什么文件,假如你不通过 git add添加到暂存区,那么就不能通过 git commit 提交到你的版本库,这是一个串行操作
下面继续开发,第二次修改文件,增加内容 小雨伞喜欢装大头蒜
但是我觉得这样写不好,想把这行删掉,那么通过git如何操作呢,使用 git checkout –文件名 命令,它的作用是把这个文件恢复到最近一次git commit或git add时的状态,也可以理解为它会把版本库内最新的一次版本直接覆盖工作区
果然,小雨伞那行内容不见了,它是把文件恢复到你最近一次提交时的状态,假如你加了这条内容之后,顺手add了一下,把它提交到了暂存区呢
这会儿需要使用 git reset 命令把文件从暂存区清理掉,大写HEAD指的是版本库内最新的代码版本
提示已经把文件清除了,文件恢复到了工作区,这会儿再使用checkout 命令把文件恢复到以前版本
如果你更改了文件,不仅add,而且commit了,已经将文件提交到了代码库,怎么恢复原来的文件呢
使用git的版本回退功能,git reset,首先查看你的commitID,看到最近3次的commit,然后回滚到上次的commit
找到上一次的commitID 然后使用reset 命令回滚,这里面使用了参数 –hard,
git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
我们发现,文件变回来了,同样的道理,假如你误操作,把文件删除了
git提示,这个文件被删除掉了,也可以直接使用checkout命令恢复这个文件,跟更改同理
文件同样回来了
如果你真的是想要删除这个文件,使用git rm命令,然后commit即可
你会发现,本地和版本库的文件都没有了,如果你想要恢复这个文件,就只能通过刚才说的版本回退 git reset命令了。
关于文件更改,删除,工作区,暂存区,版本库的概念告一段落,下面说一下分支的概念,分支是git强大的功能之一
它可以让你的项目并行开发,每个人各有自己的分支,最后只需要汇总一下,一个完整的项目就出来了。当你初始化git版本库的时候,git会默认建立分支 master,也叫主分支,查看分支命令 git branch
星号代表当前使用分支
下面创建并切换至分支study
成功创建并且切换至 study分支,这会儿study分支和主分支就等同于双胞胎一样,内容一模一样,现在在study分支下进行开发,增加文件 xiaoyusan.txt并提交
然后切换回主分支
发现并没有xiaoyusan.txt这个文件,因为那是在study分支上开发的,所以主分支肯定没有,那么如果把两个分支合并呢,git merge 命令,合并指定分支到当前分支
我们发现,xiaoyusan.txt在主分支内也有了,说明合并成功,那么这会儿就可以删除study分支了,因为它的使命已经完成了,删除分支命令为
分支成功删除
然后新问题来了,如果两个分支同时开发,更改的是同一个文件,怎么办呢,创建新分支wait,然后对xiaoyusan.txt文件进行更改并提交到版本库
然后切换回主分支修改xiaoyusan.txt文件并提交到版本库,然后进行代码合并
报错,告诉我们xiaoyusan.txt存在冲突,必须手动处理,直接查看该文件
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改后保存,然后再次提交
这会儿两个分支就已经合并了,可以使用git log 命令来查看分支合并,然后删除wait分支
开发一个新功能,最好新起一个分支,但是假如这个分支做完之后发现没有用怎么办,如果你直接删除它,会报错提示你分支并未合并,那么就只能使用大写D参数来删除它
git的安装就不赘述了,我的开发环境是mac,直接从头开始,走一遍开发流程,我有一个项目,需要利用git做版本管理,新建一个文件夹 tiansi_git作为工作目录
mkdir tiansi_git
git init命令,初始化git,把该目录设置为git管理的仓库
git init
现在这个目录就纳入git的管理范围内,目录下也多了一个名为.git的隐藏目录,可以通过 ls -al 命令来看到它
➜ tiansi_git git:(master) ls -al total 0 drwxr-xr-x 3 tiansi staff 102 12 15 15:27 . drwxr-xr-x+ 51 tiansi staff 1734 12 15 15:27 .. drwxr-xr-x 10 tiansi staff 340 12 15 15:27 .git
我就是在这个目录底下干活的,git把它叫做工作区,.git目录就是我的本地代码仓库,里面包含一个暂存区和版本库,如何使用git版本库来管理咱们的文件呢,当你在工作区新建,修改文件后,首先运行 git add 命令添加文件,这个命令会把文件添加至暂存区,然后运行git commit 命令,就会把暂存区所有的内容提交到版本库内
整个git版本库工作的流程就是,你工作开发新建,或者更改了文件,然后你提交到暂存区,然后由暂存区提交到版本库。
➜ tiansi_git git:(master) ✗ cat tiansi.txt git使用 ➜ tiansi_git git:(master) ✗ git add tiansi.txt ➜ tiansi_git git:(master) ✗ git commit -m "第一次提交到本地仓库" [master (root-commit) cec45c5] 第一次提交到本地仓库 1 file changed, 1 insertion(+) create mode 100644 tiansi.txt
显示一个文件改变,插入一行内容,如果你的文件已提交到本地版本库内
➜ tiansi_git git:(master) git status On branch master nothing to commit, working directory clean
git status命令就会告诉你,在主分支,没有文件等待提交,工作区是干净的。现在再次修改这个文件,增加一行内容,第一次修改,并通过git status查看状态
➜ tiansi_git git:(master) ✗ cat tiansi.txt git使用 第一次修改 ➜ tiansi_git git:(master) ✗ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: tiansi.txt no changes added to commit (use "git add" and/or "git commit -a")
提示你tiansi.txt发生了更改,但是并没有提交到暂存区,再次运行命令提交
➜ tiansi_git git:(master) ✗ git add tiansi.txt ➜ tiansi_git git:(master) ✗ git commit -m "第一次修改后的提交" [master cde7256] 第一次修改后的提交 1 file changed, 1 insertion(+) ➜ tiansi_git git:(master)
利用git log命令可以查看提交日志,它可以看到最近的3次提交
➜ tiansi_git git:(master) git log commit cde7256152f3c75a894bbdc9567d59bcbaeeffd0 Author: 田斯 <tiansi@uubpay.com> Date: Tue Dec 15 16:27:28 2015 +0800 第一次修改后的提交 commit cec45c5b87559070050ad754e4bb9e6e9cd22f3b Author: 田斯 <tiansi@uubpay.com> Date: Tue Dec 15 15:41:11 2015 +0800 第一次提交到本地仓库
如果感觉不直观,加上 –pretty=oneline
➜ tiansi_git git:(master) git log --pretty=oneline cde7256152f3c75a894bbdc9567d59bcbaeeffd0 第一次修改后的提交 cec45c5b87559070050ad754e4bb9e6e9cd22f3b 第一次提交到本地仓库
log可以直观的看到每次更改的内容,在这里建议每次提交的信息要全面直观,不要怕过长,以便于以后的版本回退
两次的提交,对于git的工作原理有了大概的认识,那么就是不管你新建,修改了什么文件,假如你不通过 git add添加到暂存区,那么就不能通过 git commit 提交到你的版本库,这是一个串行操作
下面继续开发,第二次修改文件,增加内容 小雨伞喜欢装大头蒜
➜ tiansi_git git:(master) ✗ cat tiansi.txt 小雨伞喜欢装大头蒜 git使用 第一次修改
但是我觉得这样写不好,想把这行删掉,那么通过git如何操作呢,使用 git checkout –文件名 命令,它的作用是把这个文件恢复到最近一次git commit或git add时的状态,也可以理解为它会把版本库内最新的一次版本直接覆盖工作区
➜ tiansi_git git:(master) ✗ git checkout -- tiansi.txt ➜ tiansi_git git:(master) cat tiansi.txt git使用 第一次修改
果然,小雨伞那行内容不见了,它是把文件恢复到你最近一次提交时的状态,假如你加了这条内容之后,顺手add了一下,把它提交到了暂存区呢
➜ tiansi_git git:(master) ✗ cat tiansi.txt 小雨伞喜欢装大头蒜 git使用 第一次修改
➜ tiansi_git git:(master) ✗ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: tiansi.txt
这会儿需要使用 git reset 命令把文件从暂存区清理掉,大写HEAD指的是版本库内最新的代码版本
➜ tiansi_git git:(master) ✗ git reset HEAD tiansi.txt
Unstaged changes after reset:
M tiansi.txt
➜ tiansi_git git:(master) ✗ cat tiansi.txt 小雨伞喜欢装大头蒜 git使用 第一次修改
➜ tiansi_git git:(master) ✗ git checkout -- tiansi.txt ➜ tiansi_git git:(master) cat tiansi.txt git使用 第一次修改
提示已经把文件清除了,文件恢复到了工作区,这会儿再使用checkout 命令把文件恢复到以前版本
如果你更改了文件,不仅add,而且commit了,已经将文件提交到了代码库,怎么恢复原来的文件呢
➜ tiansi_git git:(master) cat tiansi.txt 小雨伞喜欢装大头蒜 git使用 第一次修改 ➜ tiansi_git git:(master) ✗ git add . ➜ tiansi_git git:(master) ✗ git commit -m "增加内容:小雨伞喜欢装大头蒜" [master d26d7cd] 增加内容:小雨伞喜欢装大头蒜 1 file changed, 1 insertion(+)
使用git的版本回退功能,git reset,首先查看你的commitID,看到最近3次的commit,然后回滚到上次的commit
➜ tiansi_git git:(master) git log --pretty=oneline d26d7cdfd17fd1bfea53a4801d1f96d69e80e8af 增加内容:小雨伞喜欢装大头蒜 cde7256152f3c75a894bbdc9567d59bcbaeeffd0 第一次修改后的提交 cec45c5b87559070050ad754e4bb9e6e9cd22f3b 第一次提交到本地仓库
找到上一次的commitID 然后使用reset 命令回滚,这里面使用了参数 –hard,
git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
➜ tiansi_git git:(master) cat tiansi.txt 小雨伞喜欢装大头蒜 git使用 第一次修改 ➜ tiansi_git git:(master) git log --pretty=oneline ➜ tiansi_git git:(master) git reset --hard cde7256152f3c75a894bbdc9567d59bcbaeeffd0 HEAD is now at cde7256 第一次修改后的提交 ➜ tiansi_git git:(master) cat tiansi.txt git使用 第一次修改
我们发现,文件变回来了,同样的道理,假如你误操作,把文件删除了
➜ tiansi_git git:(master) rm tiansi.txt ➜ tiansi_git git:(master) ✗ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: tiansi.txt no changes added to commit (use "git add" and/or "git commit -a")
git提示,这个文件被删除掉了,也可以直接使用checkout命令恢复这个文件,跟更改同理
➜ tiansi_git git:(master) ✗ git checkout -- tiansi.txt
➜ tiansi_git git:(master) ls
tiansi.txt
➜ tiansi_git git:(master) git status On branch master nothing to commit, working directory clean
文件同样回来了
如果你真的是想要删除这个文件,使用git rm命令,然后commit即可
➜ tiansi_git git:(master) git rm tiansi.txt rm 'tiansi.txt' ➜ tiansi_git git:(master) ✗ git commit -m "删除了tiansi.txt文件" [master 273ffeb] 删除了tiansi.txt文件 1 file changed, 2 deletions(-) delete mode 100644 tiansi.txt
你会发现,本地和版本库的文件都没有了,如果你想要恢复这个文件,就只能通过刚才说的版本回退 git reset命令了。
关于文件更改,删除,工作区,暂存区,版本库的概念告一段落,下面说一下分支的概念,分支是git强大的功能之一
它可以让你的项目并行开发,每个人各有自己的分支,最后只需要汇总一下,一个完整的项目就出来了。当你初始化git版本库的时候,git会默认建立分支 master,也叫主分支,查看分支命令 git branch
➜ tiansi_git git:(master) git branch * master
星号代表当前使用分支
下面创建并切换至分支study
➜ tiansi_git git:(master) git checkout -b study Switched to a new branch 'study' ➜ tiansi_git git:(study) git branch master * study
成功创建并且切换至 study分支,这会儿study分支和主分支就等同于双胞胎一样,内容一模一样,现在在study分支下进行开发,增加文件 xiaoyusan.txt并提交
➜ tiansi_git git:(study) ✗ cat xiaoyusan.txt 小雨伞装大头蒜 ➜ tiansi_git git:(study) ✗ git add xiaoyusan.txt ➜ tiansi_git git:(study) ✗ git commit -m "提交" [study 93ed732] 提交 1 file changed, 1 insertion(+) create mode 100644 xiaoyusan.txt
然后切换回主分支
➜ tiansi_git git:(study) git checkout master Switched to branch 'master' ➜ tiansi_git git:(master) ls
发现并没有xiaoyusan.txt这个文件,因为那是在study分支上开发的,所以主分支肯定没有,那么如果把两个分支合并呢,git merge 命令,合并指定分支到当前分支
➜ tiansi_git git:(master) git merge study Updating 273ffeb..93ed732 Fast-forward xiaoyusan.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 xiaoyusan.txt ➜ tiansi_git git:(master) ls xiaoyusan.txt ➜ tiansi_git git:(master) cat xiaoyusan.txt 小雨伞装大头蒜
我们发现,xiaoyusan.txt在主分支内也有了,说明合并成功,那么这会儿就可以删除study分支了,因为它的使命已经完成了,删除分支命令为
➜ tiansi_git git:(master) git branch -d study
Deleted branch study (was 93ed732).
➜ tiansi_git git:(master) git branch * master
分支成功删除
然后新问题来了,如果两个分支同时开发,更改的是同一个文件,怎么办呢,创建新分支wait,然后对xiaoyusan.txt文件进行更改并提交到版本库
➜ tiansi_git git:(master) git checkout -b wait Switched to a new branch 'wait' ➜ tiansi_git git:(wait) ls xiaoyusan.txt ➜ tiansi_git git:(wait) vim xiaoyusan.txt ➜ tiansi_git git:(wait) ✗ cat xiaoyusan.txt 小雨伞装大头蒜 总是喜欢装大头蒜 ➜ tiansi_git git:(wait) ✗ git add . ➜ tiansi_git git:(wait) ✗ git commit -m "增加内容 总是喜欢装大头蒜" [wait d4f7973] 增加内容 总是喜欢装大头蒜 1 file changed, 1 insertion(+)
然后切换回主分支修改xiaoyusan.txt文件并提交到版本库,然后进行代码合并
➜ tiansi_git git:(wait) git checkout master Switched to branch 'master' ➜ tiansi_git git:(master) ✗ cat xiaoyusan.txt 小雨伞装大头蒜 酒量不行就爱吹 ➜ tiansi_git git:(master) ✗ git add . ➜ tiansi_git git:(master) ✗ git commit -m "在主分支也修改了" [master cd44991] 在主分支也修改了 1 file changed, 1 insertion(+) ➜ tiansi_git git:(master) git merge wait Auto-merging xiaoyusan.txt CONFLICT (content): Merge conflict in xiaoyusan.txt Automatic merge failed; fix conflicts and then commit the result.
报错,告诉我们xiaoyusan.txt存在冲突,必须手动处理,直接查看该文件
➜ tiansi_git git:(master) ✗ cat xiaoyusan.txt 小雨伞装大头蒜 <<<<<<< HEAD 酒量不行就爱吹 ======= 总是喜欢装大头蒜 >>>>>>> wait
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改后保存,然后再次提交
➜ tiansi_git git:(master) ✗ cat xiaoyusan.txt 小雨伞装大头蒜 酒量不行就爱吹 总是喜欢装大头蒜 ➜ tiansi_git git:(master) ✗ git add . ➜ tiansi_git git:(master) ✗ git commit -m "手动合并后的提交"
这会儿两个分支就已经合并了,可以使用git log 命令来查看分支合并,然后删除wait分支
➜ tiansi_git git:(master) git log --graph --pretty=oneline --abbrev-commit * f07a364 手动合并后的提交 |\ | * d4f7973 增加内容 总是喜欢装大头蒜 * | cd44991 在主分支也修改了 |/ * 93ed732 提交 * 273ffeb 删除了tiansi.txt文件 * cde7256 第一次修改后的提交 * cec45c5 第一次提交到本地仓库 ➜ tiansi_git git:(master) git branch -d wait Deleted branch wait (was d4f7973).
开发一个新功能,最好新起一个分支,但是假如这个分支做完之后发现没有用怎么办,如果你直接删除它,会报错提示你分支并未合并,那么就只能使用大写D参数来删除它
➜ tiansi_git git:(master) git branch -d new error: The branch 'new' is not fully merged. If you are sure you want to delete it, run 'git branch -D new'. ➜ tiansi_git git:(master) git branch -D new Deleted branch new (was 53cd39e).
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- 织梦(dedecms)如何清空全部文章和删除后新增文章id号归1的方法
- 第九章 设计用户界面 之 设计实现界面行为
- html5 localStorage ios8.1.1 safari兼容问题
- ScrollView嵌套ListView问题
- Maven学习遇到的单词
- Java8学习
- 选择排序之堆排序
- 使用sharedwoker
- 5.实战举例
- 【交换排序】冒泡排序
- VS2013编写嵌入网页的ATL控件2-给ATL控件添加鼠标响应
- 如何在移动广告平台中IOS应用中集成插页式广告
- 老李分享:《Linux Shell脚本攻略》 要点(四)
- 中断向量重定位
- 冒泡排序优化
- 请乘坐switch、if和while的时光机
- Android NDK开发之数组类型的操作
- ios9开发之UIAlertController
- tabbar阴影线问题