git 教程

部分素材来源网络

git 教程_第1张图片

1、软件版本的起点:A

  需求总是在不断更新的。

  上一次产品经理需求0.1的软件版本刚刚完成后,这不又来了新的版本需求0.2,这次一共两个功能点。幸好我们有Git,让并行开发成为可能。拉取Develop分支准备开干!

2、开发的起点:B

  两名工程师,两个不同的需求,大师甲和大师乙各自领取一个功能点开干;从Develop拉取属于自己的分支,有单独的分支就不会被干扰:)

3、开发的终点:H

  一周不到,两位大师就已经完成了属于自己的功能;从图上看,都有两次代码的提交。大师们各自开发的功能初步看似乎没有啥问题,但是我们的App版本是一个多功能的集合,是否合在一起也会没有问题?这时候大师们把属于自己的分支合入Develop,并删掉自己的工作Branche。编译,运行,Success!

4、预发行的起点:Release 0.2 节点(I)

  大师们的能力果然与众不同,合入后没有一点问题,达到提交测试部的标准。新建Release 0.2 分支,代表一个里程碑式的事件。

5、Release 分支Bug宿命

  世上没有哪个大师的代码是没有Bug的,大师甲和大师乙也不例外。这不,测试部刚拿到预发行的版本就曝出了2个Bug。

  不过没有关系,能够复现的Bug对于我们来说就不是Bug。从Release 0.2拉取Bug修复分支。修好了,继续合进Release 0.2。谁叫Release就是这样的宿命呢。

6、版本发行的终点: M

  但愿人长久,Bug不再有。

  经过大师们艰苦卓绝的bug修复,终于通过了测试部的测试,也得到了产品经理们的认可,准备提交App Store审核。

  Release合入Master分支,打上Tag 0.2,这就是这次的MileStone了。

  当然也得记得Release合入Develop,之前这么多的bug也得在Develop上修复修复不是。做好了这些,Release就可以删啦。

7、救火队员一般的HotFix: N

  好事多磨!AppStore刚发出去的App, 就有用户反馈Crash! 大师甲和大师乙临危受命!

  从Master拉取HotFix分支来搞定它。原来是数组越界!分分钟搞定。完成后合入Master,版本更新为Tag 0.3,代表我们修复了重大问题。编译,运行,没问题,提交App Store等审核。

  噢,one more thing, HotFix 也要合入Develop,又多了一个功能点(bug修复)不是。

8、新的轮回开始:P

  1-> 7就是一个版本的开发过程中,我们的Git Flow流。到了最后,P和O节点拥有了相同的内容,就像在一开始的A和B那样。

  这时候,我看见产品经理又拿着版本需求1.0向我走来......

>>Master  : 主分支;主要是稳定的版本分支,正式发布的版本都从Master拉。

>>Develop : 开发分支;更新和变动最频繁的分支,正常情况下开发都是在Develop分支上进行的。

>>Release : 预发行分支;一般来说,代表一个版本的功能全部开发完成后递交测试,测试出Bug后进行修复的分支。

>>Features: 功能分支; 其实Features不是一个分支,而是一个分支文件夹。里面包含了每个程序员开发的功能点。Feature开发完成后合入Develop分支。

>>HotFix  : 最希望不会被创建的分支;这个分支的存在是在已经正式上线的版本中,发现了重大Bug进行修复的分支。

HEAD     最近一次 commit

HEAD^    上次提交

HEAD~100 上一百次提交

 

命令

释义

扩展

简述

git config --global -e

可将简写添加到配置文件

 

初始操作

ssh-keygen -t rsa -C "[email protected]"

创建SSH Key

 

git clone origin [email protected]:lenqieshanren/PG-GIT.git

克隆远程仓库

 

git remote add origin [email protected]:lenqieshanren/PG-GIT.git

将远程仓库和本地关联

 

git init

初始化一个 git 仓库

git init xxx: 

    -> 会在 xxx 文件夹下生成 .git

git status

查看仓库状态

-s : 返回变更的文件名及其代码:{

  A:本地新增的文件

  C:文件的一个拷贝

  D:本地删除

  M:内容修改

  R:文件名变更

  T:文件类型变更

  U:文件尚未合并,需合并后提交

  X:未知类型

  ?:未被 git 进行管理,可以使用 add 命令添加,详见 git add

}

基本流程

git add [.|-u|-a]

添加到暂存区

.    :所有

-u  :仅仅将已经被 add 过的文件提交到暂存区 (-update)

-A  :是前两个参数的集合 (-all)

git commit -m "本次提交的信息"

将文件提交到本地仓库中

 

git push -u origin master

 

-u : 由于仓库是空的,我们第一次提交推送 master 分支,加上此参数,不但将本地master分支推送到远程master分支,还会把本地master分支和远程master分支关联,在以后推送和拉取就会简化命令,只需要 git push origin master 即可

 

-f : 若文件不重要可以强推,也可以先更新:

  git pull --rebase origin master

git branch

查看本地分支

-a: 查看远程分支

分支切换与合并

 

git push origin --delete <分支名>

删除远程分支

 

git branch -d <分支名>

删除本地分支

 

git checkout develop

 

git checkout -b develop origin/develop

 

 

git checkout {-- }

切换到 develop 分支

 

在本地创建develop分支切换到develop分支并且检出远程develop分支

 

丢弃工作区的修改

 

 

 

 

 

 

--  : 丢弃工作区的修改(-- 和 需要丢弃的文件之间一定要空格,回到最后一次 add 的状态,前提未执行 add 操作,其原理就是拿暂存区中的代码覆盖工作区代码)

git merge develop

将develop分支合并到当前分支

 

git rebase -i HEAD~2

 

git rebase master

: 合并提交 --- 2标识合并两个

: 合并分支, 如果有冲突解决冲突 --> 执行 

git add xxx

git rebase --continue 

无需执行 git commit

如果没有冲突, push 即可

rebase 黄金法则:

1.绝不在公共分支上使用, 有没有其他人在这个分支上工作?

 

git log 

查看提交历史

 

示例:

  git log -p master ..origin/master // 比较本地 master 和远程 master 的区别

-p : 查看历史记录以来哪几行被修改

-2 : 查看最近2次的提交

--oneline : 查看历史记录单行显示

--author=“xxxx” : 根据提交作者搜索,字符串或者正则

--grep=“xxxx" : 搜索提交历史,字符串或者正则

--pretty=oneline : 更清楚的单行显示

git log --graph --decorate --pretty=oneline --abbrev-commit —all

: 图形化显示

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit : 更清楚的图形化显示

git log --pretty=format:'%s %C(bold blue)(%an)%Creset' --abbrev-commit : 打印提交 message 和 author

 

git reflog

 

 

git diff  

查看文件在工作目录与暂存区的差别

git diff : 比较和另外的分支的区别

git diff --cached : 暂存区(add 尚未 commit)和 git 仓库最新一次commit提交的差异

git diff --cached : 暂存区和指定git仓库版本的差异

git diff : 工作目录同 git 仓库指定 commit 的差异

git diff : git 仓库任意两次 commit 的差异

 

git reset --[hard | soft] HEAD^

 

 

 

 

 

 

git reset HEAD

 

 

版本回退

 

 

 

 

 

 

指定文件回退到最近一次commit

 

--mixed: 不加参数默认, 保留工作目录, 并清空暂存区

--hard :彻底退回某个版本,本地源码变为上一个版本的内容,撤销 commit 中所包含的更改

--soft : 回退到某个版本,只回退 commit 信息,不会 index file 一级,如果还要提交直接 commit 即可

 

 

实用:

撤回过去 3 个 commit, 然后新建一个新的 commit

---------------------------

git reset HEAD~3

git add .

git commit -m "合并提交"

git push --force

 

git rm -r --cached

 

 

 

--------------------------

git rm --cached

--------------------------

git rm

删除文件

 

 

 

 

--------------------------

仅删除加入缓存区的文件(add)

--------------------------

当我们需要删除暂存区或者分支上的文件, 同时本地也不需要这个文件了

删除远程仓库文件,不删除本地文件,之后 git commit, git push 远程分支, 然后 git status 可以看到对应的文件未被 git 管理(untracked file)

-f : 删除缓存区和本地文件

--------------------------

 

 

--------------------------

commit->push

在执行之后的下一次commit会删除远程仓库,谨记!

git clean

从工作空间中删除所有没有tracked过的文件

 

 

 

 

?: git reset --hard 和 git clean -f 是一对好基友, 结合使用, 可以让工作目录回退到最近一次commit 的时候 

-n : 提示那些文件会被删除, 不会删除文件

-f : 删除当前目录下所有没有被 tracked 过的文件, 它不会删除.gitignore 文件中指定的文件夹和文件, 不管这些有没有被 track 过

-f : 删除指定的路径下的没有被 track 过的文件

-xf : 删除所有, 不管它有没有在 .gitignore 中指定

 

git fetch origin

远程获取最新版本到本地,不会merge(合并)

git fetch origin master //从远程的origin的master主分支上获取最新版本到origin/master分支上

git log -p master.. origin/master//比较本地的master分支和origin/master分支的区别

git merge origin/master //合并

============或者============>

git fetch origin master:test // 从远程仓库获取最新在本地建立 test 分支

git diff test // 将当前分支和 test 进行对比

git merge test // 合并 test 到当前分支

----------------------------------------

git pull: 相当于 先 git fetch origin 后 git merge , 两步操作

更新

git pull origin master

从远程直接更新, 会自动 merge

 

 

 

 

 

 

 

 

------------------------

实际使用中 fetch 比较好

git stash

git stash save

git stash pop

 

git stash apply

git stash apply stash@{1}

//指定对应stash

git stash list

 

git stash chear

git stash drop +名称

git stash show

 

 

git stash branch

:备份当前工作区内容

 

:读取最近的一次备份并删除

:读取堆栈中的内容应用到当前目录但是不会删除

 

:显示git栈内所有备份

情况git栈

:清除堆栈中所有内容

:清楚指定名称的stash

:查看堆栈中最新保存的stash和当前目录的差异

:从最新的stash创建分支, 解决stash中的内容和当前目录的内容发生冲突的场景

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Git)