您的位置:首页 > 其它

Git的简单使用方法

2017-10-23 00:01 309 查看

创建本地仓库

首先判断是否安装了git这个软件,
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
这个时候使用以下命令快速算装
sudo apt-get install git
再然后登录你的帐号
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
再然后到一个空文件夹下$ mkdir learngit$ cd learngit$ pwd/Users/michael/learngit运行如下命令,将这个文件夹变成Git可以管理的仓库
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
好了,现在可以添加文件到Git仓库了。那么如何添加呢?首先一定要再learngit/这个文件夹下创建所需要添加到Git仓库的文件。如下:言归正传,现在我们编写一个
readme.txt
文件,内容如下:Git is a version control system.Git is free software.第一步,用命令
git add
告诉Git,把文件添加到仓库:$ git add readme.txt执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。第二步,用命令
git commit
告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
为什么Git添加文件需要
add
commit
一共两步呢?因为
commit
可以一次提交很多文件,所以你可以多次
add
不同的文件,比如:$ git add file1.txt$ git add file2.txt file3.txt$ git commit -m "add 3 files."

添加远程仓库

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:在Repository name填入
learngit
,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:目前,在GitHub上的这个
learngit
仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。现在,我们根据GitHub的提示,在本地的
learngit
仓库下运行命令:
$ git remote add origin git@github.com:michaelliao/learngit.git
请千万注意,把上面的
michaelliao
替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。添加后,远程库的名字就是
origin
,这是Git默认的叫法,也可以改成别的,但是
origin
这个名字一看就知道是远程库。下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin masterCounting objects: 19, done.Delta compression using up to 4 threads.Compressing objects: 100% (19/19), done.Writing objects: 100% (19/19), 13.73 KiB, done.Total 23 (delta 6), reused 0 (delta 0)To git@github.com:michaelliao/learngit.git* [new branch]      master -> masterBranch master set up to track remote branch master from origin.
把本地库的内容推送到远程,用
git push
命令,实际上是把当前分支
master
推送到远程。由于远程库是空的,我们第一次推送
master
分支时,加上了
-u
参数,Git不但会把本地的
master
分支内容推送的远程新的
master
分支,还会把本地的
master
分支和远程的
master
分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样.从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
把本地
master
分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

那么如何

克隆版本库

在文件夹下使用如下命令:$ gti clone 远程库网址 形成的本地库名 e,g,
$ git clone https://pdos.csail.mit.edu/6.828/2017/jos.git lab

版本库操作

版本回退

     用
git log
可以查看提交历史,以便确定要回退到哪个版本$ git logcommit 017894841aeaf869287d844731132dd54c682426Author: zjWang <2537928604@qq.com>Date: Thu Oct 26 14:12:48 2017 +0800append GpLcommit 9b4c0e0118bd281312b503d4115e00d0a0e3d550Author: zjWang <2537928604@qq.com>Date: Thu Oct 26 13:21:51 2017 +0800wrote a readme filetougher@tougher-virtual-machine:~/learngit$ git logcommit 017894841aeaf869287d844731132dd54c682426Author: zjWang <2537928604@qq.com>Date: Thu Oct 26 14:12:48 2017 +0800append GpLcommit 9b4c0e0118bd281312b503d4115e00d0a0e3d550Author: zjWang <2537928604@qq.com>Date: Thu Oct 26 13:21:51 2017 +0800wrote a readme file
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令
git reset --hard commit_id
因此以下两个命令是相同的
$ git reset --hard HEAD^
$ git reset --hard 9b4c0e0
查看提交的命令的历史git reflog
$ git reflog0178948 HEAD@{0}: reset: moving to 01789489b4c0e0 HEAD@{1}: reset: moving to HEAD^0178948 HEAD@{2}: commit: append GpL9b4c0e0 HEAD@{3}: commit (initial): wrote a readme file

工作区暂存区的概念

工作区就是文件夹下能够看到的文件,隐藏的.git文件是版本库。版本库中含有stage(暂存区),master,HEAD等前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。因为我们创建Git版本库时,Git自动为我们创建了唯一一个
master
分支,所以,现在,
git commit
就是往
master
分支上提交更改。你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。俗话说,实践出真知。现在,我们再练习一遍,先对
readme.txt
做个修改,比如加上一行内容:Git is a distributed version control system.Git is free software distributed under the GPL.Git has a mutable index called stage.然后,在工作区新增一个
LICENSE
文本文件(内容随便写)先用
git status
查看一下状态:$ git status# On branch master# Changes not staged for commit:# (use "git add <file>..." to update what will be committed)4000# (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)## LICENSEno changes added to commit (use "git add" and/or "git commit -a")Git非常清楚地告诉我们,
readme.txt
被修改了,而
LICENSE
还从来没有被添加过,所以它的状态是
Untracked
。现在,使用两次命令
git add
,把
readme.txt
LICENSE
都添加后,用
git status
再查看一下:
$ git status# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##       new file:   LICENSE#       modified:   readme.txt#
现在,暂存区的状态就变成这样了:所以,
git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行
git commit
就可以一次性把暂存区的所有修改提交到分支
$ git commit -m "understand how stage works"[master 27c9860] understand how stage works2 files changed, 675 insertions(+)create mode 100644 LICENSE
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:$ git status# On branch masternothing to commit (working directory clean)现在版本库变成了这样,暂存区就没有任何内容了:

管理修改

你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。为什么说Git管理的是修改,而不是文件呢?我们还是做实验。第一步,对readme.txt做一个修改,比如加一行内容:
$ cat readme.txtGit is a distributed version control system.Git is free software distributed under the GPL.Git has a mutable index called stage.Git tracks changes.
再然后,添加$ git add readme.txt$ git status# On branch master# Changes to be committed:# (use "git reset HEAD <file>..." to unstage)## modified: readme.txt#然后,再修改readme.txt$ cat readme.txtGit is a distributed version control system.Git is free software distributed under the GPL.Git has a mutable index called stage.Git tracks changes of files.接下来,提交$ git commit -m "git tracks changes"[master d4f25b6] git tracks changes1 file changed, 1 insertion(+)提交过后查看状态$ 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")咦,怎么第二次的修改没有被提交?别激动,我们回顾一下操作过程:第一次修改 ->
git add
-> 第二次修改 ->
git commit
你看,我们前面讲了,Git管理的是修改,当你用
git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,
git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。提交后,用
git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别:$ git diff HEAD -- readme.txtdiff --git a/readme.txt b/readme.txtindex 76d770f..a9c5755 100644--- a/readme.txt+++ b/readme.txt@@ -1,4 +1,4 @@Git is a distributed version control system.Git is free software distributed under the GPL.Git has a mutable index called stage.-Git tracks changes.+Git tracks changes of files.可见。第二次确实没有被修改。那怎么提交第二次修改呢?你可以继续
git add
git commit
,也可以别着急提交第一次修改,先
git add
第二次修改,再
git commit
,就相当于把两次修改合并后一块提交了:第一次修改 ->
git add
-> 第二次修改 ->
git add
->
git commit

撤销修改

自然,你是不会犯错的。不过现在是凌晨两点,你正在赶一份工作报告,你在
readme.txt
中添加了一行:$ cat readme.txtGit is a distributed version control system.Git is free software distributed under the GPL.Git has a mutable index called stage.Git tracks changes of files.My stupid boss still prefers SVN.在你准备提交前,一杯咖啡起了作用,你猛然发现了“stupid boss”可能会让你丢掉这个月的奖金!把
readme.txt
文件在工作区的修改全部撤销,这里有两种情况:一种是
readme.txt
自修改后还没有被放到暂存区,;一种是
readme.txt
已经添加到暂存区后,。另外对于 git checkout -- filename这里有两种情况:一种是
readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是
readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次
git commit
git add
时的状态。对于第一种情况:并未添加到stage。(使用git status查看得知实地第一种情况)$ 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")因此如何呢你可以发现,Git会告诉你,
git checkout -- file
可以丢弃工作区的修改:$ git checkout -- readme.txt命令
git checkout -- readme.txt
意思就是,把
readme.txt
文件在工作区的修改全部撤销现在,看看
readme.txt
的文件内容:$ cat readme.txtGit is a distributed version control system.Git is free software distributed under the GPL.Git has a mutable index called stage.Git tracks changes of files.已经被修改回来了。第二种情况:现在假定是凌晨3点,你不但写了一些胡话,还
git add
到暂存区了:庆幸的是,在
commit
之前,你发现了这个问题。用
git status
查看一下,修改只是添加到了暂存区,还没有提交。$ git status# On branch master# Changes to be committed:# (use "git reset HEAD <file>..." to unstage)## modified: readme.txt#Git同样告诉我们,用命令
git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区:
$ git reset HEAD readme.txtUnstaged changes after reset:M       readme.txt
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用
HEAD
时,表示最新的版本。再用
git status
查看一下,现在暂存区是干净的,工作区有修改:
$ 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")
还记得如何丢弃工作区的修改吗?
$ git checkout -- readme.txt$ git status# On branch masternothing to commit (working directory clean)
现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后面会讲到远程版本库,一旦你把“stupidboss”提交推送到远程版本库,你就真的惨了……

删除文件

在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交:$ git add test.txt$ git commit -m "add test.txt"[master 94cdc44] add test.txt1 file changed, 1 insertion(+)create mode 100644 test.txt
$ rm test.txt
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,
git status
命令会立刻告诉你哪些文件被删除了
$ 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")
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令
git rm
删掉,并且
git commit
$ git rm test.txtrm 'test.txt'$ git commit -m "remove test.txt"[master d17efd8] remove test.txt1 file changed, 1 deletion(-)delete mode 100644 test.txt现在,文件就从版本库中被删除了。另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Git