Lanms Blog

gitflow分支管理模型
Publish: 2019/3/22   

http://www.berlinix.com/it/gitflow.php

http://www.berlinix.com/it/gitflow.php

http://www.berlinix.com/it/git.php

http://www.berlinix.com/it/git.php

gitflow分支管理模型

gitflow的分支类型:

从右看起:

-—————————-

Git(the stupid content tracker)是一个源自Linux内核项目的源码管理工具。和传统的CVS、SVN不同,git是一个分布式源码管理工具。

Git命令 简单说明
git init 初始化一个本地的代码仓库。
git clone 从远程复制一个代码仓库。
git config git选项设置。
git add 添加文件/目录。
git commit 提交修改。
git status 显示工作目录的状态以及缓冲区内的快照。
git log 已提交快照的日志。
git branch 创建分支。
git checkout 迁出/拉出/切换到一个分支。
git merge 合并分支。
git revert 撤销commit快照。
git reset 撤销本地工作目录的修改。
git clean 删除代码仓库以外的文件。
git remote 管理远程git。
git fetch 从远程获取分支。
git pull 从远程获取分支。
git push 把代码推到远程分支。

基本概念

文件状态

Git仓库中的文件有几种状态:

Git暂存区(Staged Area)的意思是:你把一个文件托付给Git跟踪(git add),然后又修改了它,此时这个文件就位于暂存区了。暂存区内的文件几乎只做一件事:等待你执行git commit,把它提交。

快照(snapshot)

Git与其他版本控制系统的区别在于:Git只关心文件是否变化,而不关心文件内容的变化。大多数版本控制系统都会忠实地记录版本间的文件差异(diff),但Git不关心这些具体差异(哪一行有什么变动),Git只关心哪些文件修改了哪些没有修改,修改了的文件直接复制形成新的blob(这就是所谓的快照snapshot)。当你需要切换到或拉出一个分支时,Git就直接加载当时的文件快照即可,这就是Git快的原因。说起来,这也是用空间换取时间的经典案例。

从这个角度看,Git更像是一个小型文件系统,并在这个系统上提供一系列的工具来辅助开发。

Git的地理观

Git是一个分布式的版本控制系统,因此没有所谓的中心。粗略来看Git可分为本地库(local repository)和远程库(remote repository),细致地看可分为以下几个部分:

命令 说明
基础操作
git init 初始化git仓库
git add X 添加X文件/路径到git仓库
git commit -m “COMMENTS” 提交更新
分支管理
git branch X 创建一个名为X的分支
git checkout X 切换到X分支
git merge X 自动合并X分支
git branch -d X 删除X分支,需要先merge
git branch -D X 强制删除X分支,忽略其修改,无须先merge
与远程git交互
git remote show 显示远程git仓库
git remote show X 显示远程git一个名为X的仓库
git push origin master 更新提交到GitHub

Git日常问题

撤销commit

刚与master合并并提交后就后悔了现在要做的是撤销commit(revoke/undo merge/commit)。

查看当前所在分支:

  $ git branch
    bs3
  * coin
    dev
    master

查看日志:

  $ git log --oneline
  9b7ba39 merged with master
  73a66e8 update FAQ

用以下2个命令来撤销提交(把COMMIT_SHA替换为实际的SHA值;把HEAD~N中的N替换为一个数字,表示回退几步):

  $ git reset --hard COMMIT_SHA
  $ git reset --hard HEAD~N

例如回退到合并前:

  $ git reset --hard 73a66e8
  HEAD is now at 73a66e8 update FAQ

回退后发现不对,因为现在这个commit还是在master中的(在merge之前master已经走的太远),赶紧再次reset到merge时的状态:

  $ git reset --hard 9b7ba39
  HEAD is now at 9b7ba39 merged with master

如此一来就是就是merge后commit之前的状态。接下来就是要完成undo merge(已经undo commit了):

  $ git revert -m 1 9b7ba39

这下就彻底回到merge前了,以防万一再次检查:

  $ git diff --name-status master..coin

看起来没什么问题了,检查下日志:

  $ git log --oneline
  2691516 Revert "merged with master"
  9b7ba39 merged with master
  73a66e8 update FAQ

用git找回已删除文件

首先找到与目标文件相关的最后一次commit。如果目标文件没有出现在HEAD commit中,那么在这次commit时,文件就被删除了:

  $ git rev-list -n 1 HEAD -- htdocs/myfile.php
  1e8182f58dc038c8e6bc2025e8430f463d372030

接下来就是恢复工作了:

  $ git checkout 1e8182f58dc038c8e6bc2025e8430f463d372030^ -- htdocs/myfile.php

合并分支的部分文件

有时候只想合并分支里的部分文件,而不是整个分支,可以用这个命令:

  git checkout BRANCH FILE ...

例如,从test_branch分支中合并file_modified文件:

  $ git checkout test_branch file_modified

参考Git Tip: How to “Merge” Specific Files from Another Branch



← Linux常用命令 Tox代码检视集成测试 →

Powered by Hexo, Theme designs by @hpcslag.
Style-Framework Tocas-UI designs by @yamioldmel