Git 命令及版本管理详细使用

Java基础

浏览数:188

2019-11-2

序言:目前,Git是比较流行的版本管理系统。相比于SVN,我更偏爱Git! 本文将详细介绍使用Git的一些心得。

什么是Git?

Git是一种分布式版本控制系统(DVCS),也称为分散式。每个开发人员都拥有存储库的完整副本,该存储库位于云中(远程仓库)。

安装Git

本人使用的是Mac,终端自带Git工具

  • Mac:通过Homebrew安装
# 安装homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# 安装Git
brew install git
  • Linux
sudo apt-get update
sudo apt-get install git

使用Git

创建本地存储库

git init

开发

  • 执行完git init后本地仓库已初始化完成。ls -a可以查看到.git的隐藏文件

更新仓库内容

创建文件并修改内容
# 创建一个README文件
touch READEM.md
# 写入一些内容到READEM.md
echo 'hello,world' >> READEM.md
# 打印READEM.md文件内容
cat READEM.md

创建文件

查看仓库状态
git status
# 或者 git status -s

查看仓库状态

将变更的文件纳入版本管理
git add .
# . 是将所有的文件递归纳入版本管理,若单个添加git add READEM.md 即可

纳入版本管理

将纳入版本管理的文件提交到本地仓库
git commit -m 'first commit'

提交

查看日志
git log  # 命令是查看全部提交日志  
git log -2  # 查看最近2次的提交日志  
git log -p  # 查看历史纪录以来哪几行被修改  
git log --stat --summary # 查看每个版本变动的档案和行数 

查看日志

日志的样式略微难看,这里给大家推荐一个配置

# 给git log起一个别名:git lg
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(red)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

# 更改之后
git lg  # 命令是查看全部提交日志  
....

查看日志

分支

创建分支
git branch dev1

Git创建分支时,它只是创建一个带有该分支名称的指针,该指针指向已创建分支的commit

切换到dev1分支进行开发
git checkout dev1

创建分支和切换到dev1分支

接下来的所有操作都在dev1分支上,我们仍然来更新仓库的文件内容

touch dev1.txt
echo 'this is text file' >> dev1.txt
# 查看状态
git status -s
# 纳入版本控制
git add .
# 提交
git commit -m 'create a dev1 text file'
# 查看日志
git lg 

进行开发

合并分支

假设,这条分支的任务已完成,我们切换到主线master上去

git checkout master

此时,我们再查看日志,并没有刚刚提交的’create a dev1 text file’。原因是:之前所有的操作都在dev1分支上执行,现在切回到master分支自然没有刚刚的日志记录。在实际项目开发中写了不就没有意义了吗?** 所有我们要将dev1分支与master合并!**

git merge dev1

合并分支

合并问题

合并之后再次查看日志,你会发现并没有存在dev1分支的存在,与我们相像的并不一致,这是为何?
原因:这是因为Git使用快进模式(fast-forward)合并了分支。这里需要注意git给我们打印的输出信息,如上图所示:master和dev1是共同的祖先!
** 在我们合并分支时,不推荐使用fast-forward模式!可以通过–no-ff(无快进模式)命令来处理**

# 新建分支dev2重复dev1的操作,再次合并
git merge --no-ff dev2

合并分支


合并分支

通过这种方式来合并分支,可以完美的显示分支的生命迹象!

删除分支

假设分支合并完成,此分支已没有作用,我们应该移除此分支,以后可再次创建命名为dev1分支

git branch -d dev1

合并冲突

下面模拟一下合并冲突问题!

  • 在master分支上更新仓库并提交
# master分支更新仓库并提交
echo 'this is a test log' >> README.md
git status -s
git add .
git commit -m 'readme file change content'

# master分支更新仓库并提交
echo 'this is two' >> README.md
git status -s
git add .
git commit -m 'readme file change content two'

# 切换到dev2分支,更新仓库并提交
git checkout dev2
echo 'this is dev2 change' >> README.md
git status -s
git add .
git commit -m 'readme file change content dev2 change'

# 再次切换到master分支,更新仓库并提交
git checkout master
echo 'this is three' >> README.md
git status -s
git add .
git commit -m 'readme file change content three'

# 做完上述工作,接下来合并
合并
git merge dev2

合并分支

很显然,合并失败!此时,两个分支的版本存在冲突,Git已经不知道怎么做了。** 在master更新仓库并提交之后版本已经改变,master已不是上次上传的版本,而dev2分支还是从上一次合并的HEAD开始;所以这时是无法合并的。而Git所做的事情是:指出存在这些内容不兼容的部分。**

  • 接着,我们看一下仓库状态:git status

状态

  • 进入README文件(vi README.md)查看更新的内容,会发现多出了<<<<<<<HEAD、========、>>>>>>>>dev2,这里有两个部分:

    • 第一部分:在<<<<<<< HEAD和=======之间,是master分支更新的内容;
    • 第二部分:在=======和>>>>>>> dev2之间,是dev2分支更新的内容;

      readme文件

  • 解决办法

    • 使用HEAD-master版本
    • 使用dev2版本
    • 两个版本的组合
  1. 使用HEAD-master版本
# 将master分支提交的信息保留,去掉dev2分支的内容,并且去掉<<<<<<<HEAD、========、>>>>>>>>dev2
# 保存如下:
this is a test log
this is two
this is three

# esc退出编辑模式,快捷键shift + :  再输入wq,回车即可,保存并退出
# 查看状态
git status -s

** 在一开始合并时,查看仓库状态README文件还是Unmerge 状态,在git status -s下是红色的:UU README.md;而现在是AA README.md **


readme文件

git add .
git commit -m 'save HEAD version, remove dev2 version'
# 这里虽然使用了HEAD版本,但是保存了dev2分支的生命迹象
# 合并完成,删除dev2分支
git branch -d dev2
  1. 使用dev2版本
# 与第一种解决办法同理
  1. 两个版本的组合
# 两个版本组合就是两者都保留,所以只需要去掉<<<<<<<HEAD、========、>>>>>>>>dev2即可
# esc退出编辑模式,快捷键shift + :  再输入wq,回车即可,保存并退出
git add .
git commit

版本合并完之后如下:

readme文件

版本回退(删除)

  • 命令
git reset --hard <版本号>  # 回退到对应的版本号,这里的版本号就是日志前面的7个字符
git reset --hard -HEAD^   # 删除最后一次提交的版本,也就是回退到最后倒数第二次版本
git reset --hard -HEAD~   # 删除最后一次提交的版本,也就是回退到最后倒数第二次版本
git reset --hard -HEAD^^  # 删除最后两次次提交的版本,也就是回退到最后倒数第三次版本
.... 其他的依次类推

clone命令

在码云或者Github上要克隆别人的代码,需要用到clone命令

git clone <仓库地址:url/ssh>  # 如下图所示

[图片上传失败…(image-b0ef86-1550730346214)]

作者:JasonDev