教你高逼格的玩转git

481 阅读9分钟

1.GIT简介:

GIT是一款自由和开源的分布式版本控制系统.

集中式管理:svn
分布式管理:git

在集中式下,开发者只能将代码提交到服务器,在分布式下,开发者可以本体提交
在集中式下,只有远程服务器上有代码数据库,在分布式下,每个开发者机器上都有一个代码仓库

分布式:


集中式:


2.git工作原理:

版本库(Repository):.git目录, 用于存储记录版本信息

  • 版本库中的暂缓区(staga):
  • 版本库中的分支(master): git自动创建的第一个分支
  • 版本库中的HEAD指针:用于指向当前分支

.git各目录下文件:

HEAD: 指向当前分支的一个提交 

description: 项目的描述信息 

config: 项目的配置信息 

info/: 里面有一个exclude文件,指定本项目要忽略的文件
 
objects/: Git对象库(commit/tree/blob/tag) 

refs/: 标识每个分支指向哪个提交 hooks/: 默认的hook脚本

工作区(Working Directory): 仓库文件夹里面, 除了.git目录以外的内容

git add和git commit命名作用

  • git add: 把文件修改添加到暂缓区

  • git commit: 把暂缓区的所有内容提交到当前HEAD指针指向的分支

Git使用实战:

第一步:我们已Github作为远程代码仓库,相当于公司的服务器,在Github上创建名为test项目



第二步:通过Git的Clone指令下载项目到本地


git clone "项目的URL地址"

第三步:修改文件,本地操作项目

1.查看git 命令

git指令帮助手册
git --help

2.初始化git仓库(由于创建项目的时候,勾选了Initialize this repository …所以不需要重新init,主要目的就是生成.git目录)

仓库初始化(个人仓库)
git init

仓库初始化(共享仓库,远程服务器上的仓库)
git init --bare

3.设置配置信息

1.针对单个项目

配置用户名:git config “user.name "用户名"(用于跟踪修改记录)

配置邮箱:git config “user.email "邮箱"(用于多人开发间的沟通)

git config -l : 查看配置信息
git config -e : 编辑配置信息

2.全局配置
git config --global user.name manager
git config --global user.email manager@gmail.com

4.创建修改main.c文件,可以查看文件最新改动的地方

1.查看某个文件的最新改动的地方:git diff 文件名

2.查看当前路径所有文件最新改动的地方:git diff


5.查看文件状态

1.查看某个文件的状态:git status 文件名

2.查看当前路径所有文件的状态:git status

如果文件显示为红色,就说明目前修改的文件,还未添加到.git目录的暂缓区


6.将工作区的文件保存到暂缓区

1.保存某个文件到暂缓区:git add 文件名

2.保存当前路径的所有文件到暂缓区:git add .(注意,最后是一个点 . )

经过上一步操作,在通过git status 查看状态,此时文件被修改的文件变成绿色,就说明修改的文件已经添加到暂缓区了.


7.将暂缓区的文件提交到当前分支

1.提交某个文件到分支:git commit -m ”注释” 文件名

2.保存当前路径的所有文件到分支:git commit -m ”注释”


8.删除文件

git rm "文件名"

注意点:
删除文件只是在暂缓区中删除了文件,并没有把删除的操作提交到master分支(git初始化项目的时候,默认回创建master分支)所以需要重新Commit提交

9.查看文件的修改日志

1.查看某个文件的修改日志:git log 文件名

2.查看当前路径所有文件的修改日志:git log
用一行的方式查看简单的日志信息:git log ––pretty=oneline

3.查看最近的N次修改:git log –N(N是一个整数)

结果如下:


10.提交本地仓库到远程仓库

注意点:如果是通过自己的账号在github上创建的项目,自己可以参与提交.但是别人不行.要想其他开发人员参与到自己的项目中来,必须在自己的账号中添加公钥ssh key

提交到远程仓库
git push


提交成功,打开github上的test项目,确实存在main.c文件


11.查看分支引用记录(能够查看所有的版本号)

git reflog


注意点:
1.第一个红色框,没有push到远程仓库之前,head指针指向本地master分支

2.第二个红色框,push到远程仓库之后,head指针指向origin

12.版本回退

1.回退到上一个版本:git reset --hard HEAD^

2.回退到上上一个版本:git reset --hard HEAD^^

3.回退到上N个版本:git reset --hard HEAD~N(N是一个整数)

4.回退到任意一个版本:git reset --hard 版本号(版本号用7位即可)

注意点:

1.当你使用命令行回退到某一个版本的时候,你只是把本地仓库回退到了某一版本,远程仓库并没有回退到指定的版本,此时head指针指向本地仓库master

2.要想远程仓库也回退到某一版本,需要执行以下git push --force操作(这种操作需要小心,可能会被打)


本地仓库文件:


github上远程仓库文件:


执行git push -f操作,此时本地文件与远程仓库文件保持一致了


13.版本回退另一种方式

1.git revert HEAD //撤销最近一次提交

2.git revert HEAD~1//撤销上上次的提交,注意:数字从0开始

3.git revert 0ffaacc //撤销0ffaacc这次提交

注意点:
git revert 命令意思是撤销某次提交。它会产生一个新的提交,虽然代码回退了,但是版本依然是向前的,所以,当你用revert回退,然后push到远程仓库之后,所有人pull之后,他们的代码也自动的回退了

revert 是撤销一次提交,所以后面的commit id是你需要回滚到的版本的前一次提交

使用revert HEAD是撤销最近的一次提交,如果你最近一次提交是用revert命令产生的,那么你再执行一次,就相当于撤销了上次的撤销操作,换句话说,你连续执行两次revert HEAD命令,就跟没执行是一样的

使用revert HEAD~1 表示撤销最近2次提交,这个数字是从0开始的,如果你之前撤销过产生了commi id,那么也会计算在内的。

如果使用 revert 撤销的不是最近一次提交,那么一定会有代码冲突,需要你合并代码,合并代码只需要把当前的代码全部去掉,保留之前版本的代码就可以了.

解决冲突:
1.因为我们只想回到某次提交,因此需要把当前最新的代码去掉即可,也就是HEAD标记的代码
2.解决冲突完之后,重新add commit push,然后远程服务器上的版本就跟本地的一样了

怎么让别人参与自己在github上创建的项目

1.生成SSH Key





2.添加ssh key



3.测试是否配置成功

ssh -vT git@github.com

提示 : Hi ****! You've successfully authenticated, but GitHub does not provide shell access.证明成功

注意点:
1.在生成ssh key的时候,如果提示已经存在!

2.可以通过ls -al ~/.ssh 查看公钥,私钥的目录
3.通过 cat 目录 可以查看公钥比如:cat /Users/yangtao/.ssh/id_rsa.pub

4.其他开发人员就可以通过ssh 从github clone项目到本地

git clone git@github.com:codeXiaoQiang/test.git


5.下载远程仓库的最新信息到本地仓库

git pull

6.将本地的仓库信息推送到远程仓库

git push

注意点:

提交时如果远程仓库有其它人提交的最新代码, 必须先pull, 再提交

7.冲突解决:

<<<<<<<<<<HEAD
   你本地新增代码
===============
   服务器和你冲突的代码
>>>>>>>>>>>b7d36a90cb826abc91b6b6b8531706ba4d27a06e

分支管理

1.创建分支
git branch "分支名称"

2.切换分支
git checkout "分支名称"

3.创建并切换分支
git checkout -b "分支名称"

4.合并某分支到当前分支
git merge "分支名称"

5.删除分支
git branch -d "分支名称"

注意点:
1.不能再当前分支删除自己
2.在分支修改完代码之后,需要回到分支,然后合并代码
3.分支代码合并之后,可以删除分支
4.合并分支的时候,git默认会选择Fast forward,这种模式在删除分支之后,会丢掉分支信息
5.禁止Fast forward模式:

合并分支采用:git merge --no-ff -m "合并信息" "分支名称"
分支合并之后,可以查看合并信息:git log --graph --pretty=oneline --abbrev-commit


应用场景1-Feature分支:

当你在一个feature分支上开发完成一个新项目的时候,切回到主分支准备合并的时候,产品经理突然说这个功能取消,此时你执行git branch -d "feature"会报错,那怎么删除这个分支?

解决办法:git branch -D "feature" 强行删除


应用场景2-bug 分支

当你正在dev分支上开发新功能的时候,突然要求修改一个bug,此时你想到的第一件事情就是在master分支上新建一个bug分支修复bug,但是dev上修改的代码还不能提交到master分支,那怎么把dev上修改的代码隐藏起来.解决办法通过git stash

第一步:在dev分支上执行 git stash命令,这个时候,通过git status命令查看你的工作区是干净的,之前开发的代码隐藏起来了

第二步:确定你要在哪个分支上新建bug分支,假如你要在master分支上新建bug分支

第三步:在bug分支上修改代码,修复bug

第四步:切换到master分支,合并代码

第五步:删除bug分支

第六步:切回dev分区,怎么找回之前隐藏的代码

1. git stash apply恢复
2. git stash dropl删除stash中的内容
3. git stash pop 恢复的同时删除内容
4. git stash list查看stash 内容

第七步开发完之后,切换master分支合并代码

把本地master分支push到远程库

git push

总结:

0.从远程服务器更新代码到本地
git pull

1.把文件添加到缓存区
git add .

2.从缓存区把文件添加到master分支
git commit -m "描述"

3.推送到远程服务器
git push