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

序言:目前,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^^  # 删除最后两次次提交的版本,也就是回退到最后倒数第三次版本
.... 其他的依次类推

强推到某个分支

git push origin 分支名 --force

or
git push -f origin 分支名

clone命令

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容