Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git是 Linus Torvalds 为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
Git安装
对于Linux或Unix系统,可通过apt-get install git
指令安装。Mac或Windows用户可以选择在Git官网,选择相应的版本手动安装。
创建版本库与提交
版本库repository创建,可理解为一个目录。在本地可以选择合适的地方通过mkdir test
创建一个空目录test。通过git init
命令把这个目录变成Git可以管理的仓库:
1 | $ git init |
生成的.git
目录是用来跟踪管理这个仓库,切勿删除。接着我们可以创建一个doc.txt
,并在文件内编辑好内容,放在text
目录下。
第一步,用命令git add
告诉Git
1 | $ git add doc.txt |
第二步,用命令git commit
告诉Git
,把文件提交到仓库:
1 | $ git commit -m "doc file" |
其中-m
后面为本次提交的说明,便于自己和他人阅读。commit
可以一次提交很多文件,所以你可以多次add不同的文件,比如:
1 | $ git add file1.txt |
回退与修改
回退与恢复
当我们在不断修改doc.txt
文件,时不时add
与commit
,可以通过git log
命令查看每次修改的内容。
如果嫌输出信息太多,看得眼花缭乱的,可以试试git log --pretty=oneline
Git
中head
表示当前版本,若想要回退到之前的某个版本,可以使用:
1 | $ git reset --hard <commit id> |
其中commit id
为版本号,由一大串数字与字母组成。HEAD^
表示上一个版本,HEAD^^
表示上上一个版本。HEAD~50
表示往上第50个版本。
Git提供了一个命令git reflog
用来记录你的每一次命令,便于回退与恢复。
工作区与暂存区
工作区(Working Directory):就是你在电脑里能看到的目录,比如test文件夹就是一个工作区。
暂存区(Stage):用git add
把文件添加进去,实际上就是把文件修改添加到暂存区。注意此时还没使用git commit
。
执行git commit
就可以一次性把暂存区的所有修改提交到分支。
一旦执行git commit
,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。git commit
只负责把暂存区的修改提交,注意和git add
的配合使用。
撤销与删除
内容修改
我们可以通过git status
时刻查询版本状态。
命令git checkout -- doc.txt
意思就是,把doc.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是doc.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是doc.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,git checkout -- filename.txt
就是让这个文件回到最近一次git commit
或git add
时的状态。
倘若已添加到了暂存区时,想丢弃修改,可使用git reset HEAD <file>
把暂存区的修改撤销掉重新放回工作区,再运用git checkout -- filename.txt
命令撤销在工作区的修改。
总结:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退,不过前提是没有推送到远程库。
文件修改
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm filename.txt
命令删了,这是Git
知道你删除了文件,因此,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了。
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
。此时,文件就从版本库中被删除了。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
1 | $ git checkout -- doc.txt |
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
总之,命令git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
远程仓库
如果你已经在本地创建了一个Git
仓库后,又想在GitHub
创建一个Git
仓库,并且让这两个仓库进行远程同步,这样,GitHub
上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。
倘若在Github
上新建一个名为testre
的repository
,可以通过
1 | $ git remote add origin git@github.com:GitHubname/testre.git |
将本地库与远程库关联,远程库的名字就是origin
,这是Git
默认的叫法。当然也可以将origin
用其他名代替。
把本地库的所有内容推送到远程库上:
1 | $ git push -u origin master |
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
由于远程库是空的,第一次推送master
分支时,加上了-u
参数,Git
不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
之后每次的修改提交,可以不加-u
参数:$ git push origin master
远程克隆:
1 | $ git clone git@github.com:GitHubname/testre.git |