git 笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git 笔记相关的知识,希望对你有一定的参考价值。
1.git分布式版本管理
首先介绍下传统的集中式版本管理系统,例如svn。在集中式版本管理中,有客户端与服务端之分。以svn为例,各个开发者一般会安装svn客户端,然后从svn中央服务下载代码,在此基础上修改,添加,删除等,一般我们每次提交代码前都必须和svn中央服务同步一次,如果不同步更新,就提交那么很有可能会覆盖其他开发者提交的代码。集中式版本管理系统最大的缺点就是必须联网才能工作,如果在局域网内还好,但如果在互联网上,遇到网速慢的话,可能一次提交一批几十兆的文件就需要好几分钟或者更久,这就很难接受。
分布式版本管理系统
分布式版本管理系统没有“中央服务器”,每个开发者的电脑上都是一个完整的版本库,这样工作的时候,就不需要联网,因为版本库就在你自己的电脑上。既然每开发者电脑上都有一个完整的版本库,那各个开发者如何协作?例如你在自己电脑上改file1,其他开发者也在他的电脑上改file1,这时候你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改。分布式版本管理系统相对集中式版本管理系统安全性要高很多,如果集中是管理系统的中央服务器宕机之后大家都没法工作,但是分布式版本管理系统即使中央服务器宕机,各个开发者照样能工作,因为各开发者本地电脑都有完整的版本库。
2.安装
2.1ubuntu 安装git
sudo apt-get install git
Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?有办法可查的。
2.2git 设置名字和Email地址
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
3.创建版本库
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。所以,创建一个版本库非常简单
第一步,选择一个合适的地方,创建一个空目录:
$ mkdir learngit
$ cd learngit
$ pwd
/home/users/learngit
第二步,通过git init
命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in /home/users/learngit/.git/
ls -alh 当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。
第三步,创建新文件
$ touch file.c
注意,新建的文件 file.c 一定要放到learngit
目录下(子目录也行),因为这是一个Git仓库,放到其他地方Git找不到这个文件。通过第四,五步向git仓库中添加文件
第四步,用命令git add
告诉Git,把文件添加到仓库:
$ git add file.c
第五步,用命令git commit
告诉Git,把文件提交到仓库:
$ git commit -m "wrote a file。"
[master (root-commit) eaadf4e] wrote a file
1 file changed, 2 insertions(+)
create mode 100644 file.c
git commit
命令执行成功后会告诉你,1 file changed
:1个文件被改动(我们新添加的file.c文件);2 insertions
:插入了两行内容(file.c有两行内容)。
4.常用操作
4.1查看状态
我们修改file.c文件
$ vim file.c
$ ls
file.c
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: file.c
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
$ git diff
diff --git a/file.c b/file.c
index e69de29..da4c016 100644
--- a/file.c
+++ b/file.c
@@ -0,0 +1,2 @@
+fafafa
+
4.2版本回退
第一步,git log 查看记录,注意commit 后面类似002ea77...
的是commit id
(版本号),和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。为什么commit id
需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:
$ git log
commit 002ea77c16e8799db1f6796a93eec5b9b4dd741d (HEAD -> master)
Author: xiansw <530728983@qq.com>
Date: Sat Dec 7 15:56:19 2019 +0800
hahaha
commit 268f236b3b5e4238b170eb24aa391a76516acba9
Author: xiansw <530728983@qq.com>
Date: Sat Dec 7 15:55:15 2019 +0800
change fafaf
commit 52947ebbdde212cbdba9534c58998b03bbc551d5
Author: xiansw@knownsec.com <ksuser@ubuntu-18.04-7.9-x8664>
Date: Sat Dec 7 15:48:46 2019 +0800
add file.c
另外,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数:
$ git log --pretty=
email full medium raw
format: fuller oneline short
$ git log --pretty=oneline
002ea77c16e8799db1f6796a93eec5b9b4dd741d (HEAD -> master) hahaha
268f236b3b5e4238b170eb24aa391a76516acba9 change fafaf
52947ebbdde212cbdba9534c58998b03bbc551d5 add file.c
第二步,git reset
Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交002ea77...
,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。现在,我们要把当前版本hahaha回退到上一个版本change fafaf
,就可以使用git reset
命令:
$ git reset --hard HEAD^
HEAD 现在位于 268f236 change fafaf
注意 git reset 要慎用啊,它会清除,远程分支,本地仓库,暂存区,本地目录到某个指定的版本
$ git reset --hard 268f236b3b5e4238b170eb24aa391a76516acba9
指定回退到某个版本(HEAD^ 与 commit id相似)。
那么当你回退到某个版本,之后又后悔,想恢复到新版本怎么办?找不到新版本的commit id
怎么办?在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^
回退到change fafaf版本时,再想恢复到hahaha,就必须找到hahaha 的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:
$ git reflog
268f236 (HEAD -> master) HEAD@2: reset: moving to HEAD^
002ea77 HEAD@3: commit: hahaha
268f236 (HEAD -> master) HEAD@4: commit: change fafaf
52947eb HEAD@5: commit (initial): add file.c
回到 hahaha
git reset 002ea77
示意图
┌────┐
│HEAD
└────┘
│
│
| ○ hahaha
│ │
└──> ○ fafaf
│
○ add file.c
HEAD有点像指针
4.3工作区和暂存区
工作区(Working Directory):就是你在电脑里能看到的目录,比如learngit
文件夹就是一个工作区。
版本库(Repository):工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
git add
把文件添加进去,实际上就是把文件修改添加到暂存区(stage);git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
4.4 管理修改
在工作区中操作都称为修改,用git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别
4.4 撤销修改
git checkout file
可以丢弃工作区的修改
$ vim file.c
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: file.c
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
$ git checkout -- file.c
$ git status
位于分支 master
无文件要提交,干净的工作区
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
4.5删除文件
用命令git rm
删掉,并且git commit
$ touch filedel.c
$ git add filedel.c
$ git commit -m "add filedel.c"
[master 86cb7bb] add filedel.c
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 filedel.c
ksuser@ubuntu-18:~/Work/learntest$ git rm filedel.c
rm filedel.c
$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
删除: filedel.c
$ ls
file.c
$ git commit -m "delete filedel.c"
[master 0c18dd7] delete filedel.c
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 filedel.c
5.远程仓库
5.1添加远程库
第一步:登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
在Repository name填入learngit
,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
第二步,在GitHub上的这个learngit
仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
$ git remote add origin https://github.com/jin-long/learngit.git
$ git push -u origin master
Username for https://github.com: jin-long
Password for https://jin-long@github.com:
对象计数中: 9, 完成.
Delta compression using up to 8 threads.
压缩对象中: 100% (3/3), 完成.
写入对象中: 100% (9/9), 639 bytes | 213.00 KiB/s, 完成.
Total 9 (delta 0), reused 0 (delta 0)
To https://github.com/jin-long/learngit.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
5.2从远程库克隆
#方式一:
$ git clone git@github.com:jin-long/learngit.git
#方式二:
$ git clone https://github.com/jin-long/learngit.git
方式一,方式二都是可以的,但是使用https
除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh
协议而只能用https
。
下一篇文章 《git 笔记(二)》
以上是关于git 笔记的主要内容,如果未能解决你的问题,请参考以下文章