git介绍

Git是目前世界上最先进的分布式版本控制系统,与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

集中式vs分布式:Git教程- 廖雪峰的官方网站

  • 集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
  • 段落引用分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

git安装

1. Linux

sudo apt-get install git

2. Windows

git官网下载:git下载
设置用户

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

创建本地仓库

1. 新建仓库

$ git init
Initialized empty Git repository in D:/testgit/.git/

2. 把新增文件添加仓库

git add告诉Git,把文件添加到仓库,git add后跟文件名或者.,.表示所有文件

git add readme.txt
git add .

3. 文件提交到仓库

$ git commit -m "test"
[master (root-commit) 60bffb4] test
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

git commit命令,-m后面输入的是本次提交的说明,方便在历史记录里方便地找到改动记录。
git commit命令执行成功后会告诉你,1 file changed:1个文件被改动(新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容)。

git checkout -- readme.txt

意思就是,把readme.txt文件在工作区的修改全部撤销,就是让这个文件回到最近一次git commit或git add时的状态。

版本管理

修改readme.txt文件,增加一些内容,随后查看状态:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

git status查看仓库当前状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index f0ec47f..ee2c1ea 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
 Git is free software
\ No newline at end of file

查看修改后的不同之处.之后再次添加和提交即可

版本回退

commit相当于一个快照,误删了文件,还可以从最近的一个commit恢复.在Git中,我们用git log命令查看历史提交记录.

$ git log
commit 49b50fc00a1af29c9deb45e4eaf01cf168b1dc69 (HEAD -> master)
Author: hao <springhao233@gmail.com>
Date:   Wed Aug 25 10:36:17 2021 +0800

    3

commit 76aaebb8ba0216719c4e4d9c2bd5c88d55692d8a
Author: hao <springhao233@gmail.com>
Date:   Wed Aug 25 10:34:54 2021 +0800

    add

commit 60bffb4ec6f9804bdbe7d6d8dd235facea0fdc43
Author: hao <springhao233@gmail.com>
Date:   Wed Aug 25 10:11:19 2021 +0800

    test

查看精简历史记录

$ git log --pretty=oneline
49b50fc00a1af29c9deb45e4eaf01cf168b1dc69 (HEAD -> master) 3
76aaebb8ba0216719c4e4d9c2bd5c88d55692d8a add
60bffb4ec6f9804bdbe7d6d8dd235facea0fdc43 test

在Git中,用HEAD表示当前版本,也就是最新的提交49b50f...,上一个版本就是HEAD ,往上100个版本写100个比较容易数不过来,所以写成HEAD~100
如果要把版本回退到上个版本即add这个版本,使用命令:

$ git reset --hard HEAD~
HEAD is now at 76aaebb add

回退版本后悔了,需要恢复到新版本git reset --hard 版本号,这时git log无法查看版本号,可以使用命令查看自己的所有操作记录:

$ git reflog
76aaebb (HEAD -> master) HEAD@{0}: reset: moving to HEAD~
49b50fc HEAD@{1}: reset: moving to 49b50
76aaebb (HEAD -> master) HEAD@{2}: reset: moving to HEAD~
49b50fc HEAD@{3}: commit: 3
76aaebb (HEAD -> master) HEAD@{4}: commit: add
60bffb4 HEAD@{5}: commit (initial): test

删除文件

在文件管理器中把没用的文件删了,这个时候,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.txt
rm 'test.txt'

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

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- test.txt

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

远程仓库

1. 将本地仓库与远程仓库关联

git remote add origin git@github.com:spring-hao/git-study.git

添加后,远程库的名字就是origin。

2. 推送

git push -u origin master

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

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

3. 删除远程库

git remote -v
origin  git@github.com:michaelliao/learn-git.git (fetch)
origin  git@github.com:michaelliao/learn-git.git (push)

如果没有推送权限,就看不到push的地址。
根据名字删除

git remote rm origin

4. 克隆远程库

git clone git@github.com:michaelliao/gitskills.git

分支管理

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”。在其他分支上进行开发,完成后再将它们合并到主分支上。

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>或者git switch <name>

创建+切换分支:git checkout -b <name>或者git switch -c <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

1. 创建与合并分支

HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
详细介绍
创建dev分支,然后切换到dev分支:

$ git switch -c dev
Switched to a new branch 'dev'

git switch 命令加上-c参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git switch dev

用git branch命令查看当前分支:

$ git branch
* dev
  master

git branch命令会列出所有分支,当前分支前面会标一个*号。

在dev分支上修改提交后返回master分支,发现之前提交的内容不见了,因为刚才的操作是在dev分支,而master并没有改变.

$ git checkout master
Switched to branch 'master'

把dev分支的工作成果合并到master分支上:

$ git merge dev
Updating 4fad4f3..199e6c3
Fast-forward
 4.txt     | 0
 git-study | 1 +
 2 files changed, 1 insertion(+)
 create mode 100644 4.txt
 create mode 160000 git-study

合并完成后,就可以放心地删除dev分支了:

$ git branch -d dev
Deleted branch dev (was b17d20e)

2. 工作方式

git工作流

Q.E.D.