Git教程-git是一种对修改的操作

作者: 鲁智深 分类: linux 发布时间: 2018-01-19 22:06

Git是目前世界上最先进的分布式版本控制系统

安装

1
sudo apt-get install git

安装成功后,运行如下命令

1
git

安装完成后,还需要最后一步设置,在命令行输入:

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

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

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

远程仓库

Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。首先找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。可以自己搭建这台服务器,也可以使用GitHub网站

本地创建ssh key

先看一下是否有ssh key 如果没有,就自行百度一下安装openssh-server,一般linux下的系统都是默认有ssh

1
ps ajx|grep ssh #查看ssh的进程

本地Git仓库和GitHub仓库之间的传输是通过SSH加密的

创建项目的SSH Key

1
ssh-keygen -t rsa -C "youremail@example.com"

创建完成后,在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人

登录github注册或登录账号,打开“settings”的“SSH Keys”页面,然后,点“New SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你就应该看到已经添加的Key

创建远程库

登陆GitHub

在右上角找到“new repository”按钮,创建一个新的仓库

从远程库克隆

将github上的项目,克隆到本地一份

1
2
3
git clone git@github.com:账号名/项目名.git
git remote #查看远程库信息
git remote -v #查看详细信息

与远程库交互

将项目提交到远程库github

1
2
3
4
5
6
7
8
9
git init #初始化空的Git仓库
git add * #添加到暂存区
git commit -m '1.0' #添加到master分支
git show 查看最近一次提交的记录 #commit记录

#github操作
#在github上面新键项目
git remote add origin git@github.com:luzhisheng/xxx.git #命令管理一组跟踪的存储库
git push -u origin master#将master分支的内容上传到github

远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

-u 本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,以后就只需要用,如下进行提交。

1
git push origin master

报错问题

agent refused operation

agent refused operation

1
2
eval "$(ssh-agent -s)"
ssh-add

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上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。

本地仓库

创建空目录

1
2
mkdir test7
cd test7

目录结构图如下:

init0

init0


在目录下创建本地仓库

1
git init

创建成功后,目录结构如下图:

init1

init1

版本库就是一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”

git版块管理思维图

工作区和版本库

工作区和版本库

本地仓库分为三部分:工作区,暂存区,仓库区,其中暂存区、仓库区是版本库部分

工作区与暂存区

使用IDE打开目录,创建项目,将文件添加到暂存区

1
2
git add 文件1 文件2 ...
git add 目录

使用暂存区的内容恢复工作区的内容

1
git checkout -- 文件名

查看暂存区的状态

1
git status

将暂存区的记录添加到仓库区

1
2
3
4
git commit -m '本次提交的说明信息'
[master 1868b23] 本次提交的说明信息
1 file changed, 2 insertions(+) #1个文件已更改,2个插入(+)
create mode 100644 readme.txt #创建模式100644 readme.txt

查看仓库区的历史

1
2
3
4
当前版本的历史版本:git log
q 退出log
简版显示:git log --pretty=oneline
历史命令:git reflog

在Git中,用HEAD表示当前版本,也就是最新的提交3628164…882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

查看修改内容

1
2
3
git diff HEAD -- 文件名 #对比工作区和仓库区中某版本某文件的不同
git diff 文件名 #是工作区(work dict)和暂存区(stage)的比较
git diff --cached 文件名 #是暂存区(stage)和分支(master)的比较

撤消修改

git会提示:

1、add之前的话,使用 “git checkout — <文件>…” 丢弃工作区的改动

1
git checkout -- 文件

2、add之后,commit之前
使用 “git reset HEAD <文件>…” 以取消暂存
使用 “git checkout — <文件>…” 丢弃工作区的改动

1
2
git reset HEAD 文件
git checkout -- 文件

第1、2种情况,建议都直接用第2种方式,一次性解决

3、add之后,commit之后

回退历史版本到暂存区

1
2
3
git reset HEAD^#上一个版本
git reset HEAD^^#上上的版本
git reset HEAD~100#指定第100个版本

回到某个版本

1
2
git reflog #查看版本
git reset --hard 版本号

删除文件

从版本库中删除

1
2
3
rm 文件名
git rm 文件名
git commit -m '删除说明信息'

删除了文件,版本库文件没有删除,可以恢复文件

1
git checkout -- test.txt

分支

分支存在的意义,假如你在开发一个新的功能是,我不能写一点代码提交一次代码,这样会影响污染环境代码,如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。所有分支就出现了,我可以创建一个分支,我在分支上面干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git branch #有多少个分支并且查看当前分支
git log --graph #查看分支路线图
git checkout -b develop #创建并切换到develop分支

-----
#在分支里面可以编写你的代码
-----
#编写完成代码提交到当前分支
git add 文件名
git commit -m "add 说明"

-----
git checkout master #切换回master分支
git merge develop   #将develop分支合并到master
git branch -d 分支名称   #删除分支

主分支master和dev分支都修改,合并冲突怎么办?

1
2
3
4
5
cat 文件 #查看文件,有提示信息
vim 文件 #修改文件
git add 文件
git commit -m "说明"
成功

查看分支合并情况

1
git log --graph --pretty=oneline --abbrev-commit#查看日志

* d3478e7 add rc cc
|\
| * 042be06 add rc
* | 8091717 add cc
|/
* f356751 branch dev test
* 83101bd add test.txt

推荐工作方法:

分支合并信息,最正确的做法,重要:工作中一定要这么干!禁用fast forward合并模式(fast forward合并就看不出来曾经做过合并),如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit。我们用加参数的git log 就可以查看到分支合并信息

禁用fast forward 后git log

禁用fast forward 后git log

1
2
3
4
5
6
git checkout -b 分支名称
vim 文件
git add 文件
git commit -m "说明"
git checkout master #切换分支
git merge --no-ff -m "说明信息" dev #--no-ff参数,表示禁用Fast forward

再次用git log 加参数的形式看日志

1
git log --graph --pretty=oneline --abbrev-commit

* 7748fd0 merge with no-ff #合并说明描述
|\
| * 8702335 fast #分支说明描述
|/
* d3478e7 add rc cc
* f356751 branch dev test
* 83101bd add test.txt
* 7893f7a pjl

工作中git log 图

工作中git log 图

暂时存储内容

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

1
2
git stash #当前分支
git stash pop #删除暂时存储内容,并恢复暂存区

可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:

1
git stash apply stash@{0}

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

1
git branch -D 分支名称

标签

标签作用: 在开发的一些关键时期,使用标签来记录这些关键时刻, 例如发布版本, 有重大修改, 升级的时候, 会使用标签记录这些时刻, 来永久标记项目中的关键历史时刻;

1
2
3
4
5
6
7
git branch
git checkout master
Switched to branch 'master'

#默认标签是打在最新的commit上面
git tag v1.0
git tag

如果我们忘了打标签,比如我前天我刚发布一个重大的变革,而忘记记录的这个时刻,那就可以找到commit id去打标签。

1
2
3
4
git log --pretty=oneline --abbrev-commit#查看历史commit记录
git tag  <tagname> 6224937
git tag #查看历史标签
git show <tagname>#查看指定版本信息

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

1
2
git tag -a <tagname> -m "版本说明信息" 3628164
git show <tagname> #能看到指定版本的信息

如果打错标签就删除

1
git tag -d <tagname>

如果要推送某个标签到远程,使用命令

1
git push origin <tagname>

或者,一次性推送全部尚未推送到远程的本地标签:

1
git push origin --tags

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

1
git tag -d v0.9

然后,从远程删除。删除命令也是push,但是格式如下:

1
git push origin :refs/tags/v0.9

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

3条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注