GitHub-版本管理
参考博文:廖雪峰Git教程
1. 管理修改
现在,假定你已经完全掌握了暂存区的概念。下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
为什么说Git管理的是修改,而不是文件呢?我们还是做实验。第一步,对README.txt做一个修改,比如加一行内容:
[root@mini05 zhangtest]# cat README.md
# zhangtest
zhangtest
张三
Git is a distributed version control system.
Git is free software. Git tracks changes. # 添加的内容
[root@mini05 zhangtest]# git add README.md
[root@mini05 zhangtest]# git status
# On branch master
# Your branch is ahead of 'origin/master' by commits.
# (use "git push" to publish your local commits)
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README.md
#
然后,再修改readme.txt:
[root@mini05 zhangtest]# cat README.md
# zhangtest
zhangtest
张三
Git is a distributed version control system.
Git is free software. Git tracks changes of files. # 之前行字符串,换为了这个
之后提交:
[root@mini05 zhangtest]# git commit -m "git tracks changes"
[master b293c46] git tracks changes
file changed, insertion(+)
提交后,再看看状态:
[root@mini05 zhangtest]# git status
# On branch master
# Your branch is ahead of 'origin/master' by commits.
# (use "git push" to publish your local commits)
#
# 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: README.md
#
no changes added to commit (use "git add" and/or "git commit -a")
怎么第二次的修改没有被提交?
别激动,我们回顾一下操作过程:
第一次修改 -> git add -> 第二次修改 -> git commit ,中间缺少了一个git add
我们前面讲了,Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
提交后,用git diff HEAD -- README.txt命令可以查看工作区和版本库里面最新版本的区别:
[root@mini05 zhangtest]# git diff HEAD -- README.md
diff --git a/README.md b/README.md
index 8de2e69..3b892c6
--- a/README.md
+++ b/README.md
@@ -, +, @@ Git is a distributed version control system.
Git is free software. -Git tracks changes.
+Git tracks changes of files.
可见,第二次修改确实没有被提交。
那怎么提交第二次修改呢?你可以继续git add再git commit,也可以别着急提交第一次修改,先git add第二次修改,再git commit,就相当于把两次修改合并后一块提交了:
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
2. 撤销修改
2.1. 场景1
当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
添加了如下信息:
[root@mini05 zhangtest]# cat README.md
# zhangtest
zhangtest
张三
Git is a distributed version control system.
Git is free software. Git tracks changes of files.
aabbccdd # 添加的信息
查看状态信息
[root@mini05 zhangtest]# git status
# On branch master
# Your branch is ahead of 'origin/master' by commits.
# (use "git push" to publish your local commits)
#
# 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: README.md
#
no changes added to commit (use "git add" and/or "git commit -a")
丢弃工作区的修改并再次查看信息
[root@mini05 zhangtest]# git checkout -- README.md # 丢弃工作区的修改
[root@mini05 zhangtest]# cat README.md
# zhangtest
zhangtest
张三
Git is a distributed version control system.
Git is free software. Git tracks changes.
[root@mini05 zhangtest]# git status
# On branch master
# Your branch is ahead of 'origin/master' by commits.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
说明:这里有两种情况
一种是README.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是README.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。
2.2. 场景2
你不但写了一些废话,还git add到暂存区了。
用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
增加信息并添加到暂存区
[root@mini05 zhangtest]# cat README.md
# zhangtest
zhangtest
张三
Git is a distributed version control system.
Git is free software. Git tracks changes.
aabbccdd # 添加的信息
[root@mini05 zhangtest]# git add README.md # 添加到暂存区
查看状态信息
[root@mini05 zhangtest]# git status
# On branch master
# Your branch is ahead of 'origin/master' by commits.
# (use "git push" to publish your local commits)
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README.md
#
回到最新版本
[root@mini05 zhangtest]# git reset HEAD README.md
Unstaged changes after reset:
M README.md
再次查看状态信息
再用git status查看一下,现在暂存区是干净的,工作区有修改:
[root@mini05 zhangtest]# git status
# On branch master
# Your branch is ahead of 'origin/master' by commits.
# (use "git push" to publish your local commits)
#
# 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: README.md
#
no changes added to commit (use "git add" and/or "git commit -a")
丢弃工作区的修改
[root@mini05 zhangtest]# git checkout -- README.md
[root@mini05 zhangtest]# git status
# On branch master
# Your branch is ahead of 'origin/master' by commits.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
[root@mini05 zhangtest]# cat README.md
# zhangtest
zhangtest
张三
Git is a distributed version control system.
Git is free software. Git tracks changes.
说明:
现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。一旦你提交推送到远程版本库,你就真的惨了……
2.3. 小结
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
3. 删除文件
3.1. 删除文件
添加文件并提交
[root@mini05 zhangtest]# echo "" > aaa.txt
[root@mini05 zhangtest]# git add aaa.txt
[root@mini05 zhangtest]# git commit -m "add aaa.txt"
[master 6d0226b] add aaa.txt
file changed, insertion(+)
create mode aaa.txt
本地删除文件并查看状态
[root@mini05 zhangtest]# rm -f aaa.txt # 本地删除
[root@mini05 zhangtest]# git status
# On branch master
# Your branch is ahead of 'origin/master' by commits.
# (use "git push" to publish your local commits)
#
# 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: aaa.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
git 删除文件并查看状态
[root@mini05 zhangtest]# git rm aaa.txt
rm 'aaa.txt'
[root@mini05 zhangtest]# git commit -m "del aaa.txt"
[master c795cfc] del aaa.txt
file changed, deletion(-)
delete mode aaa.txt
[root@mini05 zhangtest]# git status
# On branch master
# Your branch is ahead of 'origin/master' by commits.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
现在,文件就从版本库中被删除了。
3.2. 误删恢复
如果误删除本地文件了,但是没有删除版本库中的,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本.
[root@mini05 zhangtest]# git checkout -- aaa.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
3.3. 小结
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
GitHub-版本管理的更多相关文章
- Mac系统下,在android studio中使用Github版本管理
1.下载并安装github客户端http://git-scm.com/download/ 2.打开android studio,测试github是否使用ok 点击"test",如果 ...
- Github版本管理以及git使用
1.git客户端编译安装 同步系统时间服务器 ntpdate cn.ntp.org.cn 安装依赖包: [root@baolin ~]# yum install epel-release -y [ro ...
- 如何把SAP WebIDE里的Web项目同Github仓库连接起来
我们在SAP WebIDE里进行UI5应用开发时,当然也希望能将开发的代码纳入到github版本管理中去. 步骤其实非常简单. 右键点击WebIDE里UI5应用,git->Initialize ...
- git命令与协同开发
一 git命令 1.简单命令 git init # 初始化 (建立git 版本相关文件关系都放这里) git config --global user.email "you@example. ...
- 开源 ERP 系统 GoodERP
如果你有一个苹果,我也有一个苹果,彼此交换后,你我还是一人一个苹果,但是如果你有一个想法,我有一个想法,彼此交换后,你我就都有两个想法,三个人呢?一百个人呢? 使用openobject框架 重写全部功 ...
- 搜刮一些开源项目的APP
iOS完整App资源收集 <iOS完整app资源收集> <GitHub 上有哪些完整的 iOS-App 源码值得参考?> <GitHub 上有哪些完整的 iOS-App ...
- 目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?以及Github的注册过程
一.目前流行的源程序版本管理软件和项目管理软件有Microsoft TFS.GitHub.SVN.Coding等. 二.各有什么优缺点 三.在GitHub注册账户的过程 Microsoft TFS的优 ...
- 上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?并在Github注册账户,写一篇博客记录注册的过程。
问题一:上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?(以下内容为网上查询所得) Microsoft TFS(Team Foundation Server): 优点: ...
- 源代码版本管理与项目管理软件的认识与github的注册
源代码版本管理软件: 主要有:svn,cvs,hg,git,VSS 这些工具主要是一种记录代码更改历史, 可以无限回溯, 用于代码管理,多个程序员开发协作的工具.Perforce,StarTeam)- ...
- 源程序版本管理软件和项目管理软件,Github注册流程
目前流行的源程序版本管理软件和项目管理软件:Microsoft TFS,Github,SVN,Coding 各自的优缺点: Microsoft TFS: 优点: tfs核心的,是对敏捷,msf,cmm ...
随机推荐
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest(部分题解)
摘要 本文主要给出了2014-2015 ACM-ICPC, Asia Xian Regional Contest的部分题解,说明了每题的题意.解题思路和代码实现,意即熟悉区域赛比赛题型. Built ...
- KeepAlived(三):vrrp实例故障转移(keepalived+haproxy)
keepalived使用脚本进行健康检查时的相关配置项.例如keepalived+haproxy实现haproxy的高可用. keepalived分为vrrp实例的心跳检查和后端服务的健康检查.如果要 ...
- Python之使用Pandas库实现MySQL数据库的读写
本次分享将介绍如何在Python中使用Pandas库实现MySQL数据库的读写.首先我们需要了解点ORM方面的知识. ORM技术 对象关系映射技术,即ORM(Object-Relational ...
- 第一册:lesson eighty five。
原文:Paris in the spring. A:Hello,Ken. B:Hi,George. A:Have you just been to the cinema? B:Yes,I have. ...
- hive drop 报错
执行 drop database xxxx cascade; 删除数据库的时候报错. 报错信息:Execution Error, return code 1 from org.apache.hadoo ...
- 用函数式编程对JavaScript进行断舍离
译者按: 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!! 原文: How I rediscovered my love for ...
- Linux下Python安装完成后如何使用pip命令
一.很多读者Python安装完成之后,想要下载相关的包,例如:numpy.pandas等Python中这些基础的包,但是,发现pip根本用不了,主要表现在一下几种情况: 二.出现这种情况其实并不意外, ...
- JavaScript 比较 和 逻辑运算符
比较运算符 比较运算符在逻辑语句中使用,以测定变量或值是否相等. === 绝对等于(值和类型均相等) != 不等于 !== 不绝对等于(值和类型有一个不相等,或两个都不相等) > 大于 & ...
- BZOJ4484: [Jsoi2015]最小表示(拓扑排序乱搞+bitset)
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 348 Solved: 172[Submit][Status][Discuss] Descriptio ...
- 【读书笔记】iOS-更新项目前要注意的事情
在进行永久更改项目的任何现代化操作之前,要问自己几个问题. 1,我还需要返回项目的旧代码吗? 2,我的同事中有没有人无法升级到最新版本的Xcode? 3, 如果我使用了最新的功能,会不会减少用户? ...