内容简介:· 孙金帅的技术博客
安装 git
如果你正在使用Mac做开发,有两种安装 git
的方法。
- 一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档: http://brew.sh/。
-
第二种方法更简单,登录 https://developer.apple.com/download/more/
然后下载
dmg
安装,或者Terminal
运行xcode-select --install
然后点击安装。
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
创建 git
仓库
git
仓库,英文名 repository
,你可以简单理解成一个目录,这个目录里面的所有文件都可以被 git
管理起来,每个文件的修改、删除, git
都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
首先创建一个空目录:
➜ desktop git:(master) ✗ mkdir learngit ➜ desktop git:(master) ✗ cd learngit ➜ learngit git:(master) ✗ pwd /Users/michael/desktop/learngit ➜ learngit git:(master) ✗
pwd
命令用于显示当前目录的相对路径。
通过 git init
命令初始化一个 git
仓库:
➜ learngit git:(master) ✗ git init Initialized empty Git repository in /Users/michael/Desktop/learngit/.git/ ➜ learngit git:(master)
通过 ls -ah
命令可以看到当前目录下多了一个 .git
的目录,这个目录就是 git
来跟踪管理 git
库的。
➜ learngit git:(master) ls -ah . .. .git ➜ learngit git:(master)
创建测试文本文件
➜ learngit git:(master) touch readme.txt ➜ learngit git:(master) ✗ ls readme.txt ➜ learngit git:(master) ✗
通过 vim
命令添加测试内容。
➜ learngit git:(master) ✗ vim readme.txt 2 files to edit ➜ learngit git:(master) ✗
一定要放到 learngit
目录下(子目录也行),因为这是一个 git
仓库,放到其他地方 git
再厉害也找不到这个文件。
把文件添加到 git
仓库
➜ learngit git:(master) ✗ git add readme.txt ➜ learngit git:(master) ✗
把文件提交到 git
仓库
➜ learngit git:(master) ✗ git commit -m "wrote a readme file" [master (root-commit) e030980] wrote a readme file 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 readme.txt ➜ learngit git:(master) ✗
git status
修改刚才提交的 readme.txt
文件, git status
:查看 git
仓库当前的状态
➜ learngit 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: readme.txt no changes added to commit (use "git add" and/or "git commit -a") ➜ learngit git:(master) ✗
git diff
git diff
可以查看文件的修改内容
diff --git a/readme.txt b/readme.txt index e69de29..4d53f0e 100644 --- a/readme.txt +++ b/readme.txt @@ -0,0 +1,2 @@ +git is a distributed version control system. +git is free software.
版本回退
git log
查看 git
仓库里面提交的历史记录。
commit 3eb6880960b72a578eb2ee6308d6b3e26bb92e0e Author: 孙金帅 <s_mike@163.com> Date: Wed Jun 7 10:17:24 2017 +0800 add distributed commit e03098052675e44512f8f2869e2d56636eb2e16b Author: 孙金帅 <s_mike@163.com> Date: Wed Jun 7 10:01:33 2017 +0800 wrote a readme file
git log
命令显示从最近到最远的提交日志。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline
参数:
3eb6880960b72a578eb2ee6308d6b3e26bb92e0e add distributed e03098052675e44512f8f2869e2d56636eb2e16b wrote a readme file
看到的一大串类似3628164…882e1e0的是 commit id
(版本号),和 svn
不一样, git
的 commit id
不是1,2,3……递增的数字,而是一个 SHA1
计算出来的一个非常大的数字,用十六进制表示,而且你看到的 commit id
和我的肯定不一样,以你自己的为准。为什么 commit id
需要用这么一大串数字表示呢?因为 git
是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
版本回退,首先, git
必须知道当前版本是哪个版本,在 git
中,用 HEAD
表示当前版本,也就是最新的提交3628164…882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是 HEAD~1
,上上一个版本就是 HEAD~2
,往上100个版本写成 HEAD~100
。
把当前版本 “add distributed”
回退到上一个版本 “wrote a readme file”
,就可以使用 git reset
命令:
➜ learngit git:(master) git reset --hard head~1 HEAD is now at e030980 wrote a readme file ➜ learngit git:(master)
用 git log
再看看现在版本库的状态:
commit e03098052675e44512f8f2869e2d56636eb2e16b Author: 孙金帅 <s_mike@163.com> Date: Wed Jun 7 10:01:33 2017 +0800 wrote a readme file
最新的那个版本 add distributed
已经看不到了。好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个 add distributed
的commit id是3eb6880960b72a578eb2ee6308d6b3e26bb92e0e,于是就可以指定回到未来的某个版本:
➜ learngit git:(master) git reset --hard 3eb6880960b72a578eb2ee6308d6b3e26bb92e0e HEAD is now at 3eb6880 add distributed ➜ learngit git:(master)
版本号没必要写全,前几位就可以了, git
会自动去找。当然也不能只写前一两位,因为 git
可能会找到多个版本号,就无法确定是哪一个了。
查看 readme.txt
的内容:
➜ learngit git:(master) cat readme.txt git is a distributed version control system. git is free software. ➜ learngit git:(master)
git
的版本回退速度非常快,因为 git
在内部有个指向当前版本的 HEAD
指针,当你回退版本的时候, git
仅仅是把 HEAD
从指向 add distributed
:
改为指向 wrote a readme file
:
然后顺便把工作区的文件更新了。所以你让 HEAD
指向哪个版本号,你就把当前版本定位在哪。
git reflog
假如,你想回退到新版本,但是又找不到新版本的 commit id
,在git中,可以使用 git reflog
找到新版本的 commit id
。然后在使用 git reset 3eb6880960b72a578eb2ee6308d6b3e26bb92e0e
,就可以回退到新版本了。
git reflog
查看命令历史,用来记录你的每一次命令:
3eb6880 HEAD@{0}: reset: moving to 3eb6880960b72a578eb2ee6308d6b3e26bb92e0e e030980 HEAD@{1}: reset: moving to head~1 3eb6880 HEAD@{2}: reset: moving to head 3eb6880 HEAD@{3}: commit: add distributed e030980 HEAD@{4}: commit (initial): wrote a readme file
工作区和暂存区
工作区可以理解为,新建或者workingcopy下来的文件夹,可以在文件夹里面,新增删除文件等等。
暂存区可以理解为,当使用 git init
命令初始化 git
仓库里面有一个隐藏的 .git
文件,里面就存放暂存区空间和分支 master
空间,以及指向的一个指针叫 HEAD
。
使用 git add
把文件添加 git
仓库,实际上就是把文件修改添加到暂存区;
使用 git commit
提交文件,实际上就是把暂存区的所有内容提交到当前分支。
例如:
修改 readme.txt
,然后在工作区新增一个 LICENSE
文本文件。
然后, 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: readme.txt Untracked files: (use "git add <file>..." to include in what will be committed) LICENSE no changes added to commit (use "git add" and/or "git commit -a")
git
非常清楚地告诉我们, readme.txt
被修改了,而 LICENSE
还从来没有被添加过,所以它的状态是 Untracked
。
现在,使用命令 git add .
,把 readme.txt
和 LICENSE
都添加后,用 git status
再查看一下:
On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: LICENSE modified: readme.txt ➜ learngit git:(master) ✗
现在,暂存区的状态就变成这样了:
所以, git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行 git commit
就可以一次性把暂存区的所有修改提交到分支。
➜ learngit git:(master) ✗ git commit -m "understand how stage works" [master 97bf1a5] understand how stage works 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 LICENSE ➜ learngit git:(master)
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:
➜ learngit git:(master) git status On branch master nothing to commit, working tree clean ➜ learngit git:(master)
现在版本库变成了这样,暂存区就没有任何内容了:
撤销修改
场景1:当你改乱了工作区某个文件的内容。
例如,在 readme.txt
改乱了一行代码,但是没有通过 git add
命令把错误文件添加到 git
仓库里面的暂存区。
➜ learngit git:(master) ✗ cat readme.txt git is a distributed version control system. git is free software. Git has a mutable index called stage. Git tracks changes of files. My stupid boss still prefers SVN. // 错误代码 ➜ learngit git:(master) ✗
既然错误发现得很及时,就可以很容易地纠正它。你可以删掉最后一行,手动把文件恢复到上一个版本的状态。如果用git status查看一下:
➜ learngit 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: readme.txt no changes added to commit (use "git add" and/or "git commit -a") ➜ learngit git:(master) ✗
git
会告诉你, git checkout -- file
可以丢弃工作区的修改:
git checkout -- readme.txt
命令 git checkout -- readme.txt
意思就是,把 readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是 readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是 readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次 git commit
或 git add
时的状态。
查看 readme.txt
的文件内容:
➜ learngit git:(master) cat readme.txt git is a distributed version control system. git is free software. ➜ learngit git:(master)
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时.
例如,在 readme.txt
改乱了一行代码,并且使用通过 git add
命令把错误文件添加到 git
仓库里面的暂存区。但是在 commit
之前,你发现了这个问题。用 git status
查看一下,修改只是添加到了暂存区,还没有提交:
➜ learngit git:(master) ✗ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: readme.txt ➜ learngit git:(master) ✗
git
同样告诉我们,用命令 git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区:
➜ learngit git:(master) ✗ git reset HEAD readme.txt Unstaged changes after reset: M readme.txt ➜ learngit git:(master) ✗
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用 HEAD
时,表示最新的版本。
再用 git status
查看一下,现在暂存区是干净的,工作区有修改:
➜ learngit 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: readme.txt no changes added to commit (use "git add" and/or "git commit -a") ➜ learngit git:(master) ✗
然后使用 git checkout -- file
可以丢弃工作区的修改:
➜ learngit git:(master) ✗ git checkout -- readme.txt ➜ learngit git:(master) git status On branch master nothing to commit, working tree clean ➜ learngit git:(master)
删除文件
在 git
中,删除也是一个修改操作,我们实战一下,先添加一个新文件 test.txt
到 git
并且提交:
➜ learngit git:(master) touch test.txt ➜ learngit git:(master) ✗ git add test.txt ➜ learngit git:(master) ✗ git commit -m "add test.txt" [master 2c26a6d] add test.txt 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test.txt ➜ learngit git:(master)
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:
➜ learngit git:(master) rm test.txt ➜ learngit 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: test.txt no changes added to commit (use "git add" and/or "git commit -a") ➜ learngit git:(master) ✗
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令 git rm
删掉,并且 git commit
:
➜ learngit git:(master) ✗ git rm test.txt rm 'test.txt' ➜ learngit git:(master) ✗ git commit -m "remove test.txt" [master 584464a] remove test.txt 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test.txt ➜ learngit git:(master)
现在,文件就从版本库中被删除了。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
命令 git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java EE WEB开发与项目实战
李俊青 / 华中科技大学出版社 / 2011-11 / 59.80元
本书采用工程案例的形式,将日常Java EE项目开发所涉及的技术要点进行了解析,系统介绍了Apache的安装、Tomcat的安装、虚拟主机的配置、开发工具的搭配使用、验证码的使用、过滤器的使用、密码的加密与解密、JavaMail邮件发送、Web在线编辑器的使用、文件上传、数据库连接池、Ajax与Servlet的身份认证、Struts框架的应用、JSF框架的应用、Spring框架的应用、Hibern......一起来看看 《Java EE WEB开发与项目实战》 这本书的介绍吧!