git笔记

Git简介

Git是一个分布式版本控制系统。

SVN/CVS是集中式版本控制系统。


分布式版本控制系统中,每个人的电脑都是一个完整的版本库,改动的时候只要互相推送改动的部分就可以了。(版本分开存储)(安全,高效,对网络没什么要求)

而集中式版本控制系统的完整版本库只有中央服务器才有,用户在使用时要先从中央服务器中调取更新的版本,更改后还要提交到中央服务器中,对网络有一定的要求。(版本只存储在中央服务器中)(安全性较低,使用不便,要求网络)

Git安装

Linux中安装git

Debain或者是Ubuntu中安装:

Sudo apt-get install git

Windows中安装

在git官网中下载安装

https://git-for-windows.github.io/

git官网下载可能有点卡

https://pan.baidu.com/s/1kU5OCOB#list/path=%2Fpub%2Fgit


git安装好后会有git bash、git CMD和git GUI三个项目。


安装好后,我们还要设置user.name和user.email

$ git config --global user.name "Your Name"

$ git config --global user.email "[email protected]"

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。


在Windows中的使用git

创建版本库

Git init创建版本库

通过git init命令将目录变为git版本仓库。

运行git init命令之后,目录中会出现.git目录。这是git的索引管理目录,最好不要修改。

(版本库目录路径保持英文路径名)

把文件添加到版本库

所有的版本控制系统,只能跟踪文本文件的改动,如txt文件、网页、程序代码等。二进制文件如图片、视频、word等文件是不能被跟踪的。

(windows中使用git后千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft记事本在保存UTF-8编码的文件时,在每个文件开头添加了0xefbbbf(十六进制)的字符,这会产生很多问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等。可以下载Notepad++代替记事本,把Notepad++的默认编码设置为UTF-8 without BOM即可)


Git add 添加版本

使用git add命令把文件添加到仓库:

Git add readme.txt

Git commit –m ‘xxx’备注改动情况

git commit -m "wrote a readme file"

备注改动情况

$ git add file1.txt

$ git add file2.txt file3.txt

$ git commit -m "add 3 files."


Git status查看状态:

 wKioL1jzHc-js4FgAABZElvfBNI413.png

Git diff xxx查看未提交的修改

 wKiom1jzHeaRji02AAApgkpK1Aw469.png

$ git diff readme.txt 

diff --git a/readme.txt b/readme.txt

index 46d49bf..9247db6 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.

Git log查看每次改了什么

 wKiom1jzHf7QVjL1AAA07JnkXsQ961.png

Git log命令显示从最近到最远的提交日志。

如果嫌输出信息太多,可以加上—-pretty=oneline

 wKioL1jzHhaj39y6AAAeLZDY9ak063.png

$ git log --pretty=oneline

3628164fb26d48395383f8f31179f24e0882e1e0 append GPL

ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed

cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

这一串字符就是git唯一的id。Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。


Git reset命令:回退版本

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

$ git reset --hard HEAD^

HEAD is now at ea34578 add distributed

如果我们不想退回这个,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个commit id,就可以指定回到刚刚被退回的某个版本:

$ git reset --hard 3628164

HEAD is now at 3628164 append GPL

版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

  wKioL1jzHjXROPIxAAAXHLoeg5o575.jpgwKioL1jzHj7gW1h3AAAX4KF19FQ413.jpg


Git reflog 记录每一次命令

 wKiom1jzHlez6Es9AAAhnnCTgos277.png


Git中的工作区和缓存区

工作区:

Git工作区就是我们操作所在的git目录。

版本库:

工作区中有一个隐藏目录.git,这是git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

 wKiom1jzHmnR9I2TAABBV6R-i7c080.jpg

Git管理的是修改。Git add命令将工作区中修改提交到暂存区中,git commit命令将暂存区中的修改提交到版本库中。Git完整的过程有两步。

Git checkout –- file丢弃工作区的修改

Git checkout –readme.txt

将这个文件回到最近一次git commit或git add时的状态。


Git中删除文件

方法有二:

(1) 直接在工作区中删除,然后git commit提交到版本库。

(2) 用git rm xx,然后git commit 提交到版本库


Git reset HEAD file将暂存区中的修改撤销,重新放回工作区。

远程仓库

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "[email protected]"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上Title,在Key文本框里粘贴id_rsa.pub文件的内容:

 wKioL1jzHoCQHx9_AABN88vuHsQ216.png

点“Add Key”,你就应该看到已经添加的Key:(key输入进去github会进行检测,要注意下key是否匹配)

 wKiom1jzHpXRCHP1AAAtNbShlnY677.png

GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

在GitHub上免费托管的Git仓库,任何人都可以看到(但只有你自己才能改)。所以,不要把敏感信息放进去。

如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。

添加远程库

先在服务端上创建一个库create a new repo

然后再本地与远程做关联:

Git remote add origin https://github/xiaoqin00/test


在本地需要提交到远程服务器上的时候就shiyong

Git push命令

Git push –u origin master  (-u只是第一次push的时候使用,第一次使用后,本地和远程的master分支关联了起来,以后下载或者是推送的时候就可以直接使用git push和git pull了)





Git remote查看远程库

Git remote –v显示详细信息

Git remote –rm xxx删除远程库

从远程库克隆:

可以通过https协议或者是ssh协议从远程哭克隆,

命令就是:

Git clone xxxx(链接)

创建和合并分支

Git log –-graph查看合并分支图

Git branch xxx创建分支

Git checkout xxx切换分支

Git checkout –b xxx创建并切换分支

Git checkout –d xxx删除分支

Git合并分支:

Git merge xxx合并指定分支到当前分支

Git合并分支时,默认是使用fast forward模式,即合并后删除分支,这会丢失分支信息。

禁用fast forward后,git会在合并时生成一个新的commit,这样,我们就可以看到完整的版本合并历史。

Git merge xxx –no-ff  禁用fast forward。

Git分支如果存在冲突,比如两个分支在某些地方不一样,那就需要我们手动解决了。

Bug分支

Git还提供了一个stash功能,可以把当前工作现场 ”隐藏起来”,等以后恢复现场后继续工作。

git stash list 查看隐藏的工作现场列表

git stash恢复:

1. git stash apply恢复,恢复后,stash内容并不删除,你需要使用命令git stash drop来删除。

2. 另一种方式是使用git stash pop,恢复的同时把stash内容也删除了。


分支策略:

首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。

开发一个新feature,最好新建一个分支;

如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。


多人合作:

1. 首先,可以试图用git push origin branch-name推送自己的修改;

2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

3. 如果合并有冲突,则解决冲突,并在本地提交;

4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。

标签

我们可以对版本库版本打上标签,以便以后阅读。

Git tag xxx创建标签

Git tag 查看所有标签

默认标签是打在最新提交的commit上的,不过也可以通过commit id来补上标签。

$ git log --pretty=oneline --abbrev-commit

6a5819e merged bug fix 101

cc17032 fix bug 101

7825a50 merge with no-ff

6224937 add merge

59bc1cb conflict fixed

400b400 & simple

75a857c AND simple

fec145a branch test

d17efd8 remove test.txt

...

Git show <tagname>查看标签信息

git tag -a <tagname> -m "blablabla..."可以指定标签信息;

git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;

git tag  -d tagname删除标签

git push origin tagname推送标签

git push origin –-tags 推送所有没推送的标签

从远程删除标签:

首先在本地删除,然后从远程删除。

Git tag –d xxx

Git push origin :/refs/tags/xxx  从服务器删除远程标签


自定义git:

Git config –global color.ui true将当前ui策略换为更醒目的ui策略

忽略特殊文件:

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore

忽略文件的原则是:

(1) 忽略操作系统自动生成的文件,比如缩略图等;

(2) 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;

(3) 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

(4) 假设你在Windows下进行Python开发,Windows会自动在有图片的目录下生成隐藏的缩略图文件,如果有自定义目录,目录下就会有Desktop.ini文件,因此你需要忽略Windows自动生成的垃圾文件:

# Windows:

Thumbs.db

ehthumbs.db

Desktop.ini

然后,继续忽略Python编译产生的.pyc、.pyo、dist等文件或目录:

# Python:

*.py[cod]

*.so

*.egg

*.egg-info

dist

build

加上你自己定义的文件,最终得到一个完整的.gitignore文件,内容如下:

# Windows:

Thumbs.db

ehthumbs.db

Desktop.ini


# Python:

*.py[cod]

*.so

*.egg

*.egg-info

dist

build


# My configurations:

db.ini

deploy_key_rsa

最后一步就是把.gitignore也提交到Git,就完成了!当然检验.gitignore的标准是git status命令是不是说working directory clean。

使用Windows的童鞋注意了,如果你在资源管理器里新建一个.gitignore文件,它会非常弱智地提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore了。

在git提交的时候一定要注意敏感文件的问题,许多敏感资料泄露和安全事件都是由于git用户将敏感资料提交到远程所导致的。

配置别名

git可以用别名来代替原本默认的参数。

git config --global alias.st status

git config –global alias.xx xxx配置别名

删除别名可以直接在配置文件中删除。


配置文件:

Git的配置文件在.git/config文件中。

--global参数是针对当前用户起作用,如果不加,那么命令只对当前文件夹起作用。


git服务器的搭建:

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000



大致流程:

1、在github上创建项目

2、使用git clone https://github.com/xxxxxxx/xxxxx.git克隆到本地

3、编辑项目

4、git add . (将改动添加到暂存区)

5、git commit -m "提交说明"

6、git push origin master 将本地更改推送到远程master分支。



参考:

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375233990231ac8cf32ef1b24887a5209f83e01cb94b000

http://www.cnblogs.com/tugenhua0707/p/4050072.html

https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A8

http://www.bootcss.com/p/git-guide/



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章