Git基础知识学习1

来源:互联网 发布:正在优化social club 编辑:程序博客网 时间:2024/06/07 09:48

Git基础知识学习1

Git是分布式版本控制系统,CVS和SVN都是集中式的版本控制系统。集中式版本控制系统,版本库是几种存放在中央服务器的,需要先从中央服务器获取最新的版本,最后再推送给中央服务器。集中式版本控制系统必须联网才能工作。分布式版本控制系统没有“中央服务器”,每个电脑上都是一个完整的版本库,不需要联网。

安装Git

1、在Linux上安装

首先,输入git,看系统有没有安装Git。

Debian或Ubuntu Linux,可以通过sudo apt-get install git就可以直接完成GIt的安装。

老一点的Debian或Ubuntu Linux,命令为sudo apt-get install git-core

如果是其他Linux版本,可以直接通过源码安装。先从GIt官网下载源码,然后解压,依次输入:./config,make,sudo make install

2、在Mac OS X上安装Git

有两种安装GIt的方法:1、安装homebrew,然后通过homebrew安装Git,具体方法参考homebrew的文档:http://brew.sh/。2、直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,需要运行Xcode,选择菜单“Xcode->Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点install就可以完成安装。

3、在Windows上安装Git

在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。安装完成后,在开始菜单中找到"Git"->"Git Bash“,出现一个类似命令行的窗口,说明Git安装成功。安装完成后,需要进行设置,在命令行中输入:$git config --global user.name "Your name"       $git config --global user.email "email@example.com"

注意,git config 命令的 --global参数,用了这个参数,表示这台机器上所有的GIt仓库都会使用这个配置,当然也可以对某个仓库指定不用的用户名和Emai地址。

创建版本库

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

创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:

$ mkdir learngit

$ cd learngit

$ pwd

/User/michael/learngit

如果使用的是Windows系统,确保目录名(包括父目录)不包含中文。

通过git init命令把这个目录编程Git可以管理的仓库:

$ git init

Initialized empty Git repository in /User/michael/learngit/.git

如果是Windows系统,可以使用Git Bash直接创建版本库。并且千万不要使用Windows自带的记事本编辑任何文本文件。建议使用Notepad++替代记事本,把Notepad++的默认编辑设置为UTF-8 without BOM。


将文件添加到版本库示例:

编写一个readme.txt文件,内容如下:

Git is a version control system.

Git is free software.

一定要放到learngit目录下(子目录也行)。

用命令git add 告诉Git,把文件添加到仓库。

$ git add readme.txt

用命令git commit告诉Git,把文件提交到仓库。

$ git commit -m "wrote a readme file"

[master (root-commit) 1dd0b93] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt


简单解释命令git commit-m后面输入的本次提交的说明,可以输入任意内容,最好是有意义的,这样就能从历史记录里方便找到改动记录。不输入-m "xxx",可以这么干,但不建议,输入说明对自己对别人阅读都很重要。

版本回退

对readme.txt文件进行修改,然后把修改提交到Git版本库。

readme.txt一共有三个版本提交到Git仓库里了,版本1——wrote a readme file;版本2——add distributed;版本3——append GPL;

在Git中,可以使用git log命令查看历史记录。

$ git log
commit d563b94243836b68976fe996b2e9be0cedfca813 (HEAD -> master)
Author: sherry1993 <sherry120220320@163.com>
Date:   Thu Dec 7 10:32:26 2017 +0800

    append GPL

commit 4795dfef0597daadf6712e24a0ed55b06008c9fb
Author: sherry1993 <sherry120220320@163.com>
Date:   Thu Dec 7 10:31:32 2017 +0800

    add distributed

commit 1dd0b93912387e2a295832e9a76f72712fa93410
Author: sherry1993 <sherry120220320@163.com>
Date:   Thu Dec 7 10:14:51 2017 +0800

    wrote a readme file

如果觉得输出信息太多,可以加上--pretty=oneline参数

$ git log --pretty=oneline
d563b94243836b68976fe996b2e9be0cedfca813 (HEAD -> master) append GPL
4795dfef0597daadf6712e24a0ed55b06008c9fb add distributed
1dd0b93912387e2a295832e9a76f72712fa93410 wrote a readme file


前面类似d563b...ca813commit id(版本号)。在GIt中,用HEAD表示当前版本,上一个版本是HEAD^,上上一个版本就是HEAD^^,往上100个版本,是HEAD-100.

要把当前版本"append GPL"回退到上一个版本“add distributed”,可以使用git reset命令。

$ git reset --hard HEAD^
HEAD is now at 4795dfe add distributed


查看readme.txt的内容

$ cat readme.txt
Git is a version control system
Git is free software.
Git is a distributed version control system.

还可以使用git log查看现在版本库的状态:

$ git log
commit 4795dfef0597daadf6712e24a0ed55b06008c9fb (HEAD -> master)
Author: sherry1993 <sherry120220320@163.com>
Date:   Thu Dec 7 10:31:32 2017 +0800

    add distributed

commit 1dd0b93912387e2a295832e9a76f72712fa93410
Author: sherry1993 <sherry120220320@163.com>
Date:   Thu Dec 7 10:14:51 2017 +0800

    wrote a readme file

回退到append GPL,找到append GPLcommit id

$ git reset --hard  d563b94243836b68976fe996b2e9be0cedfca813
HEAD is now at d563b94 append GPL


Git提供了一个命令git reflog用来记录每一次命令

$ git reflog
d563b94 (HEAD -> master) HEAD@{0}: reset: moving to d563b94243836b68976fe996b2e9be0cedfca813
4795dfe HEAD@{1}: reset: moving to HEAD^
d563b94 (HEAD -> master) HEAD@{2}: reset: moving to HEAD
d563b94 (HEAD -> master) HEAD@{3}: commit: append GPL
4795dfe HEAD@{4}: commit: add distributed
1dd0b93 HEAD@{5}: commit (initial): wrote a readme file

小结:

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

git log可以查看提交历史,以便确定回退的版本。

git reflog查看命令历史,以便确定回到未来的版本。


工作区和暂存区

工作区,就是在电脑中看到的目录,learngit文件夹就是一个工作区。

版本库,工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存放了很多东西,其中最重要的就是成为stage的暂存区,还有Git自动创建的第一个分支master,以及指向master的一个指针HEAD


git add把文件添加进去,实际上就是把文件修改添加到暂存区。

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

创建Git版本库时,Git自动创建了唯一一个master分支,git commit就是往master分支上提交更改。

第一次修改->git add->第二次修改->git add->git commit

每次修改,如果不add到暂存区,就不会加入到commit中。


撤销修改

git checkout --readme.txt命令,把readme.txt文件在工作区的修改全部撤销,有两种情况:

一是readme.txt自修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态;

二是readme.txt已经添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

git checkout --file命令中的--很重要,没有--,就是另一个命令。

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。


小结

场景1:若改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout --file

场景2:若该乱了工作区某个文件的内容,还添加到暂存区,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,首先将版本回退,然后按场景2操作。不过前提是没有推送到远程库。


删除文件

使用rm命令删除文件

$ rm test.txt

如果确定要删除文件,就用命令git rm删掉,并且git commit

$ git rm test.txt
rm 'test.txt'

$ git commit -m "remove test.txt"
[master c33a95b] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt


文件就从版本库中被删除了。

如果是误删文件,在版本库中还有,可以把误删文件恢复到最新版本。

$ git checkout -- test.txt

git checkout其实就是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。


小结

命令git rm用于删除一个文件,如果一个文件已经被提交到版本库,不用担心误删,但仍需小心,只能恢复文件到最新版本,会丢失最后一次修改的内容


添加远程库

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

首先,登录GitHub,“Create a new repo”,创建一个新的仓库;

在本地仓库下运行命令:

$ git remote add origin git@github.com:michaelliao/learngit.git

上面的michaelliao替换成自己的GItHub账户名,learngit为GitHub的仓库。添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改为别的。

下一步,把本地库的所有内容推送到远程库上

$ git push -u origin master

Counting 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 -> master

Branch masterset up to track remote branch master from origin.

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

远程库是空的,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

$ git push origin master

SSH警告

当第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告

The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.

RSA key fingerprint is xx.xx.xx.xx.xx.

Are you sure you want to continue connecting (yes/no)?

这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要确认GitHub的Key的指纹信息是否真的来自GItHub的服务器,输入yes回车即可。

Git会输出一个警告,告诉你已经把GItHub的Key添加到本机的一个信任列表里了

Warning: Permanently added'github.com' (RSA) to the list of known hosts.

这个警告只会出现一次,后面的操作就不会有任何警告了。

如果实在担心有人冒充GitHub服务器,输入yes前可以对照GItHub的RSA Key的指纹信息是否与SSH连接给出的一致。

小结

关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

关联后,使用命令git push -u origin master第一次推送master分支的所有内容

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改

常见连接远程库的错误,可查看博客fatal: Could not read from remote repository.的解决办法


从远程库克隆

使用命令git clone将远程库克隆到本地库

$ git clone git@github.com:Yixiaohan/show-me-the-code
Cloning into 'show-me-the-code'...
remote: Counting objects: 93, done.
remote: Total 93 (delta 0), reused 0 (delta 0), pack-reused 93
Receiving objects: 100% (93/93), 22.08 KiB | 95.00 KiB/s, done.
Resolving deltas: 100% (26/26), done.

GitHub给出的地址不止一个,还可以使用https://github.com/Yixiaohan/show-me-the-code.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以https等其他协议。使用https除了速度慢以外,还有个最大的麻烦就是每次推送都必须输入口令,但是某些只开发http端口的公司内部就无法使用ssh协议而只能用https

小结

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone 命令克隆。

Git支持多种协议,包括https,但通过ssh支持的原生的git协议速度最快。



原创粉丝点击