git——分布式版本控制系统

一.基础知识
1.git是什么呢?
git是目前世界上最先进的分布式版本控制系统
2.关于分布式版本控制系统和集中式版本控制系统
集中式版本控制系统——版本库是集中放在中央服务器的,当我们实际工作时,用的都是自己的电脑,所以首先要连接中央服务器,从那里得到最新的版本,最后编写或者更改代码,干完活,需要把自己的推送到中央服务器。集中式版本控制系统必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,但如果在互联网的话,速度就会很慢。
分布式版本控制系统——分布式控制系统没有中央服务器,每个人的电脑都是一个完整的版本库,如果同时编写或者更改代码,只需要将各自的更改推送给对方,就可以看到对方的修改了。

二.git的使用

1.创建版本库
版本库:又名仓库,英文repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

初始化一个Git仓库,使用git init命令。

添加文件到Git仓库,分两步:

第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;

第二步,使用命令git commit,完成。
[kiosk@foundation6 ~]$ mkdir git  ##首先创建一个空目录
[kiosk@foundation6 ~]$ cd git/
[kiosk@foundation6 git]$ ls
[kiosk@foundation6 git]$ pwd
/home/kiosk/git
[kiosk@foundation6 git]$ git init  ##通过git init命令把这个目录变成Git可以管理的仓库
Initialized empty Git repository in /home/kiosk/git/.git/
##这里显示建立了一个空的仓库,这里生成一个隐藏目录.git,这个目录是用来跟踪管理版本库的

2.将文件添加到仓库

kiosk@foundation6 git]$ vim readme.txt 
git demo        
[kiosk@foundation6 git]$ git add readme.txt ##git add用来添加文件到仓库
[kiosk@foundation6 git]$ git status        ##查看仓库目前状态,可以根据判断我们的操作
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   readme.txt
#
[kiosk@foundation6 git]$ git commit -m "demo"
##git commit用来将文件提交到仓库,后面跟的内容是对本次提交的说明,commit可以一次提交很多文件,可以多次add多次后执行依次commit,依次提交多个文件
[master (root-commit) 191b57d] demo
 Committer: kiosk <kiosk@foundation6.ilt.example.com>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

 1 file changed, 1 insertion(+)
 create mode 100644 readme.txt
[kiosk@foundation6 git]$ git config --global user.name "hry"
[kiosk@foundation6 git]$ git config --global user.email yakexi007@westos
[kiosk@foundation6 git]$ cd 
[kiosk@foundation6 ~]$ cat .gitconfig 
[user]
    name = hry
    email = yakexi007@westos
[kiosk@foundation6 git]$ git log   ##git log命令显示从最近到最远的提交日志
commit 191b57d1037c6fa6969e69994fa520c13d2355c8
Author: kiosk <kiosk@foundation6.ilt.example.com>
Date:   Fri Aug 25 08:12:57 2017 +0800

    demo
[kiosk@foundation6 git]$ vim readme.txt ##这里我们对文件进行修改
git demo

hello westos
[kiosk@foundation6 git]$ 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")
##这里显示文件被修改了,但还没有被提交
[kiosk@foundation6 git]$ git diff  ##git diff可用来查看文件的改动
diff --git a/readme.txt b/readme.txt
index 00a63a3..6876dac 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,3 @@
 git demo
+
+hello westos
##这里显示文件添加了一个空行和一行hello westos
[kiosk@foundation6 git]$ git add readme.txt    
[kiosk@foundation6 git]$ git commit -m "hello"
##对修改的文件提交和对新文件的提交是一样的,需要add和commit两步
[master e770b7d] hello
 1 file changed, 2 insertions(+)
[kiosk@foundation6 git]$ git log
commit e770b7d0bdec74a3b9b3efe0398b60b01c56c6e3
Author: hry <yakexi007@westos>
Date:   Fri Aug 25 08:38:00 2017 +0800

    hello

commit 191b57d1037c6fa6969e69994fa520c13d2355c8
Author: kiosk <kiosk@foundation6.ilt.example.com>
Date:   Fri Aug 25 08:12:57 2017 +0800

    demo

3.版本回退
原理:
在git内部有个指向当前版本的HEAD指针,当回退版本时,git仅仅时将HEAD移动到回退的版本

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset –hard commit_id。

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

[kiosk@foundation6 git]$ vim readme.txt 
git demo

Git is a distributed version control system.
Git is free software distributed under the GPLhello westos

[kiosk@foundation6 git]$ git add readme.txt 
[kiosk@foundation6 git]$ git commit -m "append GPL"
[master 16df699] append GPL
 1 file changed, 2 insertions(+), 1 deletion(-)
[kiosk@foundation6 git]$ git status
# On branch master
nothing to commit, working directory clean
[kiosk@foundation6 git]$ git log
commit 16df699797cdee182fa8b527e41ec18d10f0382e
Author: hry <yakexi007@westos>
Date:   Fri Aug 25 08:41:59 2017 +0800

    append GPL

commit e770b7d0bdec74a3b9b3efe0398b60b01c56c6e3
Author: hry <yakexi007@westos>
Date:   Fri Aug 25 08:38:00 2017 +0800

    hello

commit 191b57d1037c6fa6969e69994fa520c13d2355c8
Author: kiosk <kiosk@foundation6.ilt.example.com>
Date:   Fri Aug 25 08:12:57 2017 +0800

    demo
[kiosk@foundation6 git]$ git log --pretty=oneline##如果觉得上面的信息不够清晰,可以用这个命令查看
16df699797cdee182fa8b527e41ec18d10f0382e append GPL
e770b7d0bdec74a3b9b3efe0398b60b01c56c6e3 hello
191b57d1037c6fa6969e69994fa520c13d2355c8 demo
##这里的一长串数字是commit即版本号

那么如何实现回退呢?现在我们将append GPL版本回退到hello版本
git reset 回退已经提交的仓库
HEAD 表示当前版本
HEAD^ 表示上一个版本
HEAD^^ 表示上上一个版本
HEAD~100 表示当前往上100个版本

[kiosk@foundation6 git]$ git reset --hard HEAD^
##回退到上一个版本
HEAD is now at e770b7d hello
[kiosk@foundation6 git]$ git log --pretty=oneline
e770b7d0bdec74a3b9b3efe0398b60b01c56c6e3 hello
191b57d1037c6fa6969e69994fa520c13d2355c8 demo
[kiosk@foundation6 git]$ cat readme.txt ##查看文件,已经回退
git demo

hello westos

如果回退后有后悔了,这???

只要找到要回退版本号

[kiosk@foundation6 git]$ git reset --hard 16df69
##要重新回退到append GPL版本,在上面找到他的版本号,不需要写全,只需要前六位,执行git reset命令就可以恢复
HEAD is now at 16df699 append GPL
[kiosk@foundation6 git]$ cat readme.txt 
git demo

Git is a distributed version control system.
Git is free software distributed under the GPLhello westos
##文件已经被恢复

如果我们在回退之后已经找不到之前的版本号,该怎么撤销回退呢?

[kiosk@foundation6 git]$ git reflog
##git reflog这个命令记录了每一次命令,可以查询每一个出现过的版本号
16df699 HEAD@{0}: reset: moving to 16df69
e770b7d HEAD@{1}: reset: moving to HEAD^
16df699 HEAD@{2}: commit: append GPL
e770b7d HEAD@{3}: commit: hello
191b57d HEAD@{4}: commit (initial): demo

4.工作区和赞存区

Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

对readme文件改动同时新建一个test文件
[kiosk@foundation6 git]$ vim readme.txt 
git demo

Git is a distributed version control system.
Git is free software distributed under the GPLhello westos
Git has a mutable index called stage.
[kiosk@foundation6 git]$ vim test
haacascsdncsvsv
[kiosk@foundation6 git]$ git add readme.txt    ##添加到仓库
[kiosk@foundation6 git]$ git add test 
[kiosk@foundation6 git]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   readme.txt
#   new file:   test
#
[kiosk@foundation6 git]$ git commit -m "haha"
[master 93e3a1b] haha
 2 files changed, 2 insertions(+)
 create mode 100644 test
##git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

5.撤销修改

1)修改后还没有被放到暂存区
[kiosk@foundation6 git]$ cat test
haacascsdncsvsv
[kiosk@foundation6 git]$ vim test  ##对文件进行修改
haacascsdncsvsv

hhhhhhhhhhhhhhhhhh
[kiosk@foundation6 git]$ git checkout -- test ##git checkout -- file可以丢弃工作区的修改
[kiosk@foundation6 git]$ cat test 
haacascsdncsvsv

2)已经添加到暂存区后,没有提交
[kiosk@foundation6 git]$ cat test 
haacascsdncsvsv
[kiosk@foundation6 git]$ vim test
haacascsdncsvsv

wwwwwwwwwwwwwwwww
[kiosk@foundation6 git]$ git add test
[kiosk@foundation6 git]$ cat test 
haacascsdncsvsv

wwwwwwwwwwwwwwwww
[kiosk@foundation6 git]$ git reset HEAD test       ##先将修改撤回到工作区
Unstaged changes after reset:
M   test
[kiosk@foundation6 git]$ git checkout -- test      ##然后在删除工作区的修改,就恢复了
[kiosk@foundation6 git]$ cat test
haacascsdncsvsv

3)修改后添加到暂存区并且做了提交要恢复就是作版本回退,参考上文

6.删除文件
[kiosk@foundation6 git] vimtest.txthappy[kiosk@foundation6git] git add test.txt
[kiosk@foundation6 git] gitcommitmtest[master407584b]test1filechanged,1insertion(+)createmode100644test.txt[kiosk@foundation6git] rm test.txt
[kiosk@foundation6 git] gitrmtest.txtrmtest.txt[kiosk@foundation6git] git commit -m “remove”
[master 998bca9] remove
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
二.远程仓库
1.配置ssh远程连接仓库
[kiosk@foundation6 ~] sshkeygentrsaC674211605@qq.comGeneratingpublic/privatersakeypair.Enterfileinwhichtosavethekey(/home/kiosk/.ssh/idrsa):Enterpassphrase(emptyfornopassphrase):Entersamepassphraseagain:Youridentificationhasbeensavedin/home/kiosk/.ssh/idrsa.Yourpublickeyhasbeensavedin/home/kiosk/.ssh/idrsa.pub.Thekeyfingerprintis:f5:21:2b:1c:6d:d1:f9:98:6a:84:64:ad:ae:d1:19:4f674211605@qq.comThekeysrandomartimageis:+[RSA2048]+|.||oo||o.o=.+||.++E+o..||oS||.+.+||o.||.|||++[kiosk@foundation6 ] cd .ssh/
[kiosk@foundation6 .ssh] lsauthorizedkeysidrsaidrsa.pubknownhosts[kiosk@foundation6.ssh] cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCnmJutGtNpgrMjHZukX2KWvuWouiaJb4KhH8kHzSp/faCEzY9/14tEBBAQmqXMyLLzwR9yL1P7MsK/0JaQCAUfeEpybenEuIwFetX75N/LPpqcBMvN7rYYzWJy5GfcwMvjpn4No6pB2rYGMDjjh3nFAHCcJqatwufVzZr2B8QNDDn60Ac67RMBWR5ZHnDBiJ8xtoEAM0lL5pyszn47JL6QZU9vgafybZ9UMZZOcMIcye0OjmlrFXzN1Rb6ro/xAzEBL32EX6D43x1Hysyv9gQnnq2gCabTrfqHYZEAmqIaWHNCzGKd3NsO45aurCPOwxpdOqTAKUy9ijDE5UTNF4J 674211605@qq.com
这里写图片描述

2.关联远程库
在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。

首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
这里写图片描述

在本地的learngit仓库下运行命令:
[kiosk@foundation6 git]$ git remote add origin git@github.com:csdn066/test.git

把本地库的所有内容推送到远程库上:
[kiosk@foundation6 git]$ git push -u origin master
The authenticity of host 'github.com (192.30.255.112)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.255.112' (RSA) to the list of known hosts.
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (22/22), 1.79 KiB | 0 bytes/s, done.
Total 22 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), done.
To git@github.com:csdn066/test.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
这里写图片描述

3.从远程库克隆

首先,登陆GitHub,创建一个新的仓库,名字叫westos:
这里写图片描述

勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件

用命令git clone克隆一个本地库:
[kiosk@foundation6 git] gitclonegit@github.com:csdn066/westos.gitCloningintowestosremote:Countingobjects:3,done.remote:Total3(delta0),reused0(delta0),packreused0Receivingobjects:100[kiosk@foundation6git] ls ##本地会生成一个westos目录,在目录里有一个README.md文件
readme.txt westos
[kiosk@foundation6 git] cdwestos/[kiosk@foundation6westos] ls
README.md
三.分支管理
1.创建并合并分支
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d

[kiosk@foundation6 git]$ git checkout -b dev   
##git checkout命令加上-b参数表示创建并切换,相当于上面两条命令
Switched to a new branch 'dev'
[kiosk@foundation6 git]$ git branch ##git branch命令查看当前分支,当前分支前面会标一个*号
* dev
  master

[kiosk@foundation6 git]$ vim readme.txt ##在dev分支上作修改,并提交
git demo

Git is a distributed version control system.
Git is free software distributed under the GPLhello westos
Git has a mutable index called stage.
Git tracks changes.

Creating a new branch is quick.
[kiosk@foundation6 git]$ git add readme.txt 
[kiosk@foundation6 git]$ git commit -m "branch test"
[dev ef15c80] branch test
 1 file changed, 2 insertions(+)
[kiosk@foundation6 git]$ git checkout master
Switched to branch 'master'
[kiosk@foundation6 git]$ cat readme.txt ##提交是在dev分支上,而master分支此刻的提交点并没有变
git demo

Git is a distributed version control system.
Git is free software distributed under the GPLhello westos
Git has a mutable index called stage.
Git tracks changes.
[kiosk@foundation6 git]$ git merge dev     ##dev分支的工作成果合并到master分支上
Updating 998bca9..ef15c80
Fast-forward
 readme.txt | 2 ++
 1 file changed, 2 insertions(+)
[kiosk@foundation6 git]$ cat readme.txt 
##合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的
git demo

Git is a distributed version control system.
Git is free software distributed under the GPLhello westos
Git has a mutable index called stage.
Git tracks changes.

Creating a new branch is quick.

[kiosk@foundation6 git]$ git branch -d dev     ##合并之后我们就可以将dev分支删除掉了
Deleted branch dev (was ef15c80).
[kiosk@foundation6 git]$ git branch
* master
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值