目录
一、git的特点
- 版本控制:可以解决多人同时开发的代码问题,也可以解决找回历史代码的问题。
- 分布式:git是分布式版本控制系统,同一个git仓库,可以分布到不同的机器上。首先找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个"服务器"仓库克降一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。可以自已搭建这台服务器,也可以使用GitHub网站。
二、git本地仓库
安装git:
sudo apt-get install git
使用 cd 命令进入工作目录。
1 初始化空的git版本仓库( .git/ 目录)
git init
之后就可以使用git来管理你的代码啦。
注:使用 .gitignore 文件,可忽略目录中不想管理的文件。
2 版本创建
编辑完文件后,把修改文件添加到暂存区:
git add <文件>
创建版本:
git commit -m '版本信息'
3 查看版本记录
git log
该指令会在下方依次按行显示版本序列号、作者、日期、版本信息。
例如:
commit 5855feb528d94fb1e1c894904351e8d7ad76a6cc #版本序列号
Author: username <email> #作者
Date: Fri Nov 10 08:00:00 2020+0800 #日期
版本1 #版本信息
若要以简短形式显示版本记录,添加如下参数:
git log --pretty=oneline
可查看分支图:
git log --graph --pretty=oneline
4 查看操作记录
git reflog
5 版本回退
后一个版本记录了相对于前一个版本做了哪些修改,故后一个版本依赖于前一个版本。
HEAD可以看成一个指向当前版本的一个指针,HEAD表示当前最新版本。
版本回退有两种表示方式:
- HEAD^表示当前版本的前一个版本;HEAD^^表示当前版本的前两个版本。
- HEAD~1表示当前版本的前一个版本,HEAD~10表示当前版本的前十个版本。
git reset --hard HEAD^ #回退到前一个版本
git reset --hard HEAD~n #回退到前n个版本
回退到之前版本后,后面的版本并不会被删除,可使用版本号恢复到后面的版本。版本序列号可以使用以下命令查看。
git log #查看版本记录
git reflog #查看之前的操作记录,包含更新版本的序列号
恢复后面的版本(需要版本号):
git reset --hard <版本号>
6 工作区与暂存区与版本库
- 编辑文件的目录即是工作区,但是目录中的隐藏目录 .git/ 是版本库,而非工作区。
- 版本库里包含了暂存区,第一个分支master,指向master的指针HEAD等。
如上图所示,把文件往git版本库里添加分两步:
1、把工作区中文件的修改添加到暂存区:
git add <文件>
2、把暂存区内容一次性提交到当前分支:
git commit -m '版本信息'
查看当前工作树状态:
git status
此命令可查看工作区有无修改,git会提醒你有无文件需要从工作区提交至暂存区。
注意,在管理修改时,
- git只会提交暂存区的修改来创建版本。
- 因此,提交版本之前先使用 git add 将文件添加到暂存区。
7 撤销修改
1、撤销工作区改动(丢弃工作区的修改)。
git checkout -- <文件>
2、已经将不合适的修改添加至暂存区:进行暂存区撤销(撤销暂存区的修改,重新放回工作区)后进行工作区撤销。
git reset HEAD <文件> #暂存区撤销
git checkout -- <文件> #工作区撤销
3、已经将不合适的修改提交至版本库:进行版本库撤销(版本回退)后进行暂存区撤销再进行工作区撤销。
git reset --hard <版本号> #版本回退
git reset HEAD <文件> #暂存区撤销
git checkout -- <文件> #工作区撤销
8 对比文件不同
对比同一文件在工作区中与在当前版本库中的不同:
git diff HEAD -- code.txt #code.txt是想要比较的文件
若输出以下内容:
diff --git a/code.txt b/code.txt
index 66f9219..324317f100644
--- a/code.txt
+++ b/code.txt
@@ -2,3 +2,4 @@ this is the first line
this is the second line
this is the third line
this is the forth line
+the new line
其中,
- “-”标注代表此内容是a版本(HEAD当前版本)中此文件多出的内容;
- “+”标注代表此内容是b(工作区)中此文件多出的内容。
因此,输出内容说明工作区中的code.txt文件比当前版本库中code.txt文件多了一行: the new line 。
对比同一文件在两个版本之间的不同:
git diff HEAD HEAD^ -- code.txt #code.txt是想要比较的文件
若输出内容如下:
diff --git a/code.txt b/code.txt
index 66f9219..01e1274 100644
--- a/code.txt
+++ b/code.txt
@@ -1,4 +1,3 @@
this is the first line
this is the second line
this is the third line
-this is the forth line
输出内容的判断方法同上:
- “-”标注代表此内容是a版本(HEAD版本,命令中第一个列出的版本)中多出的内容;
- “+”标注代表此内容b版本(HEAD^版本,命令中第二个列出的版本)中多出的内容。
9 删除文件
编辑、删除文件都是对工作区的改动。
修改后查看工作区与版本库不同:
git status
撤销修改:
git checkout -- <文件>
将删除某文件的修改存入暂存区:
git rm <文件>
提交到版本库:
git commit -m '版本内容'
注意:若删除的文件未添加到暂存区,则无法跟踪此文件。
三、git分支
一般:
- master分支:用于保存发布的项目代码;
- dev分支:用于保存开发过程中的代码;
- 各分支相互独立,我们将分支的交汇称为分支的合并。
刚开始,指针HEAD指向指针master,master指向最新的提交:
此时,创建新分支dev,则只是新增一个dev指针,指针HEAD指向指针dev,dev指向master相同的提交,因此git创建分支的速度非常快(fast forward策略)。
此后 ,对工作区的修改与提交仅针对dev分支,master指针不变:
把master指向dev当前提交即可合并:
之后可以删除dev分支,相当于删除这个dev指针,删除后分支图上不再有dev分支的记录。
1 分支基础命令
快速合并:直接把master指向dev的当前提交,所以合并速度非常快。
查看分支:
git branch
创建新分支并切换:
git checkout -b <分支名>
创建分支:
git branch <分支名>
切换分支:
git checkout <分支名>
把dev分支合并到master主分支,使用快速合并(fast-forward)策略,即直接将HEAD与master指针指向dev的当前提交:
git merge dev
删除分支:
git branch -d <分支名>
2 解决分支冲突
在两个分支上对同一文件做出了不同的修改提交,此时无法快速合并,git会尝试将各自的修改合并起来,这种合并可能产生冲突。此时需要手动修改冲突的文件。
查看冲突的文件:
git status
手动修改冲突的文件后提交:
git add <文件>
git commit -m '版本信息'
可查看分支图:
git log --graph --pretty=oneline
解决分支冲突的分支示意图如下:
解决冲突后可以删除不需要的分支。
3 git分支管理策略
若两个分支的不同修改是关于不同文件的,则合并时会使用recursive策略而非fast forward策略。
recursive策略,此策略在合并后会进行一次新的提交,将各自的不同的文件合并在一个版本中。
也可手动禁止以fast forward策略合并,这样git会帮你做一次提交。
git merge --no-ff -m '版本信息'
总结:
- fast forward策略:直接把master指向dev的当前提交,不会有新的提交信息,这是默认的合并策略;
- recursive策略:会再进行一次新的提交。
4 修复bug的临时分支
需要紧急修复一个bug,但在dev分支上进行的工作还未完成,不能提交。
使用stash功能,储存工作现场,之后可恢复现场继续工作:
git stash
接着可去修复Bug。
在需要修复Bug的分支上创建临时分支,修复Bug,做一次提交:
git checkout -b <分支名>
git add <文件>
git commit -m '版本信息'
回到master分支并完成合并(禁用fast forward策略):
注意:
禁用ff策略以保留修复bug的这次提交信息,否则后续若删除此临时分支则分支图上不会有记录。
git merge --no-ff -m '版本信息'
删除修复Bug分支,回到dev分支,列出保存的工作现场:
git stash list
回到工作现场:
git stash pop
四、github远程仓库
1 添加ssh账户
1、编辑 .gitconfig 文件,修改邮箱为注册github的邮箱,填写用户名。
注:使用 git log 命令时输出的用户名与邮箱就是从这里来的。
2、生成ssh密钥:
ssh-keygen -t rsa -C "email" #-t后面结加密方式;-C后面接邮箱地址
3、进入生成的 .ssh/ 目录,里面有公钥 id_rsa.pub 与私钥 id_rsa 。
4、将公钥内容复制到github账户的"SSH keys"界面即可。
2 克隆项目
git clone <clone with SSH>
3 推送代码
git push origin 本地分支名称 #origin代表远程服务器
4 跟踪远程
git braneh --set-upstream-to-origin/远程分支名称 本地分支名称
注意:跟踪远程后,
1、可以显示本地分支与远程分支的差异:
git status
2、推送代码到远程可直接使用:
git push
5 拉取代码
git pull origin 远程分支名称