Git教程

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上的仓库克隆到了本地。

Git分支管理

Git具有很强大的分支管理功能。什么是分支管理,为什么要进行分支管理?在一个大的项目开发过程中,要有很多人参与,每个人分工不同,分别完成自己的工作,分支管理就是要协调每个人做不同的工作,并对他们的工作进行融合。首先会有一条主分支master,我们之前的所有操作都是在master上进行的。通常主分支上的项目是稳定的版本,可供用户使用的版本,然后开发人员要新建develop分支,这个分支可以看作是主分支的副本,每个人都在副本上进行开发,开发完成后合并到master上,合并的操作就是使master的指针指向develop。然后就可以删除develop指针,只剩下master分支。下面我们实际操作一下。
首先我们可以使用git checkout -b命令创建dev分支并切换到dev分支。(等等,之前不是说git checkout命令是撤销修改的命令吗,怎么又用它来创建分支呢?其实是根据git checkout后面的参数来确定它到底是什么功能的。如果git checkout branchname即不加参数直接加分支名字代表切换分支。而创建分支的命令是git branch branchname,以上两条命令可以合在一起写就变成了git checkout -b branchname表示创建分支并切换至该分支。而git checkout -- filename表示撤销该文件的修改,不要弄混了。)

$git checkout -b dev
Switched to a new branch 'dev'  

然后可以用git branch命令查看当前分支:

$git branch
* dev
  master  

可以看到当前有两个分支,*代表当前指针指向的分支。然后我们在dev分支对helloworld.txt进行修改并提交。加上一行:i am devbranch。

$git add helloworld.txt  
$git commit -m "dev modified"  
[dev 3321469] dev modified  
 1 file changed, 1 insertion(+)  

然后我们切换回master分支

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.  

然后再打开helloworld.txt文件发现刚刚添加的那句话不见了。这说明在dev分支上的提交并不能影响到master分支。而现在,我在dev上的开发任务做完了,需要把它合并到master分支上。需要用git merge命令。

$git merge --no-ff -m "keep merge info" dev
Merge made by the 'recursive' strategy.
 helloworld.txt | 1 +
 1 file changed, 1 insertion(+)

在此查看helloworld.txt文件的内容,发现刚刚添加的那句话又出来了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值