git(github)版本控制
最近在学习git,在网上也看了很多教程,也跳了很多坑,在这里给大家分享一下吧,希望我跳过的坑大家就不要跳了。。。
准备Git
什么是git???
git是全世界最好用的分布式版本控制系统。那么什么又是版本控制,为什么要用版本控制呢?就是对于一个项目或者一段代码,你改了又改,版本控制会帮你记录你改过的东西并可以在你改过的任意版本之间自由穿梭,是不是很酷呢?OK,Let‘s begin!
安装Git
Mac系统:
先安装homebrew,终端输入
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
等待大约1分钟左右,下载完成,过程中需输入密码,无需其他操作。
homebrew安装完成后安装git,终端输入
brew install git
还有一种安装方法,从AppStore中下载Xcode,Xcode中集成Git,不过默认为有安装。选择Xcode->preferences,在弹出窗口中找到Downloads,选择Command Line Tools,点Install就可以了。
Windows系统:
Windows用户可以直接从Git官网上下载,或者可以从国内镜像下载。然后按照默认安装选项进行安装即可。安装完成后,在开始菜单中找到Git->Git Bash,会弹出一个命令行窗口,代表安装成功。
安装完成后,要进行设置,在命令行(终端)输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
此处是设置用户名,和邮箱。
Git初体验
创建版本库(repository)
版本库本质上就是一个目录,只是在这个目录中的文件都可以被Git所管理,即实现版本控制。
首先你需要选择一个合适的位置新建一个文件夹,然后进入该文件夹。
$mkdir testgit
$ cd learngit
然后通过以下代码将这个目录变成可以被git管理的版本库
$git init
Initialized empty Git repository in /usr/local/testgit/.git/
版本库已建好,目录中会多一个.git的隐藏文件,这个文件是包含一些git配置,不要乱改。(看隐藏文件命令:ls -a)
添加文件到版本库
之前我们已经建立好了版本库,现在可以向版本库中添加我们向管理的文件。在此我向版本库中添加了一个helloworld.txt文件,内容为helloword。
我们已经在目录中添加一了一个文件,想当与对版本库进行了“修改”,当我们修改结束后,需要告诉git,我已经修改好了,请将我的修改更新至版本库。此时需要进行两步操作:
$ git add helloworld.txt
$ git commit -m "wrote a file"
解释一下,第一步“add”是将修改添加至版本库,第二步“commit”提交这次修改,其中-m参数代表此次提交的信息。提交成功后,版本库内容进行了更新。
版本退回
在此首先我们先介绍一个命令git status,表示现在版本库的状态。
$ git status
On branch master
nothing to commit, working tree clean
现在的状态代表没有修改也没有提交。下面我们修改一下之前添加的helloworld.txt文件。在下面添加一行hellogit
然后我们再一次使用
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: helloworld.txt
no changes added to commit (use "git add" and/or "git commit -a")
上面的意思就是我们修改了helloworld.txt文件,但是没有提交。我们怎么能看哪里修改了呢?,就会用到git diff
命令
diff --git a/helloworld.txt b/helloworld.txt
index 31e0fce..93c98ef 100644
--- a/helloworld.txt
+++ b/helloworld.txt
@@ -1 +1,2 @@
helloworld
+hellogit
上面显示了我新加了一行hellogit。然后我就可以提交修改了,还是两步,我们先add一下,然后用git atatus
命令看一下版本库状态。
$git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: helloworld.txt
输出信息提示我们helloworld.txt的修改将要被提交。然后我们就提交一下吧。
$git commit -m "add hellogit"
[master cf11128] add hellogit
1 file changed, 1 insertion(+)
然后再git status
一下
$git status
On branch master
nothing to commit, working tree clean
就又回到没有修改的状态了。然后我们可以使用git log
查看我们提交的历史。
$git log
commit cf111280924bce3c78b5abe3c80cbafa36b0c632 (HEAD -> master)
Author: Desire-zone <m15045588290@163.com>
Date: Tue Oct 9 15:33:36 2018 +0800
add hellogit
commit 8aad9f5dfb84eb6bff35f6cc012c93727c9cc416
Author: Desire-zone <m15045588290@163.com>
Date: Tue Oct 9 15:11:36 2018 +0800
init commit
我们可以看到我们一共提交了两次以及提交信息,(HEAD->master)代表当前的版本,commit后面一串东西cf1112...代表版本号。
下面重点来了,如果我们想回到之前也就是第一次提交的版本怎么办呢?我们可以使用git reset
命令,后面加上HEAD
参数,HEAD^ 或者HEAD~1表示上一版本,HEAD^^ 或者HEAD~2表示上两个版本,以此类推。
$git reset --hard HEAD^
HEAD is now at 8aad9f5 init commit
看一下我们的helloworld.txt
好了,现在我们已经成功穿梭回过去的版本了。我们使用
git log
看一下
$git log
commit 8aad9f5dfb84eb6bff35f6cc012c93727c9cc416 (HEAD -> master)
Author: Desire-zone <m15045588290@163.com>
Date: Tue Oct 9 15:11:36 2018 +0800
init commit
我们发现我们回到了过去的版本了,但是未来的版本不见了,我们怎么回到未来呢?一种方法我们可以向上翻之前的命令,会找到未来版本的版本号,或者使用git reflog
来查看历史命令,进而可以找到版本号,使用git reset
加上版本号可以穿梭回未来。
$git reset --hard cf11128
HEAD is now at cf11128 add hellogit
我们成功穿梭回未来了,是不是很有趣~。(hard参数先不用知道是干什么的,注意--和hard之间没有空格)
撤销修改
当我们修改了文件但是还没提交,我们怎样撤销修改呢???我们需要使用git checkout -- <file>
命令,我们来试一下。首先在helloworld.txt文件里加点东西
第三行是我新加的,使用
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: helloworld.txt
no changes added to commit (use "git add" and/or "git commit -a")
提示我们修改未提交,此时我们使用git checkout -- helloworld.txt
进行撤销修改然后在用git status
看一下状态
$git checkout -- helloworld.txt
[wangzhiwen@wangzhiwendeMacBook-Air ~/Desktop/testgit]$git status
On branch master
nothing to commit, working tree clean
信息提示我们没有修改要提交,再看一下hello world.txt文件
修改已经被我们撤销了。下面介绍另一种情况,如果我们修改了文件,并且已经add了,然后我们想撤销又能怎么办呢?我们可以使用
git reset HEAD <file>
进行撤销。我们试一下,在helloworld.txt中再添加一行。下面我们add一下。 然后使用
git reset HEAD <file>
进行撤销
git reset HEAD helloworld.txt
Unstaged changes after reset:
M helloworld.txt
此时用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: helloworld.txt
no changes added to commit (use "git add" and/or "git commit -a")
此时文件已变成修改未add状态,然后我们还需要使用git checkout -- <file>
来进行撤销修改。
$git checkout -- helloworld.txt
$git status
On branch master
nothing to commit, working tree clean
此时显示工作区已经干净了,变成了无修改状态。再看下文件。
大功告成。
Git进阶篇
关联远程库Github
至此我们已经可以自由的在本地的管理库中自由穿梭了,但这还不够,接下来要介绍Git的进阶功能——连接远程版本库。Git具有分布式的特点,对于一个版本库,可以分布到远程服务器上,说到这里不得不说一下我们开园的天堂——GIthub,GIthub是一个代码托管平台,我们可以把本地的版本库与Github关联进行版本控制。
想要关联远程库,首选需要注册一个GitHub账号,这个自行完成。注册完成后,登陆GitHub,在右上角找到“new reposotory”按钮创建一个想要关联的远程版本库,名字最好和本地版本库一样testgit。其他保持默认设置就好,创建好如下图:
远程库创建好以后,我们开始进行关联。
首先要创建SSH KEY。打开终端(Windows下打开Git Bash),用以下命令创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要邮箱换成你自己的邮箱,然后一路回车即可。创建成功以后,你会在用户主目录里找到.ssh目录(隐藏文件),里面有id_rsa和id_rsa.pub两个文件,其中id_rsa是私钥,不能泄漏出去。然后进入GitHub,打开“Personal settings”,进入“SSH and GPG keys”页面,点击“new SSH key”,Tittle随便写,key里面粘贴你的id_rsa.pub文件里的内容。然后点击“Add SSH key”就可以了。
接下来回到本地库运行一下命令:
$ git remote add origin git@github.com:Desire-zone/testgit.git
把Desire-zone
换成你的Github账户名。
接下来就可以把用git push
命令把本地版本库的所有内容推送到Github上了。
$ git push -u origin master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 462 bytes | 462.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'master' on GitHub by visiting:
remote: https://github.com/Desire-zone/testgit/pull/new/master
remote:
To github.com:Desire-zone/testgit.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
注意:由于我们新创建的远程库是空的,我们第一次推送时,加上了-u
参数,Git不但会把本地内容推送到远程库,还会把本地版本库与远程版本库进行关联,再以后推送的时候就不需要该参数了。
现在我们会发现Github远程库的内容和本地库的内容一样了。以后每次在本地提交以后,都可以通过一下命令进行推送。
$ git push origin master
从Github上克隆
之前我们已经学会了如何讲本地版本库和远程库关联并从推送本地内容到远程库,现在我们要将一下如何从Github上克隆版本库到本地。
首先我们新建一个仓库,为了让仓库里面有些文件,我们建的时候勾上Initialize this repository with a README
,这样就会自动为我们在仓库里面创建一个文件,仓库名字可以叫做clonegit。
下面我们就可以使用git clone
命令克隆一个本地库出来。
$ git clone git@github.com:Desire-zone/clonegit.git
Cloning into 'clonegit'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
然后你会在当前目录下发下一个本地的clonegit代码库,打开后里面会有一个README文件。至此我们成功将GIthub上的仓库克隆到了本地。
网友评论